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/.gitreview b/.gitreview
index 9344401..663037e 100644
--- a/.gitreview
+++ b/.gitreview
@@ -2,4 +2,4 @@
 host=gerrit-review.googlesource.com
 scheme=https
 project=gerrit.git
-defaultbranch=stable-2.15
+defaultbranch=stable-2.16
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/BUILD b/BUILD
index fee80fc..907441e 100644
--- a/BUILD
+++ b/BUILD
@@ -1,7 +1,21 @@
+package(default_visibility = ["//visibility:public"])
+
 load("//tools/bzl:genrule2.bzl", "genrule2")
 load("//tools/bzl:pkg_war.bzl", "pkg_war")
 
-package(default_visibility = ["//visibility:public"])
+config_setting(
+    name = "java9",
+    values = {
+        "java_toolchain": "@bazel_tools//tools/jdk:toolchain_java9",
+    },
+)
+
+config_setting(
+    name = "java_next",
+    values = {
+        "java_toolchain": "@bazel_tools//tools/jdk:toolchain_vanilla",
+    },
+)
 
 genrule(
     name = "gen_version",
@@ -18,7 +32,10 @@
     cmd = "cp $< $@",
 )
 
-pkg_war(name = "gerrit")
+pkg_war(
+    name = "gerrit",
+    ui = "polygerrit",
+)
 
 pkg_war(
     name = "headless",
@@ -43,15 +60,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 +76,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 7ee7b83..27a39f4 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]
@@ -142,40 +142,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..f6248c6 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]
@@ -28,6 +28,10 @@
 -p::
 	Name of the project the intended change is contained within.  This
 	option must be supplied before Change-Id in order to take effect.
+	Please note that the project specified must be active.
+
+	If omitted, the impacted changes can be from different projects and
+	the current user needs to be authorized to set reviewers to all of them.
 
 --add::
 -a::
@@ -56,32 +60,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..1ab67d8 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
@@ -112,7 +112,8 @@
 
 submitter:: link:json.html#account[account attribute]
 
-newRev:: The resulting revision of the merge.
+newRev:: The state (revision) of the target branch after the operation that
+closed the change was completed.
 
 eventCreatedOn:: Time in seconds since the UNIX epoch when this event was
 created.
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..e642425 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
@@ -276,7 +275,7 @@
 To identify SSH keys in the REST API Gerrit uses
 link:rest-api-accounts.html#ssh-key-id[sequence numbers per account].
 This is why the order of the keys in the `authorized_keys` file is
-used to determines the sequence numbers of the keys (the sequence
+used to determine the sequence numbers of the keys (the sequence
 numbers start at 1).
 
 To keep the sequence numbers intact when a key is deleted, a
@@ -287,15 +286,22 @@
 [[external-ids]]
 == External IDs
 
-External IDs are used to link external identities, such as an LDAP
-account or an OAUTH identity, to an account in Gerrit.
+External IDs are used to link identities, such as the username and email
+addresses, and external identies such as an LDAP account or an OAUTH
+identity, to an account in Gerrit.
 
 External IDs are stored as Git Notes in the `All-Users` repository. The
 name of the notes branch is `refs/meta/external-ids`.
 
-As note key the SHA1 of the external ID key is used. This ensures that
-an external ID is used only once (e.g. an external ID can never be
-assigned to multiple accounts at a point in time).
+As note key the SHA1 of the external ID key is used, for example the key
+for the external ID `username:jdoe` is `e0b751ae90ef039f320e097d7d212f490e933706`.
+This ensures that 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:
 
@@ -306,14 +312,14 @@
   password = bcrypt:4:LCbmSBDivK/hhGVQMfkDpA==:XcWn0pKYSVU/UJgOvhidkEtmqCp6oKB7
 ----
 
-The config file has one `externalId` section. The external ID key which
-consists of scheme and ID in the format '<scheme>:<id>' is used as
+The config file has one `externalId` section. The external ID key, which
+consists of scheme and ID in the format '<scheme>:<id>', is used as
 subsection name.
 
-The `accountId` field is mandatory, the `email` and `password` fields
+The `accountId` field is mandatory. The `email` and `password` fields
 are optional.
 
-The external IDs are maintained by Gerrit, this means users are not
+The external IDs are maintained by Gerrit. This means users are not
 allowed to manually edit their external IDs. Only users with the
 link:access-control.html#capability_accessDatabase[Access Database]
 global capability can push updates to the `refs/meta/external-ids`
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 f219e48..72831bb 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::
 +
@@ -2207,6 +2276,12 @@
 used to create the NoteDb will show in the resulting exception message in case
 the value differs.
 
+[[gerrit.ui]]gerrit.ui::
++
+Configure which UI is the default. Valid values are `polygerrit` and `gwt`.
++
+Defaults to `polygerrit`.
+
 [[gitweb]]
 === Section gitweb
 
@@ -2747,16 +2822,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 +2903,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
@@ -3017,11 +3148,25 @@
 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.supportAnonymous]]ldap.supportAnonymous::
++
+If false, Gerrit will provide credentials only at connection open, this is
+required for some `LDAP` implementations that do not allow anonymous bind
+for StartTLS or for reauthentication.
++
+By default, true.
+
 [[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.
 
@@ -3379,12 +3524,6 @@
 +
 Defaults to true.
 
-[[log.rotate]]log.rotate::
-+
-If set to true, log files are rotated daily at midnight (GMT).
-+
-Defaults to true.
-
 [[log.compress]]log.compress::
 +
 If set to true, log files are compressed at server startup and then daily at 11pm
@@ -3392,6 +3531,12 @@
 +
 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
 
@@ -3440,25 +3585,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
@@ -3555,6 +3681,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
@@ -3604,6 +3741,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
@@ -3724,7 +3875,6 @@
 If no keys are specified, web-of-trust checks are disabled. This is the
 default behavior.
 
-
 [[repository]]
 === Section repository
 
@@ -3770,15 +3920,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::
 +
@@ -3786,6 +3940,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
 
@@ -3854,6 +4042,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
 
@@ -4121,6 +4318,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
 
@@ -4469,6 +4677,8 @@
 programmatic configuration.
 +
 By default, `true`.
++
+This value supports link:#reloadConfig[configuration reloads].
 
 [[sshd.rekeyBytesLimit]]sshd.rekeyBytesLimit::
 +
@@ -4496,6 +4706,8 @@
 The maximum numbers of reviewers suggested.
 +
 By default 10.
++
+This value supports link:#reloadConfig[configuration reloads].
 
 [[suggest.from]]suggest.from::
 +
@@ -4510,7 +4722,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.
 +
@@ -4518,7 +4730,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.
 +
@@ -4526,53 +4738,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.
 
@@ -4682,9 +4893,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]
@@ -4694,8 +4904,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.
@@ -4709,34 +4919,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
@@ -4842,7 +5034,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. Hours must be zero-padded, i.e. `06:00` rather than `6:00`.
+
+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`
@@ -4883,21 +5158,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.
-
 === Configurable Parameters
 
 site_path::
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 91c7abb..7d46e26 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
 
@@ -214,6 +215,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.
@@ -230,6 +236,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.
@@ -242,6 +256,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 653f976b..f2c7965 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 e29519d..2bc356a 100644
--- a/Documentation/dev-bazel.txt
+++ b/Documentation/dev-bazel.txt
@@ -1,23 +1,105 @@
 = 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|11|...
+* Python 2 or 3
+* Node.js
+* link:https://www.bazel.io/versions/master/docs/install.html[Bazel]
+* Maven
+* zip, unzip
+* gcc
 
-Alternatively use Bazelisk to use the latest supported Bazel version on
-different stable branches: https://github.com/bazelbuild/bazelisk.
+[[java]]
+=== Java
+
+[[java-10]]
+==== 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 and newer, specify vanilla java toolchain and
+provide the path to JDK home:
+
+```
+  $ bazel build \
+    --define=ABSOLUTE_JAVABASE=<path-to-java-10> \
+    --host_javabase=@bazel_tools//tools/jdk:absolute_javabase \
+    --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla \
+    --java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla \
+    :release
+```
+
+To run the tests, `--javabase` option must be passed as well, because
+bazel test runs the test using the target javabase:
+
+```
+  $ bazel test \
+    --define=ABSOLUTE_JAVABASE=<path-to-java-10> \
+    --javabase=@bazel_tools//tools/jdk:absolute_javabase \
+    --host_javabase=@bazel_tools//tools/jdk:absolute_javabase \
+    --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla \
+    --java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla \
+    //...
+```
+
+To avoid passing all those options on every Bazel build invocation,
+they could be added to ~/.bazelrc resource file:
+
+```
+$ cat << EOF > ~/.bazelrc
+> build --define=ABSOLUTE_JAVABASE=<path-to-java-10>
+> build --javabase=@bazel_tools//tools/jdk:absolute_javabase
+> build --host_javabase=@bazel_tools//tools/jdk:absolute_javabase
+> build --host_java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla
+> build --java_toolchain=@bazel_tools//tools/jdk:toolchain_vanilla
+> EOF
+```
+
+Now, invoking Bazel with just `bazel build :release` would include
+all those options.
+
+Note that the follow option must be added to `container.javaOptions`
+in `$gerrit_site/etc/gerrit.config` to run Gerrit with Java 10|11|...:
+
+```
+[container]
+  javaOptions = --add-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED
+```
+
+[[java-9]]
+==== 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 follow option must be added to `container.javaOptions`
+in `$gerrit_site/etc/gerrit.config` to run Gerrit with Java 9:
+
+```
+[container]
+  javaOptions = --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
@@ -51,7 +133,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
@@ -200,13 +283,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
@@ -397,6 +480,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`.
+
+
 
 [[RBE]]
 == Google Remote Build Support
diff --git a/Documentation/dev-contributing.txt b/Documentation/dev-contributing.txt
index a820fc8..e79a802 100644
--- a/Documentation/dev-contributing.txt
+++ b/Documentation/dev-contributing.txt
@@ -373,6 +373,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 397cd1b..e5c1e36 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 f4ccb9d..974e370 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -106,6 +106,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
 
@@ -407,6 +425,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.
@@ -479,6 +501,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
 
@@ -749,7 +780,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() {
@@ -762,7 +793,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);
     }
   }
 ----
@@ -774,10 +805,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]
 ----
@@ -790,7 +823,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;
@@ -804,7 +861,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;
   }
 }
 ----
@@ -812,7 +875,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:
 
@@ -2233,7 +2296,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]
@@ -2289,6 +2352,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
 
@@ -2500,7 +2573,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`.
 
@@ -2700,10 +2773,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;
   }
@@ -2725,6 +2798,111 @@
   @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);
   }
 }
 ----
@@ -2763,6 +2941,19 @@
   DynamicSet.bind(binder(), SshExecuteCommandInterceptor.class).to(SshExecuteCommandInterceptorImpl.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
deleted file mode 100644
index 7898ae9..0000000
--- a/Documentation/dev-polygerrit.txt
+++ /dev/null
@@ -1,37 +0,0 @@
-= 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 disable GWT but not PolyGerrit:
-----
-[gerrit]
-        enableGwtUi = false
-        enablePolyGerrit = true
-----
-
-To enable GWT but not PolyGerrit:
-----
-[gerrit]
-        enableGwtUi = true
-        enablePolyGerrit = false
-----
-
-To switch to the PolyGerrit UI you have to add `?polygerrit=1` in the URL.
-
-for example https://gerrit.example.org/?polygerrit=1
-
-To disable PolyGerrit UI, change 1 to 0, which will take you back to GWT UI.
-
-
-More information can be found in the link:https://gerrit.googlesource.com/gerrit/+/master/polygerrit-ui/[README]
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 52237194..ca33ef8 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,16 +246,16 @@
 [[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-$version` to `refs/for/stable-$version` and
+get them merged.
+
 * Create a change updating the `defaultbranch` field in the `.gitreview`
 to match the branch name created.
 
-* Push the commits done on `stable-2.5` to `refs/for/stable-2.5` and
-get them merged
-
 
 [[push-tag]]
 ==== Push the Release Tag
@@ -274,13 +263,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
 ----
 
 
@@ -317,11 +306,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.
 
@@ -330,15 +319,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]]
@@ -379,6 +368,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..0b67950
--- /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 f72ffc7..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,8 +119,8 @@
 *Disadvantages*
 
 * May require substantial downtime; takes about twice as long as an
-  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.)
+  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]]
 ==== Trial mode
@@ -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..c0d7854
--- /dev/null
+++ b/Documentation/pg-plugin-endpoints.txt
@@ -0,0 +1,148 @@
+= 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.
+
+=== banner
+The `banner` extension point is located at the top of all pages. The purpose
+is to allow plugins to show outage information and important announcements to
+all users.
+
+=== 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 539ec27..9fa21ff 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
 +
@@ -71,9 +80,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 590b534..8247212 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
@@ -1766,6 +1772,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
 
@@ -1982,89 +2134,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
 
@@ -2166,7 +2235,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[
@@ -2306,6 +2378,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 4434c2e..a7367f3 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\}]/messages/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\}]/messages/link:#change-message-id[\{change-message-id\}]' +
+'POST /changes/link:#change-id[\{change-id\}]/messages/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/messages/aaee04dcb46bafc8be24d8aa70b3b1beb7df5780 HTTP/1.0
+----
+
+To provide a reason for the deletion, use a POST request:
+
+.Request
+----
+  POST /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/messages/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
@@ -2476,30 +2572,30 @@
 
   )]}'
   {
-    "commit":{
-      "parents":[
+    "commit": {
+      "parents": [
         {
-          "commit":"1eee2c9d8f352483781e772f35dc586a69ff5646",
+          "commit": "1eee2c9d8f352483781e772f35dc586a69ff5646",
         }
       ],
-      "author":{
-        "name":"Shawn O. Pearce",
-        "email":"sop@google.com",
-        "date":"2012-04-24 18:08:08.000000000",
-        "tz":-420
+      "author": {
+        "name": "Shawn O. Pearce",
+        "email": "sop@google.com",
+        "date": "2012-04-24 18:08:08.000000000",
+        "tz": -420
        },
-       "committer":{
-         "name":"Shawn O. Pearce",
-         "email":"sop@google.com",
-         "date":"2012-04-24 18:08:08.000000000",
-         "tz":-420
+       "committer": {
+         "name": "Shawn O. Pearce",
+         "email": "sop@google.com",
+         "date": "2012-04-24 18:08:08.000000000",
+         "tz": -420
        },
-       "subject":"Use an EventBus to manage star icons",
-       "message":"Use an EventBus to manage star icons\n\nImage widgets that need to ..."
+       "subject": "Use an EventBus to manage star icons",
+       "message": "Use an EventBus to manage star icons\n\nImage widgets that need to ..."
     },
-    "base_patch_set_number":1,
-    "base_revision":"c35558e0925e6985c91f3a16921537d5e572b7a3",
-    "ref":"refs/users/01/1000001/edit-76482/1"
+    "base_patch_set_number": 1,
+    "base_revision": "c35558e0925e6985c91f3a16921537d5e572b7a3",
+    "ref": "refs/users/01/1000001/edit-76482/1"
   }
 ----
 
@@ -2687,7 +2783,7 @@
 
   )]}'
   {
-  "web_links":[
+  "web_links": [
     {
       "show_on_side_by_side_diff_view": true,
       "name": "side-by-side preview diff",
@@ -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
 ----
@@ -4712,30 +4806,30 @@
 
     )]}'
     {
-      "commit":{
-        "parents":[
+      "commit": {
+        "parents": [
           {
-            "commit":"1eee2c9d8f352483781e772f35dc586a69ff5646",
+            "commit": "1eee2c9d8f352483781e772f35dc586a69ff5646",
           }
         ],
-        "author":{
-          "name":"John Doe",
-          "email":"john.doe@example.com",
-          "date":"2013-05-07 15:21:27.000000000",
-          "tz":120
+        "author": {
+          "name": "John Doe",
+          "email": "john.doe@example.com",
+          "date": "2013-05-07 15:21:27.000000000",
+          "tz": 120
          },
-         "committer":{
-           "name":"Jane Doe",
-           "email":"jane.doe@example.com",
-           "date":"2013-05-07 15:35:43.000000000",
-           "tz":120
+         "committer": {
+           "name": "Jane Doe",
+           "email": "jane.doe@example.com",
+           "date": "2013-05-07 15:35:43.000000000",
+           "tz": 120
          },
-         "subject":"Implement feature X",
-         "message":"Implement feature X\n\nWith this feature ..."
+         "subject": "Implement feature X",
+         "message": "Implement feature X\n\nWith this feature ..."
       },
-      "base_patch_set_number":1,
-      "base_revision":"674ac754f91e64a0efb8087e59a176484bd534d1"
-      "ref":"refs/users/01/1000001/edit-42622/1"
+      "base_patch_set_number": 1,
+      "base_revision": "674ac754f91e64a0efb8087e59a176484bd534d1"
+      "ref": "refs/users/01/1000001/edit-42622/1"
     }
 ----
 
@@ -5220,6 +5314,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.
@@ -5235,8 +5332,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
 ----
@@ -5361,18 +5458,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
 ----
@@ -5402,8 +5498,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
@@ -5412,6 +5508,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.
@@ -5670,7 +5774,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].
@@ -5688,6 +5793,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. +
@@ -5778,7 +5886,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|
@@ -5823,6 +5935,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.
@@ -5830,7 +5959,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.
@@ -5846,7 +5975,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]]
@@ -5949,13 +6087,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]]
@@ -6004,6 +6151,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.
@@ -6237,10 +6398,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`          ||
@@ -6469,7 +6634,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.
@@ -6639,6 +6807,25 @@
 oldest. Empty if there are no related changes.
 |===========================
 
+
+[[requirement]]
+=== Requirement
+The `Requirement` entity contains information about a requirement relative to a change.
+
+[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.
@@ -6656,12 +6843,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
@@ -6723,12 +6918,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. +
@@ -6841,7 +7035,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..5006b6d 100644
--- a/Documentation/rest-api-projects.txt
+++ b/Documentation/rest-api-projects.txt
@@ -288,11 +288,11 @@
     },
     "child-project": {
       "id": "child-project",
-      "parent":"parent-project"
+      "parent": "parent-project"
     },
     "parent-project": {
       "id": "parent-project",
-      "parent":"All-Projects"
+      "parent": "All-Projects"
     }
   }
 ----
@@ -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": {}
   }
@@ -1164,14 +1271,14 @@
   Content-Type: application/json; charset=UTF-8
 
   {
-    "add":{
-      "refs/heads/*":{
-        "permissions":{
-          "read":{
-            "rules":{
+    "add": {
+      "refs/heads/*": {
+        "permissions": {
+          "read": {
+            "rules": {
               "global:Anonymous-Users": {
-                "action":"DENY",
-                "force":false
+                "action": "DENY",
+                "force": false
               }
             }
           }
@@ -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 da891ea..a76dac6 100644
--- a/README.md
+++ b/README.md
@@ -49,13 +49,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 26e5909..50fb14c 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -1,9 +1,11 @@
 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")
 load("//plugins:external_plugin_deps.bzl", "external_plugin_deps")
+load("//tools:nongoogle.bzl", "declare_nongoogle_deps")
 
 http_archive(
     name = "bazel_toolchains",
@@ -59,8 +61,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")
@@ -70,13 +72,54 @@
 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_bazel_skylib = True,
     omit_javax_inject = True,
 )
 
+# Golang support for PolyGerrit local dev server.
+http_archive(
+    name = "io_bazel_rules_go",
+    sha256 = "f04d2373bcaf8aa09bccb08a98a57e721306c8f6043a2a0ee610fd6853dcde3d",
+    urls = [
+        "https://storage.googleapis.com/bazel-mirror/github.com/bazelbuild/rules_go/releases/download/0.18.6/rules_go-0.18.6.tar.gz",
+        "https://github.com/bazelbuild/rules_go/releases/download/0.18.6/rules_go-0.18.6.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(
@@ -104,24 +147,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(
@@ -138,8 +181,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"
@@ -208,6 +251,26 @@
     sha1 = "94ad16d728b374d65bd897625f3fbb3da223a2b6",
 )
 
+FLOGGER_VERS = "0.4"
+
+maven_jar(
+    name = "flogger",
+    artifact = "com.google.flogger:flogger:" + FLOGGER_VERS,
+    sha1 = "9c8863dcc913b56291c0c88e6d4ca9715b43df98",
+)
+
+maven_jar(
+    name = "flogger-log4j-backend",
+    artifact = "com.google.flogger:flogger-log4j-backend:" + FLOGGER_VERS,
+    sha1 = "17aa5e31daa1354187e14b6978597d630391c028",
+)
+
+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",
@@ -217,8 +280,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(
@@ -228,18 +291,6 @@
     src_sha1 = "e0b973d5cafef3d145fa80cdf032fcead1186d29",
 )
 
-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",
-)
-
 load("//lib:guava.bzl", "GUAVA_BIN_SHA1", "GUAVA_VERSION")
 
 maven_jar(
@@ -255,12 +306,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",
@@ -281,12 +326,6 @@
 )
 
 maven_jar(
-    name = "log-nop",
-    artifact = "org.slf4j:slf4j-nop:" + SLF4J_VERS,
-    sha1 = "6e211fdfb9a8723677031b95ac075ac54c879a0e",
-)
-
-maven_jar(
     name = "log-ext",
     artifact = "org.slf4j:slf4j-ext:" + SLF4J_VERS,
     sha1 = "31cdf122e000322e9efcb38913e9ab07825b17ef",
@@ -323,9 +362,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(
@@ -334,16 +373,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(
@@ -353,11 +387,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",
@@ -366,14 +408,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(
@@ -384,56 +420,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(
@@ -442,36 +619,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"
@@ -488,42 +665,38 @@
     sha1 = "ed193d86e0af90cc2342aedbe73c5d86b03fa09b",
 )
 
-maven_jar(
-    name = "tukaani-xz",
-    artifact = "org.tukaani:xz:1.4",
-    sha1 = "18a9a2ce6abf32ea1b5fd31dae5210ad93f4e5e3",
-)
+declare_nongoogle_deps()
 
-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(
@@ -583,17 +756,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(
@@ -635,13 +808,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(
@@ -652,8 +822,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(
@@ -709,8 +885,8 @@
 
 maven_jar(
     name = "junit",
-    artifact = "junit:junit:4.11",
-    sha1 = "4e031bb61df09069aeb2bffb4019e7a5034a4ee0",
+    artifact = "junit:junit:4.12",
+    sha1 = "2973d150c0dc1fefe998f834810d68f278ea58ec",
 )
 
 maven_jar(
@@ -719,18 +895,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
@@ -742,8 +936,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(
@@ -792,8 +986,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(
@@ -803,66 +997,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(
@@ -885,15 +1079,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(
@@ -967,14 +1161,24 @@
     sha1 = "ed8b772eb077a9cb50e44e90899c66a9a6c00e67",
 )
 
+maven_jar(
+    name = "javax-activation",
+    artifact = "javax.activation:activation:1.1.1",
+    sha1 = "485de3a253e23f645037828c07f1d7f1af40763a",
+)
+
 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,
 )
 
@@ -1036,8 +1240,8 @@
 bower_archive(
     name = "paper-button",
     package = "polymerelements/paper-button",
-    sha1 = "41a8fec68d93dad223ad2076d68515334b2c8d7b",
-    version = "1.0.11",
+    sha1 = "3b01774f58a8085d3c903fc5a32944b26ab7be72",
+    version = "2.0.0",
 )
 
 bower_archive(
@@ -1048,6 +1252,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",
@@ -1090,10 +1301,17 @@
 )
 
 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(
@@ -1110,6 +1328,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(
@@ -1128,9 +1360,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 9e5d87c..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.17-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 ac71e54..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/accounts/AccountIT.java
+++ /dev/null
@@ -1,2374 +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 com.google.gerrit.testutil.GerritJUnit.assertThrows;
-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));
-  }
-
-  @Test
-  public void createWithInvalidEmailAddress() throws Exception {
-    AccountInput input = new AccountInput();
-    input.username = name("test");
-    input.email = "invalid email address";
-
-    // Invalid email address should cause the creation to fail
-    BadRequestException thrown =
-        assertThrows(BadRequestException.class, () -> gApi.accounts().create(input));
-    assertThat(thrown).hasMessageThat().isEqualTo("invalid email address");
-
-    // The account should not have been created
-    assertThrows(ResourceNotFoundException.class, () -> gApi.accounts().id(input.username).get());
-  }
-
-  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 addEmailAndSetPreferred() throws Exception {
-    String email = "foo.bar@example.com";
-    EmailInput input = new EmailInput();
-    input.email = email;
-    input.noConfirmation = true;
-    input.preferred = true;
-    gApi.accounts().self().addEmail(input);
-
-    // Account is reindexed twice; once on adding the new email,
-    // and then again on setting the email preferred.
-    accountIndexedCounter.assertReindexOf(admin, 2);
-
-    String preferred = gApi.accounts().self().get().email;
-    assertThat(preferred).isEqualTo(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 deletePreferredEmail() throws Exception {
-    String previous = gApi.accounts().self().get().email;
-    String email = "foo.bar.baz@example.com";
-    EmailInput input = new EmailInput();
-    input.email = email;
-    input.noConfirmation = true;
-    input.preferred = true;
-    gApi.accounts().self().addEmail(input);
-
-    // Account is reindexed twice; once on adding the new email,
-    // and then again on setting the email preferred.
-    accountIndexedCounter.assertReindexOf(admin, 2);
-
-    // The new preferred email is set
-    assertThat(gApi.accounts().self().get().email).isEqualTo(email);
-
-    accountIndexedCounter.clear();
-    gApi.accounts().self().deleteEmail(input.email);
-
-    // Account is reindexed twice; once on removing the new email,
-    // and then again on unsetting the email preferred.
-    accountIndexedCounter.assertReindexOf(admin, 2);
-
-    resetCurrentApiUser();
-    assertThat(getEmails()).containsExactly(previous);
-    assertThat(gApi.accounts().self().get().email).isNull();
-  }
-
-  @Test
-  @Sandboxed
-  public void deleteAllEmails() throws Exception {
-    EmailInput input = new EmailInput();
-    input.email = "foo.bar@example.com";
-    input.noConfirmation = true;
-    gApi.accounts().self().addEmail(input);
-
-    resetCurrentApiUser();
-    Set<String> allEmails = getEmails();
-    assertThat(allEmails).hasSize(2);
-
-    for (String email : allEmails) {
-      gApi.accounts().self().deleteEmail(email);
-    }
-
-    resetCurrentApiUser();
-    assertThat(getEmails()).isEmpty();
-    assertThat(gApi.accounts().self().get().email).isNull();
-  }
-
-  @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");
-
-    sender.clear();
-    assertKeyMapContains(key, addGpgKey(key.getPublicKeyArmored()));
-    assertKeys(key);
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("new GPG keys have been added");
-
-    setApiUser(user);
-    exception.expect(ResourceNotFoundException.class);
-    exception.expectMessage(id);
-    gApi.accounts().self().gpgKey(id).get();
-  }
-
-  @Test
-  public void adminCannotAddGpgKeyToOtherAccount() throws Exception {
-    TestKey key = validKeyWithoutExpiration();
-    addExternalIdEmail(user, "test1@example.com");
-
-    sender.clear();
-    setApiUser(admin);
-    exception.expect(ResourceNotFoundException.class);
-    addGpgKey(user, key.getPublicKeyArmored());
-  }
-
-  @Test
-  public void reAddExistingGpgKey() throws Exception {
-    addExternalIdEmail(admin, "test5@example.com");
-    TestKey key = validKeyWithSecondUserId();
-    String id = key.getKeyIdString();
-    PGPPublicKey pk = key.getPublicKey();
-
-    sender.clear();
-    GpgKeyInfo info = addGpgKey(armor(pk)).get(id);
-    assertThat(info.userIds).hasSize(2);
-    assertIteratorSize(2, getOnlyKeyFromStore(key).getUserIDs());
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("new GPG keys have been added");
-
-    pk = PGPPublicKey.removeCertification(pk, "foo:myId");
-    sender.clear();
-    info = addGpgKey(armor(pk)).get(id);
-    assertThat(info.userIds).hasSize(1);
-    assertIteratorSize(1, getOnlyKeyFromStore(key).getUserIDs());
-    // TODO: Issue 10769: Adding an already existing key should not result in a notification email
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("new GPG keys have been added");
-  }
-
-  @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(user, 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);
-
-    sender.clear();
-    gApi.accounts().self().gpgKey(id).delete();
-    accountIndexedCounter.assertReindexOf(admin);
-    assertKeys();
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("GPG keys have been deleted");
-
-    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 initial = AccountCreator.publicKey(admin.sshKey, admin.email);
-    assertThat(key.sshPublicKey).isEqualTo(initial);
-    accountIndexedCounter.assertNoReindex();
-
-    // Add a new key
-    sender.clear();
-    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);
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("new SSH keys have been added");
-
-    // Add an existing key (the request succeeds, but the key isn't added again)
-    sender.clear();
-    gApi.accounts().self().addSshKey(initial);
-    info = gApi.accounts().self().listSshKeys();
-    assertThat(info).hasSize(2);
-    assertSequenceNumbers(info);
-    accountIndexedCounter.assertNoReindex();
-    // TODO: Issue 10769: Adding an already existing key should not result in a notification email
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("new SSH keys have been added");
-
-    // Add another new key
-    sender.clear();
-    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);
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("new SSH keys have been added");
-
-    // Delete second key
-    sender.clear();
-    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);
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("SSH keys have been deleted");
-  }
-
-  @Test
-  @UseSsh
-  public void adminCanAddOrRemoveSshKeyOnOtherAccount() throws Exception {
-    // The test account should initially have exactly one ssh key
-    List<SshKeyInfo> info = gApi.accounts().id(user.username).listSshKeys();
-    assertThat(info).hasSize(1);
-    assertSequenceNumbers(info);
-    SshKeyInfo key = info.get(0);
-    String initial = AccountCreator.publicKey(user.sshKey, user.email);
-    assertThat(key.sshPublicKey).isEqualTo(initial);
-    accountIndexedCounter.assertNoReindex();
-
-    // Add a new key
-    sender.clear();
-    String newKey = AccountCreator.publicKey(AccountCreator.genSshKey(), user.email);
-    gApi.accounts().id(user.username).addSshKey(newKey);
-    info = gApi.accounts().id(user.username).listSshKeys();
-    assertThat(info).hasSize(2);
-    assertSequenceNumbers(info);
-    accountIndexedCounter.assertReindexOf(user);
-
-    assertThat(sender.getMessages()).hasSize(1);
-    Message message = sender.getMessages().get(0);
-    assertThat(message.rcpt()).containsExactly(user.emailAddress);
-    assertThat(message.body()).contains("new SSH keys have been added");
-
-    // Delete key
-    sender.clear();
-    gApi.accounts().id(user.username).deleteSshKey(1);
-    info = gApi.accounts().id(user.username).listSshKeys();
-    assertThat(info).hasSize(1);
-    accountIndexedCounter.assertReindexOf(user);
-
-    assertThat(sender.getMessages()).hasSize(1);
-    message = sender.getMessages().get(0);
-    assertThat(message.rcpt()).containsExactly(user.emailAddress);
-    assertThat(message.body()).contains("SSH keys have been deleted");
-  }
-
-  @Test
-  @UseSsh
-  public void userCannotAddSshKeyToOtherAccount() throws Exception {
-    String newKey = AccountCreator.publicKey(AccountCreator.genSshKey(), admin.email);
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.accounts().id(admin.username).addSshKey(newKey);
-  }
-
-  @Test
-  @UseSsh
-  public void userCannotDeleteSshKeyOfOtherAccount() throws Exception {
-    setApiUser(user);
-    exception.expect(ResourceNotFoundException.class);
-    gApi.accounts().id(admin.username).deleteSshKey(0);
-  }
-
-  // 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");
-  }
-
-  @Test
-  public void userCanGenerateNewHttpPassword() throws Exception {
-    sender.clear();
-    String newPassword = gApi.accounts().self().generateHttpPassword();
-    assertThat(newPassword).isNotNull();
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was added or updated");
-  }
-
-  @Test
-  public void adminCanGenerateNewHttpPasswordForUser() throws Exception {
-    setApiUser(admin);
-    sender.clear();
-    String newPassword = gApi.accounts().id(user.username).generateHttpPassword();
-    assertThat(newPassword).isNotNull();
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was added or updated");
-  }
-
-  @Test
-  public void userCannotGenerateNewHttpPasswordForOtherUser() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.accounts().id(admin.username).generateHttpPassword();
-  }
-
-  @Test
-  public void userCannotExplicitlySetHttpPassword() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.accounts().self().setHttpPassword("my-new-password");
-  }
-
-  @Test
-  public void userCannotExplicitlySetHttpPasswordForOtherUser() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.accounts().id(admin.username).setHttpPassword("my-new-password");
-  }
-
-  @Test
-  public void userCanRemoveHttpPassword() throws Exception {
-    setApiUser(user);
-    sender.clear();
-    assertThat(gApi.accounts().self().setHttpPassword(null)).isNull();
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was deleted");
-  }
-
-  @Test
-  public void userCannotRemoveHttpPasswordForOtherUser() throws Exception {
-    setApiUser(user);
-    exception.expect(AuthException.class);
-    gApi.accounts().id(admin.username).setHttpPassword(null);
-  }
-
-  @Test
-  public void adminCanExplicitlySetHttpPasswordForUser() throws Exception {
-    setApiUser(admin);
-    String httpPassword = "new-password-for-user";
-    sender.clear();
-    assertThat(gApi.accounts().id(user.username).setHttpPassword(httpPassword))
-        .isEqualTo(httpPassword);
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was added or updated");
-  }
-
-  @Test
-  public void adminCanRemoveHttpPasswordForUser() throws Exception {
-    setApiUser(admin);
-    sender.clear();
-    assertThat(gApi.accounts().id(user.username).setHttpPassword(null)).isNull();
-    assertThat(sender.getMessages()).hasSize(1);
-    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was deleted");
-  }
-
-  @Test
-  public void cannotGenerateHttpPasswordWhenUsernameIsNotSet() throws Exception {
-    setApiUser(admin);
-    int userId = accountCreator.create().id.get();
-    assertThat(gApi.accounts().id(userId).get().username).isNull();
-    exception.expect(ResourceConflictException.class);
-    exception.expectMessage("username");
-    gApi.accounts().id(userId).generateHttpPassword();
-  }
-
-  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 {
-    return addGpgKey(admin, armored);
-  }
-
-  private Map<String, GpgKeyInfo> addGpgKey(TestAccount account, String armored) throws Exception {
-    Map<String, GpgKeyInfo> gpgKeys =
-        gApi.accounts()
-            .id(account.username)
-            .putGpgKeys(ImmutableList.of(armored), ImmutableList.<String>of());
-    accountIndexedCounter.assertReindexOf(gApi.accounts().id(account.username).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 94a82d8..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ /dev/null
@@ -1,3982 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.extensions.restapi.UnprocessableEntityException;
-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 rebaseOnNonExistingChange() throws Exception {
-    String changeId = createChange().getChangeId();
-    RebaseInput in = new RebaseInput();
-    in.base = "999999";
-    exception.expect(UnprocessableEntityException.class);
-    exception.expectMessage("Base change not found: " + in.base);
-    gApi.changes().id(changeId).rebase(in);
-  }
-
-  @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 bfc07db..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java
+++ /dev/null
@@ -1,616 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 notStickyWithCopyOnNoChangeWhenSecondParentIsUpdated() throws Exception {
-    ProjectConfig cfg = projectCache.checkedGet(project).getConfig();
-    cfg.getLabelSections().get("Code-Review").setCopyAllScoresIfNoChange(true);
-    saveProjectConfig(project, cfg);
-
-    String changeId = createChangeForMergeCommit();
-    vote(admin, changeId, 2, 1);
-    vote(user, changeId, -2, -1);
-
-    updateSecondParent(changeId);
-    ChangeInfo c = detailedChange(changeId);
-    assertVotes(c, admin, 0, 0, null);
-    assertVotes(c, user, 0, 0, null);
-  }
-
-  @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 void updateSecondParent(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 commitParent1 = testRepo.getRevWalk().parseCommit(ObjectId.fromString(parent1));
-
-    testRepo.reset(parent2);
-    PushOneCommit.Result newParent2 = createChange("new parent 2", "p2-2.txt", "content 2-2");
-
-    PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo, changeId);
-    merge.setParents(ImmutableList.of(commitParent1, newParent2.getCommit()));
-    PushOneCommit.Result result = merge.to("refs/for/master");
-    result.assertOkStatus();
-
-    assertThat(getChangeKind(changeId)).isEqualTo(REWORK);
-  }
-
-  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/CommitIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CommitIT.java
deleted file mode 100644
index 64b31dc..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/project/CommitIT.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.acceptance.api.project;
-
-import static com.google.common.truth.Truth.assertThat;
-import static java.util.stream.Collectors.toList;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-import com.google.gerrit.acceptance.NoHttpd;
-import com.google.gerrit.acceptance.PushOneCommit.Result;
-import com.google.gerrit.acceptance.TestAccount;
-import com.google.gerrit.extensions.api.changes.CherryPickInput;
-import com.google.gerrit.extensions.api.changes.IncludedInInfo;
-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.extensions.common.ChangeInfo;
-import com.google.gerrit.extensions.common.ChangeMessageInfo;
-import com.google.gerrit.extensions.common.CommitInfo;
-import com.google.gerrit.extensions.common.GitPerson;
-import com.google.gerrit.extensions.common.RevisionInfo;
-import com.google.gerrit.reviewdb.client.Branch;
-import java.util.Iterator;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.junit.Test;
-
-@NoHttpd
-public class CommitIT extends AbstractDaemonTest {
-  @Test
-  public void getCommitInfo() throws Exception {
-    Result result = createChange();
-    String commitId = result.getCommit().getId().name();
-    CommitInfo info = gApi.projects().name(project.get()).commit(commitId).get();
-    assertThat(info.commit).isEqualTo(commitId);
-    assertThat(info.parents.stream().map(c -> c.commit).collect(toList()))
-        .containsExactly(result.getCommit().getParent(0).name());
-    assertThat(info.subject).isEqualTo(result.getCommit().getShortMessage());
-    assertPerson(info.author, admin);
-    assertPerson(info.committer, admin);
-    assertThat(info.webLinks).isNull();
-  }
-
-  @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");
-  }
-
-  @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 IncludedInInfo getIncludedIn(ObjectId id) throws Exception {
-    return gApi.projects().name(project.get()).commit(id.name()).includedIn();
-  }
-
-  private static void assertPerson(GitPerson actual, TestAccount expected) {
-    assertThat(actual.email).isEqualTo(expected.email);
-    assertThat(actual.name).isEqualTo(expected.fullName);
-  }
-}
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 5ecb028..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/api/revision/RevisionIT.java
+++ /dev/null
@@ -1,1501 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 com.google.gerrit.testutil.GerritJUnit.assertThrows;
-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.keySet()).containsExactly(FILE_NAME, COMMIT_MSG);
-  }
-
-  @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 filesOnMergeCommitChangeWithInvalidParent() throws Exception {
-    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
-
-    BadRequestException thrown =
-        assertThrows(
-            BadRequestException.class,
-            () ->
-                gApi.changes()
-                    .id(r.getChangeId())
-                    .revision(r.getCommit().name())
-                    .files(3)
-                    .keySet());
-    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: 3");
-    thrown =
-        assertThrows(
-            BadRequestException.class,
-            () ->
-                gApi.changes()
-                    .id(r.getChangeId())
-                    .revision(r.getCommit().name())
-                    .files(-1)
-                    .keySet());
-    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: -1");
-  }
-
-  @Test
-  public void listFilesWithInvalidParent() throws Exception {
-    PushOneCommit.Result result1 = createChange();
-    String changeId = result1.getChangeId();
-    PushOneCommit.Result result2 = amendChange(changeId, SUBJECT, "b.txt", "b");
-    String revId2 = result2.getCommit().name();
-
-    BadRequestException thrown =
-        assertThrows(
-            BadRequestException.class,
-            () -> gApi.changes().id(changeId).revision(revId2).files(2).keySet());
-    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: 2");
-
-    thrown =
-        assertThrows(
-            BadRequestException.class,
-            () -> gApi.changes().id(changeId).revision(revId2).files(-1).keySet());
-    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: -1");
-  }
-
-  @Test
-  public void listFilesOnDifferentBases() throws Exception {
-    RevCommit initialCommit = getHead(repo());
-
-    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");
-
-    ResourceNotFoundException thrown =
-        assertThrows(
-            ResourceNotFoundException.class,
-            () -> gApi.changes().id(changeId).revision(revId3).files(initialCommit.getName()));
-    assertThat(thrown).hasMessageThat().contains(initialCommit.getName());
-
-    String invalidRev = "deadbeef";
-    thrown =
-        assertThrows(
-            ResourceNotFoundException.class,
-            () -> gApi.changes().id(changeId).revision(revId3).files(invalidRev));
-    assertThat(thrown).hasMessageThat().contains(invalidRev);
-  }
-
-  @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 f07673b..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/AbstractPushForReview.java
+++ /dev/null
@@ -1,2266 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.extensions.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-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.events.CommitReceivedEvent;
-import com.google.gerrit.server.git.ProjectConfig;
-import com.google.gerrit.server.git.receive.ReceiveConstants;
-import com.google.gerrit.server.git.validators.CommitValidationListener;
-import com.google.gerrit.server.git.validators.CommitValidationMessage;
-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 com.google.inject.Inject;
-import java.util.ArrayList;
-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.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-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;
-
-  @Inject private DynamicSet<CommitValidationListener> commitValidators;
-
-  @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.
-    String changeId = r.getChangeId();
-    r = amendChange(changeId, "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(changeId, "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(changeId, "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(changeId, "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(changeId, "refs/for/master%wip,ready");
-    r.assertErrorStatus();
-
-    // Pushing directly to the branch removes the work-in-progress flag
-    String master = "refs/heads/master";
-    assertPushOk(pushHead(testRepo, master, false), master);
-    ChangeInfo result = Iterables.getOnlyElement(gApi.changes().query(changeId).get());
-    assertThat(result.status).isEqualTo(ChangeStatus.MERGED);
-    assertThat(result.workInProgress).isNull();
-  }
-
-  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 {
-    testMaxBatchCommits();
-  }
-
-  @GerritConfig(name = "receive.maxBatchCommits", value = "2")
-  @Test
-  public void maxBatchCommitsWithDefaultValidator() throws Exception {
-    TestValidator validator = new TestValidator();
-    RegistrationHandle handle = commitValidators.add(validator);
-    try {
-      testMaxBatchCommits();
-    } finally {
-      handle.remove();
-    }
-  }
-
-  @GerritConfig(name = "receive.maxBatchCommits", value = "2")
-  @Test
-  public void maxBatchCommitsWithValidateAllCommitsValidator() throws Exception {
-    TestValidator validator = new TestValidator(true);
-    RegistrationHandle handle = commitValidators.add(validator);
-    try {
-      testMaxBatchCommits();
-    } finally {
-      handle.remove();
-    }
-  }
-
-  private void testMaxBatchCommits() 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());
-  }
-
-  private static class TestValidator implements CommitValidationListener {
-    private final AtomicInteger count = new AtomicInteger();
-    private final boolean validateAll;
-
-    TestValidator(boolean validateAll) {
-      this.validateAll = validateAll;
-    }
-
-    TestValidator() {
-      this(false);
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent) {
-      count.incrementAndGet();
-      return Collections.emptyList();
-    }
-
-    @Override
-    public boolean shouldValidateAllCommits() {
-      return validateAll;
-    }
-
-    public int count() {
-      return count.get();
-    }
-  }
-
-  @Test
-  public void skipValidation() throws Exception {
-    String master = "refs/heads/master";
-    TestValidator validator = new TestValidator();
-    RegistrationHandle handle = commitValidators.add(validator);
-    RegistrationHandle handle2 = null;
-
-    try {
-      // Validation listener is called on normal push
-      PushOneCommit push =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
-      PushOneCommit.Result r = push.to(master);
-      r.assertOkStatus();
-      assertThat(validator.count()).isEqualTo(1);
-
-      // Push is rejected and validation listener is not called when not allowed
-      // to use skip option
-      PushOneCommit push2 =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
-      push2.setPushOptions(ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
-      r = push2.to(master);
-      r.assertErrorStatus("skip validation not permitted for " + master);
-      assertThat(validator.count()).isEqualTo(1);
-
-      // Validation listener is not called when skip option is used
-      grantSkipValidation(project, master, SystemGroupBackend.REGISTERED_USERS);
-      PushOneCommit push3 =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
-      push3.setPushOptions(ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
-      r = push3.to(master);
-      r.assertOkStatus();
-      assertThat(validator.count()).isEqualTo(1);
-
-      // Validation listener that needs to validate all commits gets called even
-      // when the skip option is used.
-      TestValidator validator2 = new TestValidator(true);
-      handle2 = commitValidators.add(validator2);
-      PushOneCommit push4 =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
-      push4.setPushOptions(ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
-      r = push4.to(master);
-      r.assertOkStatus();
-      // First listener was not called; its count remains the same.
-      assertThat(validator.count()).isEqualTo(1);
-      // Second listener was called.
-      assertThat(validator2.count()).isEqualTo(1);
-    } finally {
-      handle.remove();
-      if (handle2 != null) {
-        handle2.remove();
-      }
-    }
-  }
-
-  @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 5bf5d01..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 = [f],
-    group = f[:f.index(".")],
-    labels = ["git"],
-    deps = [
-        ":push_for_review",
-        ":submodule_util",
-    ],
-) for f in glob(["*IT.java"])]
-
-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/RefOperationValidationIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefOperationValidationIT.java
deleted file mode 100644
index 4c47428..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/git/RefOperationValidationIT.java
+++ /dev/null
@@ -1,198 +0,0 @@
-// 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.git;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.gerrit.acceptance.GitUtil.deleteRef;
-import static org.eclipse.jgit.lib.Constants.HEAD;
-import static org.eclipse.jgit.transport.ReceiveCommand.Type.CREATE;
-import static org.eclipse.jgit.transport.ReceiveCommand.Type.DELETE;
-import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE;
-import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE_NONFASTFORWARD;
-
-import com.google.gerrit.acceptance.AbstractDaemonTest;
-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.registration.DynamicSet;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.events.RefReceivedEvent;
-import com.google.gerrit.server.git.validators.RefOperationValidationListener;
-import com.google.gerrit.server.git.validators.ValidationMessage;
-import com.google.gerrit.server.validators.ValidationException;
-import com.google.inject.Inject;
-import java.util.Collections;
-import java.util.List;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.ReceiveCommand;
-import org.eclipse.jgit.transport.RemoteRefUpdate;
-import org.junit.Test;
-
-public class RefOperationValidationIT extends AbstractDaemonTest {
-  private static final String TEST_REF = "refs/heads/protected";
-
-  @Inject DynamicSet<RefOperationValidationListener> validators;
-
-  private class TestRefValidator implements RefOperationValidationListener, AutoCloseable {
-    private final ReceiveCommand.Type rejectType;
-    private final String rejectRef;
-    private final RegistrationHandle handle;
-
-    public TestRefValidator(ReceiveCommand.Type rejectType) {
-      this.rejectType = rejectType;
-      this.rejectRef = TEST_REF;
-      this.handle = validators.add(this);
-    }
-
-    @Override
-    public List<ValidationMessage> onRefOperation(RefReceivedEvent refEvent)
-        throws ValidationException {
-      if (refEvent.getRefName().equals(rejectRef)
-          && refEvent.command.getType().equals(rejectType)) {
-        throw new ValidationException(rejectType.name());
-      }
-      return Collections.emptyList();
-    }
-
-    @Override
-    public void close() throws Exception {
-      handle.remove();
-    }
-  }
-
-  @Test
-  public void rejectRefCreation() throws Exception {
-    try (TestRefValidator validator = new TestRefValidator(CREATE)) {
-      gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
-      assert_().fail("expected exception");
-    } catch (RestApiException expected) {
-      assertThat(expected).hasMessageThat().contains(CREATE.name());
-    }
-  }
-
-  @Test
-  public void rejectRefCreationByPush() throws Exception {
-    try (TestRefValidator validator = new TestRefValidator(CREATE)) {
-      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();
-      PushOneCommit.Result r2 = push1.to(TEST_REF);
-      r2.assertErrorStatus(CREATE.name());
-    }
-  }
-
-  @Test
-  public void rejectRefDeletion() throws Exception {
-    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
-    try (TestRefValidator validator = new TestRefValidator(DELETE)) {
-      gApi.projects().name(project.get()).branch(TEST_REF).delete();
-      assert_().fail("expected exception");
-    } catch (RestApiException expected) {
-      assertThat(expected).hasMessageThat().contains(DELETE.name());
-    }
-  }
-
-  @Test
-  public void rejectRefDeletionByPush() throws Exception {
-    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
-    grant(project, "refs/*", Permission.DELETE, true);
-    try (TestRefValidator validator = new TestRefValidator(DELETE)) {
-      PushResult result = deleteRef(testRepo, TEST_REF);
-      RemoteRefUpdate refUpdate = result.getRemoteUpdate(TEST_REF);
-      assertThat(refUpdate.getMessage()).contains(DELETE.name());
-    }
-  }
-
-  @Test
-  public void rejectRefUpdateFastForward() throws Exception {
-    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
-    try (TestRefValidator validator = new TestRefValidator(UPDATE)) {
-      grant(project, "refs/*", Permission.PUSH, true);
-      PushOneCommit push1 =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
-      PushOneCommit.Result r1 = push1.to(TEST_REF);
-      r1.assertErrorStatus(UPDATE.name());
-    }
-  }
-
-  @Test
-  public void rejectRefUpdateNonFastForward() throws Exception {
-    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
-    try (TestRefValidator validator = new TestRefValidator(UPDATE_NONFASTFORWARD)) {
-      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(TEST_REF);
-      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(TEST_REF);
-      r2.assertErrorStatus(UPDATE_NONFASTFORWARD.name());
-    }
-  }
-
-  @Test
-  public void rejectRefUpdateNonFastForwardToExistingCommit() throws Exception {
-    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
-
-    try (TestRefValidator validator = new TestRefValidator(UPDATE_NONFASTFORWARD)) {
-      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();
-      ObjectId push1Id = r1.getCommit();
-
-      PushOneCommit push2 =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
-      PushOneCommit.Result r2 = push2.to("refs/heads/master");
-      r2.assertOkStatus();
-      ObjectId push2Id = r2.getCommit();
-
-      RefUpdate ru = repo().updateRef(HEAD);
-      ru.setNewObjectId(push1Id);
-      assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
-
-      PushOneCommit push3 =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change3", "c.txt", "content");
-      PushOneCommit.Result r3 = push3.to(TEST_REF);
-      r3.assertOkStatus();
-
-      ru = repo().updateRef(HEAD);
-      ru.setNewObjectId(push2Id);
-      assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
-
-      PushOneCommit push4 =
-          pushFactory.create(db, admin.getIdent(), testRepo, "change4", "d.txt", "content");
-      push4.setForce(true);
-      PushOneCommit.Result r4 = push4.to(TEST_REF);
-      r4.assertErrorStatus(UPDATE_NONFASTFORWARD.name());
-    }
-  }
-}
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 0da3198..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_8);
-  }
-
-  @ConfigSuite.Config
-  public static Config elasticsearchV7() {
-    return getConfig(ElasticVersion.V7_3);
-  }
-
-  @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 3d5932f..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
+++ /dev/null
@@ -1,488 +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.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.MergeInput;
-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.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 createChangeOnNonExistingBaseChangeFails() throws Exception {
-    ChangeInput input = newChangeInput(ChangeStatus.NEW);
-    input.baseChange = "999999";
-    assertCreateFails(
-        input, UnprocessableEntityException.class, "Base change not found: " + input.baseChange);
-  }
-
-  @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);
-  }
-
-  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 1c79340..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/change/CommentsIT.java
+++ /dev/null
@@ -1,1238 +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));
-
-      List<CommentInfo> list = getDraftCommentsAsList(changeId);
-      assertThat(list).hasSize(1);
-      actual = list.get(0);
-      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);
-
-      List<CommentInfo> list = getDraftCommentsAsList(changeId);
-      assertThat(list).hasSize(4);
-      assertThat(Lists.transform(list, 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);
-
-      List<CommentInfo> list = getPublishedCommentsAsList(changeId);
-      assertThat(Lists.transform(list, 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);
-
-      List<CommentInfo> list = getPublishedCommentsAsList(changeId);
-      assertThat(Lists.transform(list, 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();
-    assertThat(getPublishedCommentsAsList(changeId)).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);
-
-    List<CommentInfo> list = getPublishedCommentsAsList(changeId);
-    assertThat(Lists.transform(list, 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 result = createChange();
-    String changeId = result.getChangeId();
-
-    pushFactory
-        .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "old\ncontent\n", changeId)
-        .to("refs/heads/master");
-
-    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, range(1, 0, 4), "nit: trailing whitespace"));
-    addDraft(
-        r1.getChangeId(),
-        r1.getCommit().getName(),
-        newDraft(FILE_NAME, Side.PARENT, range(1, 0, 3), "why is this removed?"));
-    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, range(2, 0, 6), "typo: content"));
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.PARENT, 1, "line comment 1 on base"));
-    addDraft(
-        r2.getChangeId(),
-        r2.getCommit().getName(),
-        newDraft(FILE_NAME, Side.PARENT, 2, "line 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("why is this removed?");
-    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("line comment 1 on base");
-    assertThat(ps2List.get(1).message).isEqualTo("line 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@a1\n"
-                + "PS1, Line 1: old\n"
-                + "why is this removed?\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/1/a.txt@1\n"
-                + "PS1, Line 1: new \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: old\n"
-                + "line comment 1 on base\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt@a2\n"
-                + "PS2, Line 2: content\n"
-                + "line comment 2 on base\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt@1\n"
-                + "PS2, Line 1: new \n"
-                + "join lines\n"
-                + "\n"
-                + "\n"
-                + url
-                + "#/c/"
-                + c
-                + "/2/a.txt@2\n"
-                + "PS2, Line 2: cntent\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 List<CommentInfo> getPublishedCommentsAsList(String changeId) throws Exception {
-    return gApi.changes().id(changeId).commentsAsList();
-  }
-
-  private Map<String, List<CommentInfo>> getDraftComments(String changeId, String revId)
-      throws Exception {
-    return gApi.changes().id(changeId).revision(revId).drafts();
-  }
-
-  private List<CommentInfo> getDraftCommentsAsList(String changeId) throws Exception {
-    return gApi.changes().id(changeId).draftsAsList();
-  }
-
-  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 newDraft(String path, Side side, Comment.Range range, String message) {
-    DraftInput d = new DraftInput();
-    return populate(d, path, side, null, range.startLine, 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 Comment.Range range(int line, int startCharacter, int endCharacter) {
-    Comment.Range range = new Comment.Range();
-    range.startLine = line;
-    range.startCharacter = startCharacter;
-    range.endLine = line;
-    range.endCharacter = endCharacter;
-    return range;
-  }
-
-  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, line, null, message, unresolved);
-  }
-
-  private static <C extends Comment> C populate(
-      C c,
-      String path,
-      Side side,
-      Integer parent,
-      int line,
-      Comment.Range range,
-      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 (range != null) {
-      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 32c556b..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/server/notedb/OnlineNoteDbMigrationIT.java
+++ /dev/null
@@ -1,676 +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);
-      assert_().fail("expected MigrationException");
-    } 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 839564f..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_8);
-  }
-
-  @ConfigSuite.Config
-  public static Config elasticsearchV7() {
-    return getConfig(ElasticVersion.V7_3);
-  }
-
-  @Override
-  public void configureIndex(Injector injector) throws Exception {
-    createAllIndexes(injector);
-  }
-}
diff --git a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SetReviewersIT.java b/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SetReviewersIT.java
deleted file mode 100644
index 237859c..0000000
--- a/gerrit-acceptance-tests/src/test/java/com/google/gerrit/acceptance/ssh/SetReviewersIT.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.ssh;
-
-import static com.google.common.truth.Truth.assertThat;
-
-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.UseSsh;
-import com.google.gerrit.reviewdb.client.Account.Id;
-import org.junit.Before;
-import org.junit.Test;
-
-@UseSsh
-@NoHttpd
-public class SetReviewersIT extends AbstractDaemonTest {
-  PushOneCommit.Result change;
-
-  @Before
-  public void setUp() throws Exception {
-    change = createChange();
-  }
-
-  @Test
-  public void byCommitHash() throws Exception {
-    String id = change.getCommit().getId().toString().split("\\s+")[1];
-    addReviewer(id);
-    removeReviewer(id);
-  }
-
-  @Test
-  public void byChangeID() throws Exception {
-    addReviewer(change.getChangeId());
-    removeReviewer(change.getChangeId());
-  }
-
-  private void setReviewer(boolean add, String id) throws Exception {
-    adminSshSession.exec(
-        String.format("gerrit set-reviewers -%s %s %s", add ? "a" : "r", user.email, id));
-    adminSshSession.assertSuccess();
-    ImmutableSet<Id> reviewers = change.getChange().getReviewers().all();
-    if (add) {
-      assertThat(reviewers).contains(user.id);
-    } else {
-      assertThat(reviewers).doesNotContain(user.id);
-    }
-  }
-
-  private void addReviewer(String id) throws Exception {
-    setReviewer(true, id);
-  }
-
-  private void removeReviewer(String id) throws Exception {
-    setReviewer(false, id);
-  }
-}
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/PermissionRange.java b/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java
deleted file mode 100644
index 8876c02..0000000
--- a/gerrit-common/src/main/java/com/google/gerrit/common/data/PermissionRange.java
+++ /dev/null
@@ -1,140 +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.List;
-
-public class PermissionRange implements Comparable<PermissionRange> {
-  public static class WithDefaults extends PermissionRange {
-    protected int defaultMin;
-    protected int defaultMax;
-
-    protected WithDefaults() {}
-
-    public WithDefaults(String name, int min, int max, int defMin, int defMax) {
-      super(name, min, max);
-      setDefaultRange(defMin, defMax);
-    }
-
-    public int getDefaultMin() {
-      return defaultMin;
-    }
-
-    public int getDefaultMax() {
-      return defaultMax;
-    }
-
-    public void setDefaultRange(int min, int max) {
-      defaultMin = min;
-      defaultMax = max;
-    }
-
-    /** @return all values between {@link #getMin()} and {@link #getMax()} */
-    public List<Integer> getValuesAsList() {
-      ArrayList<Integer> r = new ArrayList<>(getRangeSize());
-      for (int i = min; i <= max; i++) {
-        r.add(i);
-      }
-      return r;
-    }
-
-    /** @return number of values between {@link #getMin()} and {@link #getMax()} */
-    public int getRangeSize() {
-      return max - min;
-    }
-  }
-
-  protected String name;
-  protected int min;
-  protected int max;
-
-  protected PermissionRange() {}
-
-  public PermissionRange(String name, int min, int max) {
-    this.name = name;
-
-    if (min <= max) {
-      this.min = min;
-      this.max = max;
-    } else {
-      this.min = max;
-      this.max = min;
-    }
-  }
-
-  public String getName() {
-    return name;
-  }
-
-  public boolean isLabel() {
-    return Permission.isLabel(getName());
-  }
-
-  public String getLabel() {
-    return Permission.extractLabel(getName());
-  }
-
-  public int getMin() {
-    return min;
-  }
-
-  public int getMax() {
-    return max;
-  }
-
-  /** True if the value is within the range. */
-  public boolean contains(int value) {
-    return getMin() <= value && value <= getMax();
-  }
-
-  /** Normalize the value to fit within the bounds of the range. */
-  public int squash(int value) {
-    return Math.min(Math.max(getMin(), value), getMax());
-  }
-
-  /** True both {@link #getMin()} and {@link #getMax()} are 0. */
-  public boolean isEmpty() {
-    return getMin() == 0 && getMax() == 0;
-  }
-
-  @Override
-  public int compareTo(PermissionRange o) {
-    return getName().compareTo(o.getName());
-  }
-
-  @Override
-  public String toString() {
-    StringBuilder r = new StringBuilder();
-    if (getMin() < 0 && getMax() == 0) {
-      r.append(getMin());
-      r.append(' ');
-    } else {
-      if (getMin() != getMax()) {
-        if (0 <= getMin()) {
-          r.append('+');
-        }
-        r.append(getMin());
-        r.append("..");
-      }
-      if (0 <= getMax()) {
-        r.append('+');
-      }
-      r.append(getMax());
-      r.append(' ');
-    }
-    return r.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 a5db030..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.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.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().indicesExistParams();
-    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(client.adapter()), 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(ElasticQueryAdapter adapter) {
-    return gson.toJson(ImmutableMap.of(SETTINGS, ElasticSetting.createSetting(config, adapter)));
-  }
-
-  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 mappings = new JsonObject();
-
-    if (client.adapter().omitType()) {
-      mappings.add(MAPPINGS, gson.toJsonTree(properties));
-    } else {
-      JsonObject mappingType = new JsonObject();
-      mappingType.add(type, gson.toJsonTree(properties));
-      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");
-
-    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().omitType()) {
-      return encodedIndexName + "/" + request;
-    }
-    String encodedTypeIfAny =
-        client.adapter().omitType() ? "" : "/" + URLEncoder.encode(type, UTF_8.toString());
-    return encodedIndexName + encodedTypeIfAny + "/" + 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 3cb56f4..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
+++ /dev/null
@@ -1,466 +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.deleteToReplace()) {
-      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().omitType()) {
-      if (client.adapter().useV6Type()) {
-        if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()
-            || !Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
-          indexes.add(ElasticQueryAdapter.V6_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().useV5Type()) {
-      return delete(client.adapter().getType(), c);
-    }
-    return delete(OPEN_CHANGES, c) + delete(CLOSED_CHANGES, c);
-  }
-
-  @Override
-  protected String getMappings() {
-    if (!client.adapter().useV5Type()) {
-      return getMappingsFor(client.adapter().getType(), 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");
-
-      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 4ec5feb..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticConfiguration.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.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 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_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_NUMBER_OF_SHARDS = 0;
-  static final int DEFAULT_NUMBER_OF_REPLICAS = 1;
-
-  private final Config cfg;
-  private final List<HttpHost> hosts;
-
-  final String username;
-  final String password;
-  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.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);
-  }
-
-  int getNumberOfShards(ElasticQueryAdapter adapter) {
-    if (numberOfShards == DEFAULT_NUMBER_OF_SHARDS) {
-      return adapter.getDefaultNumberOfShards();
-    }
-    return numberOfShards;
-  }
-}
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 dfb1cbf..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
+++ /dev/null
@@ -1,119 +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 static com.google.gerrit.elasticsearch.ElasticVersion.V6_7;
-
-import com.google.gson.JsonObject;
-
-public class ElasticQueryAdapter {
-  static final String V6_TYPE = "_doc";
-
-  private static final String INCLUDE_TYPE = "include_type_name=true";
-  private static final String INDICES = "?allow_no_indices=false";
-
-  private final boolean useV5Type;
-  private final boolean useV6Type;
-  private final boolean omitType;
-  private final int defaultNumberOfShards;
-
-  private final String searchFilteringName;
-  private final String indicesExistParams;
-  private final String exactFieldType;
-  private final String stringFieldType;
-  private final String indexProperty;
-  private final String versionDiscoveryUrl;
-  private final String includeTypeNameParam;
-
-  ElasticQueryAdapter(ElasticVersion version) {
-    this.useV5Type = !version.isV6OrLater();
-    this.useV6Type = version.isV6();
-    this.omitType = version.isV7OrLater();
-    this.defaultNumberOfShards = version.isV7OrLater() ? 1 : 5;
-    this.versionDiscoveryUrl = version.isV6OrLater() ? "/%s*" : "/%s*/_aliases";
-    this.searchFilteringName = "_source";
-    this.indicesExistParams =
-        version.isAtLeastMinorVersion(V6_7) ? INDICES + "&" + INCLUDE_TYPE : INDICES;
-    this.exactFieldType = "keyword";
-    this.stringFieldType = "text";
-    this.indexProperty = "true";
-    this.includeTypeNameParam = version.isAtLeastMinorVersion(V6_7) ? "?" + INCLUDE_TYPE : "";
-  }
-
-  public void setType(JsonObject properties, String type) {
-    if (useV5Type) {
-      properties.addProperty("_type", type);
-    }
-  }
-
-  public String searchFilteringName() {
-    return searchFilteringName;
-  }
-
-  String indicesExistParams() {
-    return indicesExistParams;
-  }
-
-  String exactFieldType() {
-    return exactFieldType;
-  }
-
-  String stringFieldType() {
-    return stringFieldType;
-  }
-
-  String indexProperty() {
-    return indexProperty;
-  }
-
-  boolean deleteToReplace() {
-    return useV5Type;
-  }
-
-  boolean useV5Type() {
-    return useV5Type;
-  }
-
-  boolean useV6Type() {
-    return useV6Type;
-  }
-
-  boolean omitType() {
-    return omitType;
-  }
-
-  int getDefaultNumberOfShards() {
-    return defaultNumberOfShards;
-  }
-
-  String getType() {
-    return getType("");
-  }
-
-  String getType(String type) {
-    if (useV6Type()) {
-      return V6_TYPE;
-    }
-    return useV5Type() ? 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 1147571..0000000
--- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
+++ /dev/null
@@ -1,148 +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());
-    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 7739125..0000000
--- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java
+++ /dev/null
@@ -1,74 +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 "blacktop/elasticsearch:5.6.16";
-      case V6_2:
-        return "blacktop/elasticsearch:6.2.4";
-      case V6_3:
-        return "blacktop/elasticsearch:6.3.2";
-      case V6_4:
-        return "blacktop/elasticsearch:6.4.3";
-      case V6_5:
-        return "blacktop/elasticsearch:6.5.4";
-      case V6_6:
-        return "blacktop/elasticsearch:6.6.2";
-      case V6_7:
-        return "blacktop/elasticsearch:6.7.2";
-      case V6_8:
-        return "blacktop/elasticsearch:6.8.2";
-      case V7_0:
-        return "blacktop/elasticsearch:7.0.1";
-      case V7_1:
-        return "blacktop/elasticsearch:7.1.1";
-      case V7_2:
-        return "blacktop/elasticsearch:7.2.1";
-      case V7_3:
-        return "blacktop/elasticsearch:7.3.1";
-    }
-    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 178aba5..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_8);
-    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 8a1cde3..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_8);
-    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 b87a920..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_8);
-    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 4a52107..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_3);
-    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 2301082..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_3);
-    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 82f9abe..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_3);
-    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 259fe15..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.17-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 3b2963a..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
+++ /dev/null
@@ -1,317 +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;
-
-  /**
-   * Generate a new HTTP password.
-   *
-   * @return the generated password.
-   */
-  String generateHttpPassword() throws RestApiException;
-
-  /**
-   * Set a new HTTP password.
-   *
-   * <p>May only be invoked by administrators.
-   *
-   * @param httpPassword the new password, {@code null} to remove the password.
-   * @return the new password, {@code null} if the password was removed.
-   */
-  String setHttpPassword(String httpPassword) 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();
-    }
-
-    @Override
-    public String generateHttpPassword() throws RestApiException {
-      throw new NotImplementedException();
-    }
-
-    @Override
-    public String setHttpPassword(String httpPassword) 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 202a67d..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
+++ /dev/null
@@ -1,636 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF 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 published comments on a change as a list.
-   *
-   * @return comments as a list; comments have the {@code revision} field set to indicate their
-   *     patch set.
-   * @throws RestApiException
-   */
-  List<CommentInfo> commentsAsList() 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;
-
-  /**
-   * Get all draft comments for the current user on a change as a list.
-   *
-   * @return drafts as a list; comments have the {@code revision} field set to indicate their patch
-   *     set.
-   * @throws RestApiException
-   */
-  List<CommentInfo> draftsAsList() 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 List<CommentInfo> commentsAsList() 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 List<CommentInfo> draftsAsList() 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 6030579..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/registration/DynamicSet.java
+++ /dev/null
@@ -1,282 +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;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-/**
- * 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);
-  }
-
-  public Stream<T> stream() {
-    return StreamSupport.stream(spliterator(), false);
-  }
-
-  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/RestApiException.java b/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java
deleted file mode 100644
index 28398a4..0000000
--- a/gerrit-extension-api/src/main/java/com/google/gerrit/extensions/restapi/RestApiException.java
+++ /dev/null
@@ -1,41 +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;
-
-/** Root exception type for JSON API failures. */
-public class RestApiException extends Exception {
-  private static final long serialVersionUID = 1L;
-  private CacheControl caching = CacheControl.NONE;
-
-  public RestApiException() {}
-
-  public RestApiException(String msg) {
-    super(msg);
-  }
-
-  public RestApiException(String msg, Throwable cause) {
-    super(msg, cause);
-  }
-
-  public CacheControl caching() {
-    return caching;
-  }
-
-  @SuppressWarnings("unchecked")
-  public <T extends RestApiException> T caching(CacheControl c) {
-    caching = c;
-    return (T) this;
-  }
-}
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 212b419..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/DeleteGpgKey.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.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.collect.ImmutableList;
-import com.google.common.io.BaseEncoding;
-import com.google.gerrit.common.errors.EmailException;
-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.gerrit.server.mail.send.DeleteKeySender;
-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;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class DeleteGpgKey implements RestModifyView<GpgKey, Input> {
-  private static final Logger log = LoggerFactory.getLogger(DeleteGpgKey.class);
-
-  public static class Input {}
-
-  private final Provider<PersonIdent> serverIdent;
-  private final Provider<PublicKeyStore> storeProvider;
-  private final ExternalIdsUpdate.User externalIdsUpdateFactory;
-  private final DeleteKeySender.Factory deleteKeySenderFactory;
-
-  @Inject
-  DeleteGpgKey(
-      @GerritPersonIdent Provider<PersonIdent> serverIdent,
-      Provider<PublicKeyStore> storeProvider,
-      ExternalIdsUpdate.User externalIdsUpdateFactory,
-      DeleteKeySender.Factory deleteKeySenderFactory) {
-    this.serverIdent = serverIdent;
-    this.storeProvider = storeProvider;
-    this.externalIdsUpdateFactory = externalIdsUpdateFactory;
-    this.deleteKeySenderFactory = deleteKeySenderFactory;
-  }
-
-  @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:
-          try {
-            deleteKeySenderFactory
-                .create(rsrc.getUser(), ImmutableList.of(PublicKeyStore.keyToString(key)))
-                .send();
-          } catch (EmailException e) {
-            log.error(
-                "Cannot send GPG key deletion message to {}",
-                rsrc.getUser().getAccount().getPreferredEmail(),
-                e);
-          }
-          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 979691e..0000000
--- a/gerrit-gpg/src/main/java/com/google/gerrit/gpg/server/PostGpgKeys.java
+++ /dev/null
@@ -1,313 +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.mail.send.DeleteKeySender;
-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 addKeySenderFactory;
-  private final DeleteKeySender.Factory deleteKeySenderFactory;
-  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 addKeySenderFactory,
-      DeleteKeySender.Factory deleteKeySenderFactory,
-      Provider<InternalAccountQuery> accountQueryProvider,
-      ExternalIds externalIds,
-      ExternalIdsUpdate.User externalIdsUpdateFactory) {
-    this.serverIdent = serverIdent;
-    this.self = self;
-    this.storeProvider = storeProvider;
-    this.checkerFactory = checkerFactory;
-    this.addKeySenderFactory = addKeySenderFactory;
-    this.deleteKeySenderFactory = deleteKeySenderFactory;
-    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<>();
-      IdentifiedUser user = rsrc.getUser();
-      for (PGPPublicKeyRing keyRing : keyRings) {
-        PGPPublicKey key = keyRing.getPublicKey();
-        // Don't check web of trust; admins can fill in certifications later.
-        CheckResult result = checkerFactory.create(user, 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(user.newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
-      cb.setCommitter(committer);
-
-      RefUpdate.Result saveResult = store.save(cb);
-      switch (saveResult) {
-        case NEW:
-        case FAST_FORWARD:
-        case FORCED:
-          if (!addedKeys.isEmpty()) {
-            try {
-              addKeySenderFactory.create(user, addedKeys).send();
-            } catch (EmailException e) {
-              log.error(
-                  "Cannot send GPG key added message to " + user.getAccount().getPreferredEmail(),
-                  e);
-            }
-          }
-          if (!toRemove.isEmpty()) {
-            try {
-              deleteKeySenderFactory
-                  .create(user, toRemove.stream().map(Fingerprint::toString).collect(toList()))
-                  .send();
-            } catch (EmailException e) {
-              log.error(
-                  "Cannot send GPG key deleted message to " + user.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 3e68cf9..2f95e84 100644
--- a/gerrit-gwtui/BUILD
+++ b/gerrit-gwtui/BUILD
@@ -45,11 +45,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 13152f6..0000000
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/WebSessionManager.java
+++ /dev/null
@@ -1,320 +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;
-    }
-
-    /**
-     * Parse an Account.Id.
-     *
-     * <p>This is public so that plugins that implement a web session, can also implement a way to
-     * clear per user sessions.
-     *
-     * @return account ID.
-     */
-    public 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 35e36f0..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 it is enabled.
-        if (!(p.equals("/") && options.enableGwtUi())) {
-          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 527422e..0000000
--- a/gerrit-launcher/BUILD
+++ /dev/null
@@ -1,7 +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"],
-    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 ee3475c..0000000
--- a/gerrit-launcher/src/main/java/com/google/gerrit/launcher/GerritLauncher.java
+++ /dev/null
@@ -1,701 +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.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.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 program.
-   *
-   * <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 program 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");
-  }
-
-  /**
-   * 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;
-
-    Path dir;
-    String sourceRoot = System.getProperty("sourceRoot");
-    if (sourceRoot != null) {
-      dir = Paths.get(sourceRoot);
-      if (!Files.exists(dir)) {
-        throw new FileNotFoundException("source root not found: " + dir);
-      }
-    } else {
-      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 WORKSPACE.
-      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 2f71b57..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/BaseInit.java
+++ /dev/null
@@ -1,538 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF 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);
-        try {
-          run.upgradeSchema();
-        } catch (OrmException e) {
-          String msg = "Couldn't upgrade schema. Expected if slave and read-only database";
-          System.err.println(msg);
-          log.warn(msg, e);
-        }
-
-        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 86daae2..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/init/SitePathInitializer.java
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF 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("AddKeyHtml.soy");
-    extractMailExample("ChangeFooter.soy");
-    extractMailExample("ChangeFooterHtml.soy");
-    extractMailExample("ChangeSubject.soy");
-    extractMailExample("Comment.soy");
-    extractMailExample("CommentHtml.soy");
-    extractMailExample("CommentFooter.soy");
-    extractMailExample("CommentFooterHtml.soy");
-    extractMailExample("DeleteKey.soy");
-    extractMailExample("DeleteKeyHtml.soy");
-    extractMailExample("DeleteReviewer.soy");
-    extractMailExample("DeleteReviewerHtml.soy");
-    extractMailExample("DeleteVote.soy");
-    extractMailExample("DeleteVoteHtml.soy");
-    extractMailExample("Footer.soy");
-    extractMailExample("FooterHtml.soy");
-    extractMailExample("HeaderHtml.soy");
-    extractMailExample("HttpPasswordUpdate.soy");
-    extractMailExample("HttpPasswordUpdateHtml.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 5211f41..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/ErrorLogFile.java
+++ /dev/null
@@ -1,90 +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;
-    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/LogFileCompressor.java b/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
deleted file mode 100644
index 8d04be8..0000000
--- a/gerrit-pgm/src/main/java/com/google/gerrit/pgm/util/LogFileCompressor.java
+++ /dev/null
@@ -1,172 +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.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;
-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;
-    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) {
-        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 104d49a..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 ax -o pid | grep -w $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.8 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
-
-    PID=`cat "$GERRIT_PID"`
-    if test $UID = 0; then
-        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 0750b56..0000000
--- a/gerrit-plugin-api/BUILD
+++ /dev/null
@@ -1,110 +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:jsr305",
-    "//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 f727b7a..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.17-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 63a9d55..9a5de04 100644
--- a/gerrit-plugin-gwtui/BUILD
+++ b/gerrit-plugin-gwtui/BUILD
@@ -25,18 +25,18 @@
     ],
     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",
     ],
 )
@@ -55,8 +55,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",
     ],
 )
 
@@ -68,8 +72,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 35de730..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.17-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 f27e349..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/rules/PrologEnvironment.java
+++ /dev/null
@@ -1,250 +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);
-    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) {
-        log.debug(
-            "predicate class is CONSULT_STREAM_2: override reductionLimit with compileLimit ({})",
-            compileLimit);
-        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 1d83316..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ReviewersUtil.java
+++ /dev/null
@@ -1,337 +0,0 @@
-// Copyright (C) 2016 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.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 groupBackend.suggest(suggestReviewers.getQuery(), projectState).stream()
-        .limit(suggestReviewers.getLimit())
-        .collect(toList());
-  }
-
-  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 d694048..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/StarredChangesUtil.java
+++ /dev/null
@@ -1,517 +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.git.LockFailureException;
-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);
-        if (ref != null) {
-          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) {
-          String message =
-              String.format(
-                  "Unstar change %d failed, ref %s could not be deleted: %s",
-                  changeId.get(), command.getRefName(), command.getResult());
-          if (command.getResult() == ReceiveCommand.Result.LOCK_FAILURE) {
-            throw new LockFailureException(message, batchUpdate);
-          }
-          throw new IOException(message);
-        }
-      }
-      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 c22e345..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteSshKey.java
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.EmailException;
-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.IdentifiedUser;
-import com.google.gerrit.server.account.DeleteSshKey.Input;
-import com.google.gerrit.server.mail.send.DeleteKeySender;
-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;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-@Singleton
-public class DeleteSshKey implements RestModifyView<AccountResource.SshKey, Input> {
-  private static final Logger log = LoggerFactory.getLogger(DeleteSshKey.class);
-
-  public static class Input {}
-
-  private final Provider<CurrentUser> self;
-  private final PermissionBackend permissionBackend;
-  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
-  private final SshKeyCache sshKeyCache;
-  private final DeleteKeySender.Factory deleteKeySenderFactory;
-
-  @Inject
-  DeleteSshKey(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      VersionedAuthorizedKeys.Accessor authorizedKeys,
-      SshKeyCache sshKeyCache,
-      DeleteKeySender.Factory deleteKeySenderFactory) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.authorizedKeys = authorizedKeys;
-    this.sshKeyCache = sshKeyCache;
-    this.deleteKeySenderFactory = deleteKeySenderFactory;
-  }
-
-  @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);
-    }
-
-    IdentifiedUser user = rsrc.getUser();
-    authorizedKeys.deleteKey(user.getAccountId(), rsrc.getSshKey().getKey().get());
-
-    try {
-      deleteKeySenderFactory.create(user, rsrc.getSshKey()).send();
-    } catch (EmailException e) {
-      log.error(
-          "Cannot send SSH key deletion message to {}", user.getAccount().getPreferredEmail(), e);
-    }
-
-    sshKeyCache.evict(user.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 b950d13..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/PutHttpPassword.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.account;
-
-import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
-
-import com.google.common.base.Strings;
-import com.google.gerrit.common.errors.EmailException;
-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.mail.send.HttpPasswordUpdateSender;
-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;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class PutHttpPassword implements RestModifyView<AccountResource, Input> {
-  private static final Logger log = LoggerFactory.getLogger(PutHttpPassword.class);
-
-  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;
-  private final HttpPasswordUpdateSender.Factory httpPasswordUpdateSenderFactory;
-
-  @Inject
-  PutHttpPassword(
-      Provider<CurrentUser> self,
-      PermissionBackend permissionBackend,
-      ExternalIds externalIds,
-      ExternalIdsUpdate.User externalIdsUpdate,
-      HttpPasswordUpdateSender.Factory httpPasswordUpdateSenderFactory) {
-    this.self = self;
-    this.permissionBackend = permissionBackend;
-    this.externalIds = externalIds;
-    this.externalIdsUpdate = externalIdsUpdate;
-    this.httpPasswordUpdateSenderFactory = httpPasswordUpdateSenderFactory;
-  }
-
-  @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);
-  }
-
-  // Used by the serviceuser plugin
-  // TODO(dpursehouse): Replace comment with @UsedAt
-  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);
-
-    try {
-      httpPasswordUpdateSenderFactory
-          .create(user, newPassword == null ? "deleted" : "added or updated")
-          .send();
-    } catch (EmailException e) {
-      log.error(
-          "Cannot send HttpPassword update message to {}",
-          user.getAccount().getPreferredEmail(),
-          e);
-    }
-
-    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 933ff5b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
+++ /dev/null
@@ -1,562 +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.PutHttpPassword;
-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;
-  private final PutHttpPassword putHttpPassword;
-
-  @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,
-      PutHttpPassword putPassword,
-      @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;
-    this.putHttpPassword = putPassword;
-  }
-
-  @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);
-    }
-  }
-
-  @Override
-  public String generateHttpPassword() throws RestApiException {
-    PutHttpPassword.Input input = new PutHttpPassword.Input();
-    input.generate = true;
-    try {
-      // Response should never be 'none' for a generated password, but
-      // let's make sure.
-      Response<String> result = putHttpPassword.apply(account, input);
-      return result.isNone() ? null : result.value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot generate HTTP password", e);
-    }
-  }
-
-  @Override
-  public String setHttpPassword(String password) throws RestApiException {
-    PutHttpPassword.Input input = new PutHttpPassword.Input();
-    input.generate = false;
-    input.httpPassword = password;
-    try {
-      Response<String> result = putHttpPassword.apply(account, input);
-      return result.isNone() ? null : result.value();
-    } catch (Exception e) {
-      throw asRestApiException("Cannot generate HTTP password", 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 373a425..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
+++ /dev/null
@@ -1,740 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 List<CommentInfo> commentsAsList() throws RestApiException {
-    try {
-      return listComments.getComments(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 List<CommentInfo> draftsAsList() throws RestApiException {
-    try {
-      return listDrafts.getComments(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 29620e0..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/api/projects/CommitApiImpl.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.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.common.CommitInfo;
-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.gerrit.server.project.GetCommit;
-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 GetCommit getCommit;
-  private final CherryPickCommit cherryPickCommit;
-  private final CommitIncludedIn includedIn;
-  private final CommitResource commitResource;
-
-  @Inject
-  CommitApiImpl(
-      Changes changes,
-      GetCommit getCommit,
-      CherryPickCommit cherryPickCommit,
-      CommitIncludedIn includedIn,
-      @Assisted CommitResource commitResource) {
-    this.changes = changes;
-    this.getCommit = getCommit;
-    this.cherryPickCommit = cherryPickCommit;
-    this.includedIn = includedIn;
-    this.commitResource = commitResource;
-  }
-
-  @Override
-  public CommitInfo get() throws RestApiException {
-    try {
-      return getCommit.apply(commitResource);
-    } catch (Exception e) {
-      throw asRestApiException("Cannot get commit info", e);
-    }
-  }
-
-  @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 4811bb1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ChangeKindCacheImpl.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.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(rw, prior, next)) {
-            return ChangeKind.NO_CODE_CHANGE;
-          }
-          return ChangeKind.REWORK;
-        }
-
-        if (isSameDeltaAndTree(rw, 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(RevWalk rw, RevCommit prior, RevCommit next)
-        throws IOException {
-      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++) {
-        // Parse parent commits so that their trees are available.
-        rw.parseCommit(prior.getParent(i));
-        rw.parseCommit(next.getParent(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 e2c7b96..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Files.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.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.api.GerritApi;
-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.Response;
-import com.google.gerrit.extensions.restapi.RestApiException;
-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;
-    private final GerritApi gApi;
-
-    @Inject
-    ListFiles(
-        Provider<ReviewDb> db,
-        Provider<CurrentUser> self,
-        FileInfoJson fileInfoJson,
-        Revisions revisions,
-        GitRepositoryManager gitManager,
-        PatchListCache patchListCache,
-        PatchSetUtil psUtil,
-        DynamicItem<AccountPatchReviewStore> accountPatchReviewStore,
-        GerritApi gApi) {
-      this.db = db;
-      this.self = self;
-      this.fileInfoJson = fileInfoJson;
-      this.revisions = revisions;
-      this.gitManager = gitManager;
-      this.patchListCache = patchListCache;
-      this.psUtil = psUtil;
-      this.accountPatchReviewStore = accountPatchReviewStore;
-      this.gApi = gApi;
-    }
-
-    public ListFiles setReviewed(boolean r) {
-      this.reviewed = r;
-      return this;
-    }
-
-    @Override
-    public Response<?> apply(RevisionResource resource)
-        throws RestApiException, 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) {
-        int parents =
-            gApi.changes()
-                .id(resource.getChange().getChangeId())
-                .revision(resource.getPatchSet().getId().get())
-                .commit(false)
-                .parents
-                .size();
-        if (parentNum < 0 || parentNum > parents) {
-          throw new BadRequestException(String.format("invalid parent number: %d", parentNum));
-        }
-        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 f7a6ef3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeComments.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.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.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 ListChangeComments extends ListChangeDrafts {
-
-  @Inject
-  ListChangeComments(
-      Provider<ReviewDb> db,
-      ChangeData.Factory changeDataFactory,
-      Provider<CommentJson> commentJson,
-      CommentsUtil commentsUtil) {
-    super(db, changeDataFactory, commentJson, commentsUtil);
-  }
-
-  @Override
-  protected Iterable<Comment> listComments(ChangeResource rsrc) throws OrmException {
-    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
-    return commentsUtil.publishedByChange(db.get(), cd.notes());
-  }
-
-  @Override
-  protected boolean includeAuthorInfo() {
-    return true;
-  }
-
-  @Override
-  public boolean requireAuthentication() {
-    return false;
-  }
-}
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 22fc5ea..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/ListChangeDrafts.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.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.change.CommentJson.CommentFormatter;
-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> {
-  protected final Provider<ReviewDb> db;
-  protected final ChangeData.Factory changeDataFactory;
-  protected final Provider<CommentJson> commentJson;
-  protected 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;
-  }
-
-  protected Iterable<Comment> listComments(ChangeResource rsrc) throws OrmException {
-    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
-    return commentsUtil.draftByChangeAuthor(db.get(), cd.notes(), rsrc.getUser().getAccountId());
-  }
-
-  protected boolean includeAuthorInfo() {
-    return false;
-  }
-
-  public boolean requireAuthentication() {
-    return true;
-  }
-
-  @Override
-  public Map<String, List<CommentInfo>> apply(ChangeResource rsrc)
-      throws AuthException, OrmException {
-    if (requireAuthentication() && !rsrc.getUser().isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    return getCommentFormatter().format(listComments(rsrc));
-  }
-
-  public List<CommentInfo> getComments(ChangeResource rsrc) throws AuthException, OrmException {
-    if (requireAuthentication() && !rsrc.getUser().isIdentifiedUser()) {
-      throw new AuthException("Authentication required");
-    }
-    return getCommentFormatter().formatAsList(listComments(rsrc));
-  }
-
-  private CommentFormatter getCommentFormatter() {
-    return commentJson
-        .get()
-        .setFillAccounts(includeAuthorInfo())
-        .setFillPatchSet(true)
-        .newCommentFormatter();
-  }
-}
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 0b23376..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/change/Rebase.java
+++ /dev/null
@@ -1,257 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.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.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;
-    try {
-      base = rebaseUtil.parseBase(rsrc, str);
-      if (base == null) {
-        throw new ResourceConflictException("base revision is missing: " + str);
-      }
-    } catch (NoSuchChangeException e) {
-      throw new UnprocessableEntityException(
-          String.format("Base change not found: %s", input.base), e);
-    }
-
-    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 ecd0268..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/config/GerritGlobalModule.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.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.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.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(CapabilityCollection.Factory.class);
-    factory(ChangeData.AssistedFactory.class);
-    factory(ChangeJson.AssistedFactory.class);
-    factory(EmailMerge.Factory.class);
-    factory(GroupMembers.Factory.class);
-    factory(MergeUtil.Factory.class);
-    factory(PatchScriptFactory.Factory.class);
-    factory(PluginUser.Factory.class);
-    factory(ProjectNode.Factory.class);
-    factory(ProjectState.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 e03ef67..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/GarbageCollectionLogFile.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.server.git;
-
-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 {
-  @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() {
-    LogManager.getLogger(GarbageCollection.LOG_NAME).removeAllAppenders();
-  }
-
-  private static void initLogSystem(Path logdir, boolean rotate) {
-    Logger gcLogger = LogManager.getLogger(GarbageCollection.LOG_NAME);
-    gcLogger.removeAllAppenders();
-    gcLogger.addAppender(
-        SystemLog.createAppender(
-            logdir, GarbageCollection.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/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 bc8b7e1..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/MergedByPushOp.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.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();
-    if (change.isWorkInProgress()) {
-      change.setWorkInProgress(false);
-      update.setWorkInProgress(false);
-    }
-    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 ef1f22f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
+++ /dev/null
@@ -1,3036 +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, IOException {
-    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, IOException {
-    try {
-      rp.getRevWalk().parseCommit(cmd.getNewId());
-    } catch (IOException err) {
-      logError(
-          "Invalid object " + cmd.getNewId().name() + " for " + cmd.getRefName() + " forced update",
-          err);
-      reject(cmd, "invalid object");
-      return;
-    }
-    logDebug("Rewinding {}", cmd);
-
-    if (!validRefOperation(cmd)) {
-      return;
-    }
-    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) {
-      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, IOException {
-    PermissionBackend.ForRef perm = permissions.ref(branch.get());
-    RevWalk walk = rp.getRevWalk();
-    boolean skipValidation =
-        !RefNames.REFS_CONFIG.equals(cmd.getRefName())
-            && !(MagicBranch.isMagicBranch(cmd.getRefName())
-                || NEW_PATCHSET_PATTERN.matcher(cmd.getRefName()).matches())
-            && pushOptions.containsKey(PUSH_OPTION_SKIP_VALIDATION);
-    CommitValidators commitValidators =
-        commitValidatorsFactory.forReceiveCommits(
-            perm, branch, user, sshInfo, repo, walk, skipValidation);
-    if (skipValidation) {
-      try {
-        perm.check(RefPermission.SKIP_VALIDATION);
-        if (!Iterables.isEmpty(rejectCommits)) {
-          throw new AuthException("reject-commits prevents " + PUSH_OPTION_SKIP_VALIDATION);
-        }
-      } catch (AuthException denied) {
-        reject(cmd, denied.getMessage());
-      }
-      if (!commitValidators.hasAllCommitsValidators()) {
-        logDebug("Short-circuiting new commit validation");
-        return;
-      }
-    }
-
-    boolean missingFullName = Strings.isNullOrEmpty(user.getAccount().getFullName());
-    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; ) {
-        // Even if skipValidation is set, we still get here when at least one plugin
-        // commit validator requires to validate all commits. In this case, however,
-        // we don't need to check the commit limit.
-        if (++n > limit && !skipValidation) {
-          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(commitValidators, walk, 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 {
-    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);
-    return validCommit(validators, rw, branch, cmd, id);
-  }
-
-  private boolean validCommit(
-      CommitValidators validators,
-      RevWalk rw,
-      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)) {
-      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.sort(RevSort.REVERSE);
-      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 2e09a35..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
+++ /dev/null
@@ -1,841 +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 {
-      return forReceiveCommits(perm, branch, user, sshInfo, repo, rw, false);
-    }
-
-    public CommitValidators forReceiveCommits(
-        PermissionBackend.ForRef perm,
-        Branch.NameKey branch,
-        IdentifiedUser user,
-        SshInfo sshInfo,
-        Repository repo,
-        RevWalk rw,
-        boolean skipValidation)
-        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, skipValidation),
-              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 boolean hasAllCommitsValidators() {
-    return validators.stream().anyMatch(v -> v.shouldValidateAllCommits());
-  }
-
-  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 boolean skipValidation;
-    private final DynamicSet<CommitValidationListener> commitValidationListeners;
-
-    public PluginCommitValidationListener(
-        final DynamicSet<CommitValidationListener> commitValidationListeners) {
-      this(commitValidationListeners, false);
-    }
-
-    public PluginCommitValidationListener(
-        final DynamicSet<CommitValidationListener> commitValidationListeners,
-        boolean skipValidation) {
-      this.skipValidation = skipValidation;
-      this.commitValidationListeners = commitValidationListeners;
-    }
-
-    @Override
-    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
-        throws CommitValidationException {
-      List<CommitValidationMessage> messages = new ArrayList<>();
-
-      for (CommitValidationListener validator : commitValidationListeners) {
-        if (skipValidation && !validator.shouldValidateAllCommits()) {
-          continue;
-        }
-        try {
-          messages.addAll(validator.onCommitReceived(receiveEvent));
-        } catch (CommitValidationException e) {
-          messages.addAll(e.getMessages());
-          throw new CommitValidationException(e.getMessage(), messages);
-        }
-      }
-      return messages;
-    }
-
-    @Override
-    public boolean shouldValidateAllCommits() {
-      return commitValidationListeners.stream().anyMatch(v -> v.shouldValidateAllCommits());
-    }
-  }
-
-  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 4b7fa6c..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 static java.util.stream.Collectors.toList;
-
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Strings;
-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 =
-        groupBackend
-            .suggest(
-                suggest, projects.stream().findFirst().map(pc -> pc.getProjectState()).orElse(null))
-            .stream()
-            .limit(limit <= 0 ? 10 : Math.min(limit, 10))
-            .collect(toList());
-
-    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 6d1971e..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ChangeIndexer.java
+++ /dev/null
@@ -1,562 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.base.Objects;
-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.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-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;
-
-  private final Set<IndexTask> queuedIndexTasks =
-      Collections.newSetFromMap(new ConcurrentHashMap<>());
-  private final Set<ReindexIfStaleTask> queuedReindexIfStaleTasks =
-      Collections.newSetFromMap(new ConcurrentHashMap<>());
-
-  @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) {
-    IndexTask task = new IndexTask(project, id);
-    if (queuedIndexTasks.add(task)) {
-      return submit(task);
-    }
-    return Futures.immediateCheckedFuture(null);
-  }
-
-  /**
-   * 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) {
-    ReindexIfStaleTask task = new ReindexIfStaleTask(project, id);
-    if (queuedReindexIfStaleTasks.add(task)) {
-      return submit(task, batchExecutor);
-    }
-    return Futures.immediateCheckedFuture(false);
-  }
-
-  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;
-
-    protected abstract void remove();
-
-    @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 {
-      remove();
-      ChangeData cd = newChangeData(db.get(), project, id);
-      index(cd);
-      return null;
-    }
-
-    @Override
-    public int hashCode() {
-      return Objects.hashCode(IndexTask.class, id.get());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (!(obj instanceof IndexTask)) {
-        return false;
-      }
-      IndexTask other = (IndexTask) obj;
-      return id.get() == other.id.get();
-    }
-
-    @Override
-    public String toString() {
-      return "index-change-" + id;
-    }
-
-    @Override
-    protected void remove() {
-      queuedIndexTasks.remove(this);
-    }
-  }
-
-  // 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 {
-      remove();
-      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 int hashCode() {
-      return Objects.hashCode(ReindexIfStaleTask.class, id.get());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (!(obj instanceof ReindexIfStaleTask)) {
-        return false;
-      }
-      ReindexIfStaleTask other = (ReindexIfStaleTask) obj;
-      return id.get() == other.id.get();
-    }
-
-    @Override
-    public String toString() {
-      return "reindex-if-stale-change-" + id;
-    }
-
-    @Override
-    protected void remove() {
-      queuedReindexIfStaleTasks.remove(this);
-    }
-  }
-
-  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 a59557f..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java
+++ /dev/null
@@ -1,233 +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.base.Objects;
-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.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentHashMap;
-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;
-
-  private final Set<Index> queuedIndexTasks = Collections.newSetFromMap(new ConcurrentHashMap<>());
-
-  @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) {
-              Index task = new Index(event, c.getId());
-              if (queuedIndexTasks.add(task)) {
-                // Don't retry indefinitely; if this fails changes may be stale.
-                @SuppressWarnings("unused")
-                Future<?> possiblyIgnoredError = executor.submit(task);
-              }
-            }
-          }
-
-          @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;
-
-    protected abstract void remove();
-  }
-
-  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();
-    }
-
-    @Override
-    protected void remove() {}
-  }
-
-  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();
-      remove();
-      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 int hashCode() {
-      return Objects.hashCode(Index.class, id.get());
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-      if (!(obj instanceof Index)) {
-        return false;
-      }
-      Index other = (Index) obj;
-      return id.get() == other.id.get();
-    }
-
-    @Override
-    public String toString() {
-      return "Index change " + id.get() + " of project " + event.getProjectName();
-    }
-
-    @Override
-    protected void remove() {
-      queuedIndexTasks.remove(this);
-    }
-  }
-}
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 e3b0c29..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/AddKeySender.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.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.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.mail.Address;
-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 IdentifiedUser user;
-  private final AccountSshKey sshKey;
-  private final List<String> gpgKeys;
-
-  @AssistedInject
-  public AddKeySender(
-      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted AccountSshKey sshKey) {
-    super(ea, "addkey");
-    this.user = user;
-    this.sshKey = sshKey;
-    this.gpgKeys = null;
-  }
-
-  @AssistedInject
-  public AddKeySender(
-      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted List<String> gpgKeys) {
-    super(ea, "addkey");
-    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;
-    }
-
-    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 ad1ae9e..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 {}", lineNbr, 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/DeleteKeySender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteKeySender.java
deleted file mode 100644
index b41a393..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/DeleteKeySender.java
+++ /dev/null
@@ -1,119 +0,0 @@
-// 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.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.reviewdb.client.AccountSshKey;
-import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.mail.Address;
-import com.google.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-import java.util.Collections;
-import java.util.List;
-
-public class DeleteKeySender extends OutgoingEmail {
-  public interface Factory {
-    DeleteKeySender create(IdentifiedUser user, AccountSshKey sshKey);
-
-    DeleteKeySender create(IdentifiedUser user, List<String> gpgKeyFingerprints);
-  }
-
-  private final IdentifiedUser user;
-  private final AccountSshKey sshKey;
-  private final List<String> gpgKeyFingerprints;
-
-  @AssistedInject
-  public DeleteKeySender(
-      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted AccountSshKey sshKey) {
-    super(ea, "deletekey");
-    this.user = user;
-    this.gpgKeyFingerprints = Collections.emptyList();
-    this.sshKey = sshKey;
-  }
-
-  @AssistedInject
-  public DeleteKeySender(
-      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted List<String> gpgKeyFingerprints) {
-    super(ea, "deletekey");
-    this.user = user;
-    this.gpgKeyFingerprints = gpgKeyFingerprints;
-    this.sshKey = null;
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-    setHeader("Subject", String.format("[Gerrit Code Review] %s Keys Deleted", getKeyType()));
-    add(RecipientType.TO, new Address(getEmail()));
-  }
-
-  @Override
-  protected boolean shouldSendMessage() {
-    return true;
-  }
-
-  @Override
-  protected void format() throws EmailException {
-    appendText(textTemplate("DeleteKey"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("DeleteKeyHtml"));
-    }
-  }
-
-  public String getEmail() {
-    return user.getAccount().getPreferredEmail();
-  }
-
-  public String getUserNameEmail() {
-    return getUserNameEmailFor(user.getAccountId());
-  }
-
-  public String getKeyType() {
-    if (sshKey != null) {
-      return "SSH";
-    } else if (gpgKeyFingerprints != null) {
-      return "GPG";
-    }
-    throw new IllegalStateException("key type is not SSH or GPG");
-  }
-
-  public String getSshKey() {
-    return (sshKey != null) ? sshKey.getSshPublicKey() + "\n" : null;
-  }
-
-  public String getGpgKeyFingerprints() {
-    if (!gpgKeyFingerprints.isEmpty()) {
-      return Joiner.on("\n").join(gpgKeyFingerprints);
-    }
-    return null;
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContextEmailData.put("email", getEmail());
-    soyContextEmailData.put("gpgKeyFingerprints", getGpgKeyFingerprints());
-    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/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/HttpPasswordUpdateSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/HttpPasswordUpdateSender.java
deleted file mode 100644
index eb2ca25..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/HttpPasswordUpdateSender.java
+++ /dev/null
@@ -1,81 +0,0 @@
-// 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.server.mail.send;
-
-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.inject.assistedinject.Assisted;
-import com.google.inject.assistedinject.AssistedInject;
-
-public class HttpPasswordUpdateSender extends OutgoingEmail {
-  public interface Factory {
-    HttpPasswordUpdateSender create(IdentifiedUser user, String operation);
-  }
-
-  private final IdentifiedUser user;
-  private final String operation;
-
-  @AssistedInject
-  public HttpPasswordUpdateSender(
-      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted String operation) {
-    super(ea, "HttpPasswordUpdate");
-    this.user = user;
-    this.operation = operation;
-  }
-
-  @Override
-  protected void init() throws EmailException {
-    super.init();
-    setHeader("Subject", "[Gerrit Code Review] HTTP password was " + operation);
-    add(RecipientType.TO, new Address(getEmail()));
-  }
-
-  @Override
-  protected boolean shouldSendMessage() {
-    // Always send an email if the HTTP password is updated.
-    return true;
-  }
-
-  @Override
-  protected void format() throws EmailException {
-    appendText(textTemplate("HttpPasswordUpdate"));
-    if (useHtml()) {
-      appendHtml(soyHtmlTemplate("HttpPasswordUpdateHtml"));
-    }
-  }
-
-  public String getEmail() {
-    return user.getAccount().getPreferredEmail();
-  }
-
-  public String getUserNameEmail() {
-    return getUserNameEmailFor(user.getAccountId());
-  }
-
-  @Override
-  protected void setupSoyContext() {
-    super.setupSoyContext();
-    soyContextEmailData.put("email", getEmail());
-    soyContextEmailData.put("userNameEmail", getUserNameEmail());
-    soyContextEmailData.put("operation", operation);
-  }
-
-  @Override
-  protected boolean supportsHtml() {
-    return true;
-  }
-}
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 34a7085..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.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.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",
-    "DeleteKey.soy",
-    "DeleteKeyHtml.soy",
-    "DeleteReviewer.soy",
-    "DeleteReviewerHtml.soy",
-    "DeleteVote.soy",
-    "DeleteVoteHtml.soy",
-    "Footer.soy",
-    "FooterHtml.soy",
-    "HeaderHtml.soy",
-    "HttpPasswordUpdate.soy",
-    "HttpPasswordUpdateHtml.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 e741659..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/send/NewChangeSender.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.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();
-
-    String threadId = getChangeMessageThreadId();
-    setHeader("Message-ID", threadId);
-    setHeader("References", threadId);
-
-    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/PatchFile.java b/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
deleted file mode 100644
index 024fef4..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/patch/PatchFile.java
+++ /dev/null
@@ -1,172 +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.gerrit.common.errors.NoSuchEntityException;
-import com.google.gerrit.reviewdb.client.Patch;
-import java.io.IOException;
-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.RevObject;
-import org.eclipse.jgit.revwalk.RevTree;
-import org.eclipse.jgit.revwalk.RevWalk;
-import org.eclipse.jgit.treewalk.TreeWalk;
-
-/** State supporting processing of a single {@link Patch} instance. */
-public class PatchFile {
-  private final Repository repo;
-  private final PatchListEntry entry;
-  private final RevTree aTree;
-  private final RevTree bTree;
-
-  private Text a;
-  private Text b;
-
-  public PatchFile(Repository repo, PatchList patchList, String fileName)
-      throws MissingObjectException, IncorrectObjectTypeException, IOException {
-    this.repo = repo;
-    this.entry = patchList.get(fileName);
-
-    try (ObjectReader reader = repo.newObjectReader();
-        RevWalk rw = new RevWalk(reader)) {
-      final RevCommit bCommit = rw.parseCommit(patchList.getNewId());
-
-      if (Patch.COMMIT_MSG.equals(fileName)) {
-        if (patchList.getComparisonType().isAgainstParentOrAutoMerge()) {
-          a = Text.EMPTY;
-        } else {
-          // For the initial commit, we have an empty tree on Side A
-          RevObject object = rw.parseAny(patchList.getOldId());
-          a = object instanceof RevCommit ? Text.forCommit(reader, object) : Text.EMPTY;
-        }
-        b = Text.forCommit(reader, bCommit);
-
-        aTree = null;
-        bTree = null;
-      } else if (Patch.MERGE_LIST.equals(fileName)) {
-        // For the initial commit, we have an empty tree on Side A
-        RevObject object = rw.parseAny(patchList.getOldId());
-        a =
-            object instanceof RevCommit
-                ? Text.forMergeList(patchList.getComparisonType(), reader, object)
-                : Text.EMPTY;
-        b = Text.forMergeList(patchList.getComparisonType(), reader, bCommit);
-
-        aTree = null;
-        bTree = null;
-      } else {
-        if (patchList.getOldId() != null) {
-          aTree = rw.parseTree(patchList.getOldId());
-        } else {
-          final RevCommit p = bCommit.getParent(0);
-          rw.parseHeaders(p);
-          aTree = p.getTree();
-        }
-        bTree = bCommit.getTree();
-      }
-    }
-  }
-
-  private String getOldName() {
-    String name = entry.getOldName();
-    if (name != null) {
-      return name;
-    }
-    return entry.getNewName();
-  }
-
-  /**
-   * Extract a line from the file, as a string.
-   *
-   * @param file the file index to extract.
-   * @param line the line number to extract (1 based; 1 is the first line).
-   * @return the string version of the file line.
-   * @throws IOException the patch or complete file content cannot be read.
-   * @throws NoSuchEntityException
-   */
-  public String getLine(int file, int line) throws IOException, NoSuchEntityException {
-    switch (file) {
-      case 0:
-        if (a == null) {
-          a = load(aTree, getOldName());
-        }
-        return a.getString(line - 1);
-
-      case 1:
-        if (b == null) {
-          b = load(bTree, entry.getNewName());
-        }
-        return b.getString(line - 1);
-
-      default:
-        throw new NoSuchEntityException();
-    }
-  }
-
-  /**
-   * Return number of lines in file.
-   *
-   * @param file the file index to extract.
-   * @return number of lines in file.
-   * @throws IOException the patch or complete file content cannot be read.
-   * @throws NoSuchEntityException the file is not exist.
-   */
-  public int getLineCount(int file) throws IOException, NoSuchEntityException {
-    switch (file) {
-      case 0:
-        if (a == null) {
-          a = load(aTree, getOldName());
-        }
-        return a.size();
-
-      case 1:
-        if (b == null) {
-          b = load(bTree, entry.getNewName());
-        }
-        return b.size();
-
-      default:
-        throw new NoSuchEntityException();
-    }
-  }
-
-  private Text load(ObjectId tree, String path)
-      throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
-          IOException {
-    if (path == null) {
-      return Text.EMPTY;
-    }
-    final TreeWalk tw = TreeWalk.forPath(repo, path, tree);
-    if (tw == null) {
-      return Text.EMPTY;
-    }
-    if (tw.getFileMode(0).getObjectType() == Constants.OBJ_BLOB) {
-      return new Text(repo.open(tw.getObjectId(0), Constants.OBJ_BLOB));
-    } else if (tw.getFileMode(0).getObjectType() == Constants.OBJ_COMMIT) {
-      String str = "Subproject commit " + ObjectId.toString(tw.getObjectId(0));
-      return new Text(str.getBytes(UTF_8));
-    } else {
-      return Text.EMPTY;
-    }
-  }
-}
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 a085333b..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/CreateProject.java
+++ /dev/null
@@ -1,401 +0,0 @@
-// Copyright (C) 2013 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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));
-  }
-
-  // TODO(dpursehouse): Add @UsedAt annotation
-  public 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 76e9e98..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectControl.java
+++ /dev/null
@@ -1,517 +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.common.data.AccessSection.ALL;
-import static com.google.gerrit.common.data.RefConfigSection.REGEX_PREFIX;
-import static com.google.gerrit.reviewdb.client.RefNames.REFS_TAGS;
-import static com.google.gerrit.server.util.MagicBranch.NEW_CHANGE;
-
-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(ALL).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(NEW_CHANGE)
-          || section.getName().startsWith(REGEX_PREFIX + NEW_CHANGE)) {
-        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)
-          || section.getName().startsWith(REGEX_PREFIX + 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(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 10a0e6d..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/project/ProjectState.java
+++ /dev/null
@@ -1,652 +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. Must not contain any data derived from parents other than it's
- * immediate parent's {@link com.google.gerrit.reviewdb.client.Project.NameKey}.
- */
-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;
-
-  @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() {
-    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));
-  }
-
-  /** 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 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 29b2a5c..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeData.java
+++ /dev/null
@@ -1,1291 +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 = getCachedSubmitRecord(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 getCachedSubmitRecord(options);
-  }
-
-  private List<SubmitRecord> getCachedSubmitRecord(SubmitRuleOptions options) {
-    List<SubmitRecord> records = submitRecords.get(options);
-    if (records != null) {
-      return records;
-    }
-
-    if (options.allowClosed() && change != null && change.getStatus().isOpen()) {
-      SubmitRuleOptions openSubmitRuleOptions = options.toBuilder().allowClosed(false).build();
-      return submitRecords.get(openSubmitRuleOptions);
-    }
-
-    return null;
-  }
-
-  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 1edbc38..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
+++ /dev/null
@@ -1,1335 +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.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 = allMembers.stream().limit(maxTerms).collect(toSet());
-    } 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 afb62fa..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_130.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.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.util.SortedSet;
-import java.util.TreeSet;
-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 (Exception 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 de91aca..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 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()) {
-      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 e9865d3..0000000
--- a/gerrit-server/src/main/java/com/google/gerrit/server/util/SystemLog.java
+++ /dev/null
@@ -1,141 +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.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;
-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 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, false);
-  }
-
-  public AsyncAppender createAsyncAppender(String name, Layout layout, boolean forPlugin) {
-    return createAsyncAppender(name, layout, forPlugin, rotateLogs);
-  }
-
-  private AsyncAppender createAsyncAppender(
-      String name, Layout layout, boolean forPlugin, boolean rotate) {
-    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 {
-        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/DeleteKey.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteKey.soy
deleted file mode 100644
index 0fc4bf8..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteKey.soy
+++ /dev/null
@@ -1,72 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .DeleteKey template will determine the contents of the email related to
- * deleting a SSH or GPG key.
- * @param email
- */
-{template .DeleteKey autoescape="strict" kind="text"}
-  One or more {$email.keyType} keys have been deleted on Gerrit Code Review at
-  {sp}{$email.gerritHost}:
-
-  {\n}
-  {\n}
-
-  {if $email.sshKey}
-    {$email.sshKey}
-  {elseif $email.gpgKeyFingerprints}
-    {$email.gpgKeyFingerprints}
-  {/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.gpgKey}
-    {$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}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy
deleted file mode 100644
index acdadad..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param email
- */
-{template .DeleteKeyHtml autoescape="strict" kind="html"}
-  <p>
-    One or more {$email.keyType} keys have been deleted on 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.gpgKeyFingerprints}
-    <pre style="{$keyStyle}">{$email.gpgKeyFingerprints}</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.gpgKeyFingerprints}
-      <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/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/HttpPasswordUpdate.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy
deleted file mode 100644
index 49fce7b..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * The .HttpPasswordUpdate template will determine the contents of the email related to
- * adding, changing or deleting the HTTP password.
- * @param email
- */
-{template .HttpPasswordUpdate autoescape="strict" kind="text"}
-  The HTTP password was {$email.operation} on Gerrit Code Review at
-  {sp}{$email.gerritHost}.
-
-  If this is not expected, please contact your Gerrit Administrators
-  immediately.
-
-  {\n}
-  {\n}
-
-  You can also manage your HTTP password by visiting
-  {\n}
-  {$email.gerritUrl}#/settings/http-password
-  {\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}
diff --git a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy
deleted file mode 100644
index 0aac668..0000000
--- a/gerrit-server/src/main/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * 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.
- */
-
-{namespace com.google.gerrit.server.mail.template}
-
-/**
- * @param email
- */
-{template .HttpPasswordUpdateHtml autoescape="strict" kind="html"}
-  <p>
-    The HTTP password was {$email.operation} on Gerrit Code Review
-    at {$email.gerritHost}.
-  </p>
-
-  <p>
-    If this is not expected, please contact your Gerrit Administrators
-    immediately.
-  </p>
-
-  <p>
-    You can also manage your HTTP password by following{sp}
-    <a href="{$email.gerritUrl}#/settings/http-password">this link</a>
-    {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/Merged.soy b/gerrit-server/src/main/resources/com/google/gerrit/server/mail/Merged.soy
deleted file mode 100644
index 12a9d63..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.
-  {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/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 0773f20..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>submitted</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/GerritJUnit.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritJUnit.java
deleted file mode 100644
index 7437c7e..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritJUnit.java
+++ /dev/null
@@ -1,67 +0,0 @@
-// 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.testutil;
-
-/** Static JUnit utility methods. */
-public class GerritJUnit {
-  /**
-   * Assert that an exception is thrown by a block of code.
-   *
-   * <p>This method is source-compatible with <a
-   * href="https://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThrows(java.lang.Class,%20org.junit.function.ThrowingRunnable)">JUnit
-   * 4.13 beta</a>.
-   *
-   * <p>This construction is recommended by the Truth team for use in conjunction with asserting
-   * over a {@code ThrowableSubject} on the return type:
-   *
-   * <pre>
-   *   MyException e = assertThrows(MyException.class, () -> doSomething(foo));
-   *   assertThat(e).isInstanceOf(MySubException.class);
-   *   assertThat(e).hasMessageThat().contains("sub-exception occurred");
-   * </pre>
-   *
-   * @param throwableClass expected exception type.
-   * @param runnable runnable containing arbitrary code.
-   * @return exception that was thrown.
-   */
-  public static <T extends Throwable> T assertThrows(
-      Class<T> throwableClass, ThrowingRunnable runnable) {
-    try {
-      runnable.run();
-    } catch (Throwable t) {
-      if (!throwableClass.isInstance(t)) {
-        throw new AssertionError(
-            "expected "
-                + throwableClass.getName()
-                + " but "
-                + t.getClass().getName()
-                + " was thrown",
-            t);
-      }
-      @SuppressWarnings("unchecked")
-      T toReturn = (T) t;
-      return toReturn;
-    }
-    throw new AssertionError(
-        "expected " + throwableClass.getName() + " but no exception was thrown");
-  }
-
-  @FunctionalInterface
-  public interface ThrowingRunnable {
-    void run() throws Throwable;
-  }
-
-  private GerritJUnit() {}
-}
diff --git a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritJUnitTest.java b/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritJUnitTest.java
deleted file mode 100644
index e0ead71..0000000
--- a/gerrit-server/src/test/java/com/google/gerrit/testutil/GerritJUnitTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-// 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.testutil;
-
-import static com.google.common.truth.Truth.assertThat;
-import static com.google.common.truth.Truth.assert_;
-import static com.google.gerrit.testutil.GerritJUnit.assertThrows;
-
-import org.junit.Test;
-
-public class GerritJUnitTest {
-  private static class MyException extends Exception {
-    private static final long serialVersionUID = 1L;
-
-    MyException(String msg) {
-      super(msg);
-    }
-  }
-
-  private static class MySubException extends MyException {
-    private static final long serialVersionUID = 1L;
-
-    MySubException(String msg) {
-      super(msg);
-    }
-  }
-
-  @Test
-  public void assertThrowsCatchesSpecifiedExceptionType() {
-    MyException e =
-        assertThrows(
-            MyException.class,
-            () -> {
-              throw new MyException("foo");
-            });
-    assertThat(e).hasMessageThat().isEqualTo("foo");
-  }
-
-  @Test
-  public void assertThrowsCatchesSubclassOfSpecifiedExceptionType() {
-    MyException e =
-        assertThrows(
-            MyException.class,
-            () -> {
-              throw new MySubException("foo");
-            });
-    assertThat(e).isInstanceOf(MySubException.class);
-    assertThat(e).hasMessageThat().isEqualTo("foo");
-  }
-
-  @Test
-  public void assertThrowsConvertsUnexpectedExceptionTypeToAssertionError() {
-    try {
-      assertThrows(
-          IllegalStateException.class,
-          () -> {
-            throw new MyException("foo");
-          });
-      assert_().fail("expected AssertionError");
-    } catch (AssertionError e) {
-      assertThat(e).hasMessageThat().contains(IllegalStateException.class.getSimpleName());
-      assertThat(e).hasMessageThat().contains(MyException.class.getSimpleName());
-      assertThat(e).hasCauseThat().isInstanceOf(MyException.class);
-      assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("foo");
-    }
-  }
-
-  @Test
-  public void assertThrowsThrowsAssertionErrorWhenNothingThrown() {
-    try {
-      assertThrows(MyException.class, () -> {});
-      assert_().fail("expected AssertionError");
-    } catch (AssertionError e) {
-      assertThat(e).hasMessageThat().contains(MyException.class.getSimpleName());
-      assertThat(e).hasCauseThat().isNull();
-    }
-  }
-}
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 0da3427..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/DispatchCommand.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.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.registration.DynamicSet;
-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;
-  private final DynamicSet<SshExecuteCommandInterceptor> commandInterceptors;
-
-  @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,
-      DynamicSet<SshExecuteCommandInterceptor> commandInterceptors,
-      @Assisted Map<String, CommandProvider> all) {
-    this.currentUser = user;
-    this.permissionBackend = permissionBackend;
-    commands = all;
-    atomicCmd = Atomics.newReference();
-    this.commandInterceptors = commandInterceptors;
-  }
-
-  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);
-      String actualCommandName = commandName;
-      if (cmd instanceof BaseCommand) {
-        final BaseCommand bc = (BaseCommand) cmd;
-        if (!getName().isEmpty()) {
-          actualCommandName = getName() + " " + commandName;
-        }
-        bc.setName(actualCommandName);
-        bc.setArguments(args.toArray(new String[args.size()]));
-
-      } else if (!args.isEmpty()) {
-        throw die(commandName + " does not take arguments");
-      }
-
-      for (SshExecuteCommandInterceptor commandInterceptor : commandInterceptors) {
-        if (!commandInterceptor.accept(actualCommandName, args)) {
-          throw new UnloggedFailure(
-              126,
-              String.format(
-                  "blocked by %s, contact gerrit administrators for more details",
-                  commandInterceptor.name()));
-        }
-      }
-
-      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 dc88740..0000000
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshModule.java
+++ /dev/null
@@ -1,140 +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.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.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);
-    DynamicSet.setOf(binder(), SshExecuteCommandInterceptor.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 1df798c..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.17-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..fda77d2
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/EventRecorder.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.acceptance;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.annotations.VisibleForTesting;
+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;
+  }
+
+  @VisibleForTesting
+  public 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..ac197bd
--- /dev/null
+++ b/java/com/google/gerrit/acceptance/TestAccount.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.acceptance;
+
+import static java.util.stream.Collectors.toList;
+
+import com.google.common.base.MoreObjects;
+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;
+  }
+
+  @Override
+  public String toString() {
+    return MoreObjects.toStringHelper(this).add("id", id).add("username", username).toString();
+  }
+}
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/java/com/google/gerrit/common/data/PermissionRange.java b/java/com/google/gerrit/common/data/PermissionRange.java
new file mode 100644
index 0000000..2f05854
--- /dev/null
+++ b/java/com/google/gerrit/common/data/PermissionRange.java
@@ -0,0 +1,140 @@
+// 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.List;
+
+public class PermissionRange implements Comparable<PermissionRange> {
+  public static class WithDefaults extends PermissionRange {
+    protected int defaultMin;
+    protected int defaultMax;
+
+    protected WithDefaults() {}
+
+    public WithDefaults(String name, int min, int max, int defMin, int defMax) {
+      super(name, min, max);
+      setDefaultRange(defMin, defMax);
+    }
+
+    public int getDefaultMin() {
+      return defaultMin;
+    }
+
+    public int getDefaultMax() {
+      return defaultMax;
+    }
+
+    public void setDefaultRange(int min, int max) {
+      defaultMin = min;
+      defaultMax = max;
+    }
+
+    /** @return all values between {@link #getMin()} and {@link #getMax()} */
+    public List<Integer> getValuesAsList() {
+      ArrayList<Integer> r = new ArrayList<>(getRangeSize());
+      for (int i = min; i <= max; i++) {
+        r.add(i);
+      }
+      return r;
+    }
+
+    /** @return number of values between {@link #getMin()} and {@link #getMax()} */
+    public int getRangeSize() {
+      return max - min;
+    }
+  }
+
+  protected String name;
+  protected int min;
+  protected int max;
+
+  protected PermissionRange() {}
+
+  public PermissionRange(String name, int min, int max) {
+    this.name = name;
+
+    if (min <= max) {
+      this.min = min;
+      this.max = max;
+    } else {
+      this.min = 0;
+      this.max = 0;
+    }
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public boolean isLabel() {
+    return Permission.isLabel(getName());
+  }
+
+  public String getLabel() {
+    return Permission.extractLabel(getName());
+  }
+
+  public int getMin() {
+    return min;
+  }
+
+  public int getMax() {
+    return max;
+  }
+
+  /** True if the value is within the range. */
+  public boolean contains(int value) {
+    return getMin() <= value && value <= getMax();
+  }
+
+  /** Normalize the value to fit within the bounds of the range. */
+  public int squash(int value) {
+    return Math.min(Math.max(getMin(), value), getMax());
+  }
+
+  /** True both {@link #getMin()} and {@link #getMax()} are 0. */
+  public boolean isEmpty() {
+    return getMin() == 0 && getMax() == 0;
+  }
+
+  @Override
+  public int compareTo(PermissionRange o) {
+    return getName().compareTo(o.getName());
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder r = new StringBuilder();
+    if (getMin() < 0 && getMax() == 0) {
+      r.append(getMin());
+      r.append(' ');
+    } else {
+      if (getMin() != getMax()) {
+        if (0 <= getMin()) {
+          r.append('+');
+        }
+        r.append(getMin());
+        r.append("..");
+      }
+      if (0 <= getMax()) {
+        r.append('+');
+      }
+      r.append(getMax());
+      r.append(' ');
+    }
+    return r.toString();
+  }
+}
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..d206e88
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/AbstractElasticIndex.java
@@ -0,0 +1,429 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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().indicesExistParams();
+    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(client.adapter()), 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(ElasticQueryAdapter adapter) {
+    return gson.toJson(ImmutableMap.of(SETTINGS, ElasticSetting.createSetting(config, adapter)));
+  }
+
+  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 mappings = new JsonObject();
+
+    if (client.adapter().omitType()) {
+      mappings.add(MAPPINGS, gson.toJsonTree(properties));
+    } else {
+      JsonObject mappingType = new JsonObject();
+      mappingType.add(type, gson.toJsonTree(properties));
+      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");
+
+    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().omitType()) {
+      return encodedIndexName + "/" + request;
+    }
+    String encodedTypeIfAny =
+        client.adapter().omitType() ? "" : "/" + URLEncoder.encode(type, UTF_8.toString());
+    return encodedIndexName + encodedTypeIfAny + "/" + 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..5a43ba8d
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticChangeIndex.java
@@ -0,0 +1,435 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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.deleteToReplace()) {
+      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().omitType()) {
+      if (client.adapter().useV6Type()) {
+        if (!Sets.intersection(statuses, OPEN_STATUSES).isEmpty()
+            || !Sets.intersection(statuses, CLOSED_STATUSES).isEmpty()) {
+          indexes.add(ElasticQueryAdapter.V6_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");
+
+    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().useV5Type()) {
+      return delete(client.adapter().getType(), c);
+    }
+    return delete(OPEN_CHANGES, c) + delete(CLOSED_CHANGES, c);
+  }
+
+  @Override
+  protected String getMappings() {
+    if (!client.adapter().useV5Type()) {
+      return getMappingsFor(client.adapter().getType(), 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..cbe9bc7
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticConfiguration.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.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 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_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_NUMBER_OF_SHARDS = 0;
+  static final int DEFAULT_NUMBER_OF_REPLICAS = 1;
+
+  private final Config cfg;
+  private final List<HttpHost> hosts;
+
+  final String username;
+  final String password;
+  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.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);
+  }
+
+  int getNumberOfShards(ElasticQueryAdapter adapter) {
+    if (numberOfShards == DEFAULT_NUMBER_OF_SHARDS) {
+      return adapter.getDefaultNumberOfShards();
+    }
+    return numberOfShards;
+  }
+}
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..72c52b0
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java
@@ -0,0 +1,125 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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.elasticsearch.ElasticVersion.V6_7;
+
+import com.google.gson.JsonObject;
+
+public class ElasticQueryAdapter {
+  static final String V6_TYPE = "_doc";
+
+  private static final String INCLUDE_TYPE = "include_type_name=true";
+  private static final String INDICES = "?allow_no_indices=false";
+
+  private final boolean useV5Type;
+  private final boolean useV6Type;
+  private final boolean omitType;
+  private final int defaultNumberOfShards;
+
+  private final String searchFilteringName;
+  private final String indicesExistParams;
+  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.useV5Type = !version.isV6OrLater();
+    this.useV6Type = version.isV6();
+    this.omitType = version.isV7OrLater();
+    this.defaultNumberOfShards = version.isV7OrLater() ? 1 : 5;
+    this.versionDiscoveryUrl = version.isV6OrLater() ? "/%s*" : "/%s*/_aliases";
+    this.searchFilteringName = "_source";
+    this.indicesExistParams =
+        version.isAtLeastMinorVersion(V6_7) ? INDICES + "&" + INCLUDE_TYPE : INDICES;
+    this.exactFieldType = "keyword";
+    this.stringFieldType = "text";
+    this.indexProperty = "true";
+    this.rawFieldsKey = "_source";
+    this.includeTypeNameParam = version.isAtLeastMinorVersion(V6_7) ? "?" + INCLUDE_TYPE : "";
+  }
+
+  public void setType(JsonObject properties, String type) {
+    if (useV5Type) {
+      properties.addProperty("_type", type);
+    }
+  }
+
+  public String searchFilteringName() {
+    return searchFilteringName;
+  }
+
+  String indicesExistParams() {
+    return indicesExistParams;
+  }
+
+  String exactFieldType() {
+    return exactFieldType;
+  }
+
+  String stringFieldType() {
+    return stringFieldType;
+  }
+
+  String indexProperty() {
+    return indexProperty;
+  }
+
+  String rawFieldsKey() {
+    return rawFieldsKey;
+  }
+
+  boolean deleteToReplace() {
+    return useV5Type;
+  }
+
+  boolean useV5Type() {
+    return useV5Type;
+  }
+
+  boolean useV6Type() {
+    return useV6Type;
+  }
+
+  boolean omitType() {
+    return omitType;
+  }
+
+  int getDefaultNumberOfShards() {
+    return defaultNumberOfShards;
+  }
+
+  String getType() {
+    return getType("");
+  }
+
+  String getType(String type) {
+    if (useV6Type()) {
+      return V6_TYPE;
+    }
+    return useV5Type() ? 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..a67de44
--- /dev/null
+++ b/java/com/google/gerrit/elasticsearch/ElasticRestClientProvider.java
@@ -0,0 +1,147 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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());
+    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..67d6fd2
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/accounts/AccountApi.java
@@ -0,0 +1,348 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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;
+
+  /**
+   * Generate a new HTTP password.
+   *
+   * @return the generated password.
+   */
+  String generateHttpPassword() throws RestApiException;
+
+  /**
+   * Set a new HTTP password.
+   *
+   * <p>May only be invoked by administrators.
+   *
+   * @param httpPassword the new password, {@code null} to remove the password.
+   * @return the new password, {@code null} if the password was removed.
+   */
+  String setHttpPassword(String httpPassword) 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();
+    }
+
+    @Override
+    public String generateHttpPassword() throws RestApiException {
+      throw new NotImplementedException();
+    }
+
+    @Override
+    public String setHttpPassword(String httpPassword) 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..7a7e6ea
--- /dev/null
+++ b/java/com/google/gerrit/extensions/api/changes/ChangeApi.java
@@ -0,0 +1,674 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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 published comments on a change as a list.
+   *
+   * @return comments as a list; comments have the {@code revision} field set to indicate their
+   *     patch set.
+   * @throws RestApiException
+   */
+  List<CommentInfo> commentsAsList() 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;
+
+  /**
+   * Get all draft comments for the current user on a change as a list.
+   *
+   * @return drafts as a list; comments have the {@code revision} field set to indicate their patch
+   *     set.
+   * @throws RestApiException
+   */
+  List<CommentInfo> draftsAsList() 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 List<CommentInfo> commentsAsList() 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 List<CommentInfo> draftsAsList() 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..35f3567
--- /dev/null
+++ b/java/com/google/gerrit/extensions/registration/DynamicSet.java
@@ -0,0 +1,332 @@
+// Copyright (C) 2012 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+/**
+ * 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());
+  }
+
+  public Stream<T> stream() {
+    return StreamSupport.stream(spliterator(), false);
+  }
+
+  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/java/com/google/gerrit/extensions/restapi/RestApiException.java b/java/com/google/gerrit/extensions/restapi/RestApiException.java
new file mode 100644
index 0000000..b09723e
--- /dev/null
+++ b/java/com/google/gerrit/extensions/restapi/RestApiException.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.extensions.restapi;
+
+/** Root exception type for REST API failures. */
+public class RestApiException extends Exception {
+  private static final long serialVersionUID = 1L;
+  private CacheControl caching = CacheControl.NONE;
+
+  public RestApiException() {}
+
+  public RestApiException(String msg) {
+    super(msg);
+  }
+
+  public RestApiException(String msg, Throwable cause) {
+    super(msg, cause);
+  }
+
+  public CacheControl caching() {
+    return caching;
+  }
+
+  @SuppressWarnings("unchecked")
+  public <T extends RestApiException> T caching(CacheControl c) {
+    caching = c;
+    return (T) this;
+  }
+}
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..b50dfeb
--- /dev/null
+++ b/java/com/google/gerrit/gpg/server/DeleteGpgKey.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.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.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
+import com.google.common.io.BaseEncoding;
+import com.google.gerrit.common.errors.EmailException;
+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.gerrit.server.mail.send.DeleteKeySender;
+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 static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  private final Provider<PersonIdent> serverIdent;
+  private final Provider<PublicKeyStore> storeProvider;
+  private final Provider<AccountsUpdate> accountsUpdateProvider;
+  private final ExternalIds externalIds;
+  private final DeleteKeySender.Factory deleteKeySenderFactory;
+
+  @Inject
+  DeleteGpgKey(
+      @GerritPersonIdent Provider<PersonIdent> serverIdent,
+      Provider<PublicKeyStore> storeProvider,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      ExternalIds externalIds,
+      DeleteKeySender.Factory deleteKeySenderFactory) {
+    this.serverIdent = serverIdent;
+    this.storeProvider = storeProvider;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.externalIds = externalIds;
+    this.deleteKeySenderFactory = deleteKeySenderFactory;
+  }
+
+  @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:
+          try {
+            deleteKeySenderFactory
+                .create(rsrc.getUser(), ImmutableList.of(PublicKeyStore.keyToString(key)))
+                .send();
+          } catch (EmailException e) {
+            logger.atSevere().withCause(e).log(
+                "Cannot send GPG key deletion message to %s",
+                rsrc.getUser().getAccount().getPreferredEmail());
+          }
+          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..2a7de58
--- /dev/null
+++ b/java/com/google/gerrit/gpg/server/PostGpgKeys.java
@@ -0,0 +1,312 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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.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.mail.send.DeleteKeySender;
+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 addKeySenderFactory;
+  private final DeleteKeySender.Factory deleteKeySenderFactory;
+  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 addKeySenderFactory,
+      DeleteKeySender.Factory deleteKeySenderFactory,
+      Provider<InternalAccountQuery> accountQueryProvider,
+      ExternalIds externalIds,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider) {
+    this.serverIdent = serverIdent;
+    this.self = self;
+    this.storeProvider = storeProvider;
+    this.checkerFactory = checkerFactory;
+    this.addKeySenderFactory = addKeySenderFactory;
+    this.deleteKeySenderFactory = deleteKeySenderFactory;
+    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<>();
+      IdentifiedUser user = rsrc.getUser();
+      for (PGPPublicKeyRing keyRing : keyRings) {
+        PGPPublicKey key = keyRing.getPublicKey();
+        // Don't check web of trust; admins can fill in certifications later.
+        CheckResult result = checkerFactory.create(user, 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(user.newCommitterIdent(committer.getWhen(), committer.getTimeZone()));
+      cb.setCommitter(committer);
+
+      RefUpdate.Result saveResult = store.save(cb);
+      switch (saveResult) {
+        case NEW:
+        case FAST_FORWARD:
+        case FORCED:
+          if (!addedKeys.isEmpty()) {
+            try {
+              addKeySenderFactory.create(user, addedKeys).send();
+            } catch (EmailException e) {
+              logger.atSevere().withCause(e).log(
+                  "Cannot send GPG key added message to %s",
+                  rsrc.getUser().getAccount().getPreferredEmail());
+            }
+          }
+          if (!toRemove.isEmpty()) {
+            try {
+              deleteKeySenderFactory
+                  .create(user, toRemove.stream().map(Fingerprint::toString).collect(toList()))
+                  .send();
+            } catch (EmailException e) {
+              logger.atSevere().withCause(e).log(
+                  "Cannot send GPG key deleted message to %s",
+                  user.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..d09b4dd
--- /dev/null
+++ b/java/com/google/gerrit/httpd/WebSessionManager.java
@@ -0,0 +1,318 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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;
+    }
+
+    /**
+     * Parse an Account.Id.
+     *
+     * <p>This is public so that plugins that implement a web session, can also implement a way to
+     * clear per user sessions.
+     *
+     * @return account ID.
+     */
+    public 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..98fbdfe
--- /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 it is enabled.
+        if (!(p.equals("/") && options.enableGwtUi())) {
+          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..ffd5b59
--- /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().withCause(err).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..bac0c53
--- /dev/null
+++ b/java/com/google/gerrit/launcher/BUILD
@@ -0,0 +1,7 @@
+# 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"],
+    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..60d21f9
--- /dev/null
+++ b/java/com/google/gerrit/launcher/GerritLauncher.java
@@ -0,0 +1,764 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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.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 program.
+   *
+   * <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 program 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;
+
+    Path dir;
+    String sourceRoot = System.getProperty("sourceRoot");
+    if (sourceRoot != null) {
+      dir = Paths.get(sourceRoot);
+      if (!Files.exists(dir)) {
+        throw new FileNotFoundException("source root not found: " + dir);
+      }
+    } else {
+      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 WORKSPACE.
+      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..34b2c49
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/BaseInit.java
@@ -0,0 +1,532 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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);
+        try {
+          run.upgradeSchema();
+        } catch (OrmException e) {
+          String msg = "Couldn't upgrade schema. Expected if slave and read-only database";
+          System.err.println(msg);
+          logger.atWarning().withCause(e).log(msg);
+        }
+
+        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..846bb82
--- /dev/null
+++ b/java/com/google/gerrit/pgm/init/SitePathInitializer.java
@@ -0,0 +1,186 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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("AddKeyHtml.soy");
+    extractMailExample("ChangeFooter.soy");
+    extractMailExample("ChangeFooterHtml.soy");
+    extractMailExample("ChangeSubject.soy");
+    extractMailExample("Comment.soy");
+    extractMailExample("CommentHtml.soy");
+    extractMailExample("CommentFooter.soy");
+    extractMailExample("CommentFooterHtml.soy");
+    extractMailExample("DeleteKey.soy");
+    extractMailExample("DeleteKeyHtml.soy");
+    extractMailExample("DeleteReviewer.soy");
+    extractMailExample("DeleteReviewerHtml.soy");
+    extractMailExample("DeleteVote.soy");
+    extractMailExample("DeleteVoteHtml.soy");
+    extractMailExample("Footer.soy");
+    extractMailExample("FooterHtml.soy");
+    extractMailExample("HeaderHtml.soy");
+    extractMailExample("HttpPasswordUpdate.soy");
+    extractMailExample("HttpPasswordUpdateHtml.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..5930c6c
--- /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).normalize();
+  }
+
+  protected Provider<DataSource> dsProvider;
+
+  private Path sitePath = Paths.get(".");
+
+  protected SiteProgram() {}
+
+  protected SiteProgram(Path sitePath, Provider<DataSource> dsProvider) {
+    this.sitePath = sitePath.normalize();
+    this.dsProvider = dsProvider;
+  }
+
+  protected SiteProgram(Path sitePath) {
+    this(sitePath, null);
+  }
+
+  /** @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..67f5f85
--- /dev/null
+++ b/java/com/google/gerrit/server/StarredChangesUtil.java
@@ -0,0 +1,526 @@
+// Copyright (C) 2015 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.git.LockFailureException;
+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);
+        if (ref != null) {
+          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) {
+          String message =
+              String.format(
+                  "Unstar change %d failed, ref %s could not be deleted: %s",
+                  changeId.get(), command.getRefName(), command.getResult());
+          if (command.getResult() == ReceiveCommand.Result.LOCK_FAILURE) {
+            throw new LockFailureException(message, batchUpdate);
+          }
+          throw new IOException(message);
+        }
+      }
+      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..a5459d1
--- /dev/null
+++ b/java/com/google/gerrit/server/UsedAt.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;
+
+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,
+    COLLABNET,
+    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..acd7bd3
--- /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 Optional.empty();
+    }
+  }
+
+  @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 Optional.empty();
+    }
+  }
+
+  @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..9c35232a
--- /dev/null
+++ b/java/com/google/gerrit/server/account/externalids/ExternalIdNotes.java
@@ -0,0 +1,977 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 {
+    if (revision != null) {
+      logger.atFine().log("Reading external ID note map");
+      noteMap = NoteMap.read(reader, revision);
+    } else {
+      noteMap = 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, but 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 doesn't match 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..673f5ae
--- /dev/null
+++ b/java/com/google/gerrit/server/api/accounts/AccountApiImpl.java
@@ -0,0 +1,628 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.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.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.PutHttpPassword;
+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;
+  private final PutHttpPassword putHttpPassword;
+
+  @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,
+      PutHttpPassword putPassword,
+      @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;
+    this.putHttpPassword = putPassword;
+  }
+
+  @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);
+    }
+  }
+
+  @Override
+  public String generateHttpPassword() throws RestApiException {
+    HttpPasswordInput input = new HttpPasswordInput();
+    input.generate = true;
+    try {
+      // Response should never be 'none' for a generated password, but
+      // let's make sure.
+      Response<String> result = putHttpPassword.apply(account, input);
+      return result.isNone() ? null : result.value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot generate HTTP password", e);
+    }
+  }
+
+  @Override
+  public String setHttpPassword(String password) throws RestApiException {
+    HttpPasswordInput input = new HttpPasswordInput();
+    input.generate = false;
+    input.httpPassword = password;
+    try {
+      Response<String> result = putHttpPassword.apply(account, input);
+      return result.isNone() ? null : result.value();
+    } catch (Exception e) {
+      throw asRestApiException("Cannot generate HTTP password", 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..db023b6
--- /dev/null
+++ b/java/com/google/gerrit/server/api/changes/ChangeApiImpl.java
@@ -0,0 +1,775 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 List<CommentInfo> commentsAsList() throws RestApiException {
+    try {
+      return listComments.getComments(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 List<CommentInfo> draftsAsList() throws RestApiException {
+    try {
+      return listDrafts.getComments(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..0a3b236
--- /dev/null
+++ b/java/com/google/gerrit/server/api/projects/CommitApiImpl.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.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.common.CommitInfo;
+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.gerrit.server.restapi.project.GetCommit;
+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 GetCommit getCommit;
+  private final CherryPickCommit cherryPickCommit;
+  private final CommitIncludedIn includedIn;
+  private final CommitResource commitResource;
+
+  @Inject
+  CommitApiImpl(
+      Changes changes,
+      GetCommit getCommit,
+      CherryPickCommit cherryPickCommit,
+      CommitIncludedIn includedIn,
+      @Assisted CommitResource commitResource) {
+    this.changes = changes;
+    this.getCommit = getCommit;
+    this.cherryPickCommit = cherryPickCommit;
+    this.includedIn = includedIn;
+    this.commitResource = commitResource;
+  }
+
+  @Override
+  public CommitInfo get() throws RestApiException {
+    try {
+      return getCommit.apply(commitResource);
+    } catch (Exception e) {
+      throw asRestApiException("Cannot get commit info", e);
+    }
+  }
+
+  @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..d155f89
--- /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 {@code empty} for anonymous access.
+   */
+  public final Optional<String> getUsername() {
+    return username;
+  }
+
+  /**
+   * Returns the user's credentials
+   *
+   * @return user's credentials or {@code empty}.
+   */
+  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..8e294b7
--- /dev/null
+++ b/java/com/google/gerrit/server/auth/ldap/Helper.java
@@ -0,0 +1,506 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 supportAnonymous;
+  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.supportAnonymous = config.getBoolean("ldap", "supportAnonymous", true);
+    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);
+    }
+
+    if (!supportAnonymous && username != null) {
+      env.put(Context.SECURITY_PRINCIPAL, username);
+      env.put(Context.SECURITY_CREDENTIALS, password);
+    }
+
+    LdapContext ctx = createContext(env);
+
+    if (supportAnonymous && 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 {
+      env.put(Context.REFERRAL, referral);
+
+      if (!supportAnonymous) {
+        env.put(Context.SECURITY_AUTHENTICATION, "simple");
+        env.put(Context.SECURITY_PRINCIPAL, dn);
+        env.put(Context.SECURITY_CREDENTIALS, password);
+      }
+
+      LdapContext ctx = createContext(env);
+
+      if (supportAnonymous) {
+        ctx.addToEnvironment(Context.SECURITY_AUTHENTICATION, "simple");
+        ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, dn);
+        ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password);
+        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..d96229e
--- /dev/null
+++ b/java/com/google/gerrit/server/change/ChangeKindCacheImpl.java
@@ -0,0 +1,439 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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(rw, prior, next)) {
+            return ChangeKind.NO_CODE_CHANGE;
+          }
+          return ChangeKind.REWORK;
+        }
+
+        if (isSameDeltaAndTree(rw, 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(RevWalk rw, RevCommit prior, RevCommit next)
+        throws IOException {
+      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++) {
+        // Parse parent commits so that their trees are available.
+        rw.parseCommit(prior.getParent(i));
+        rw.parseCommit(next.getParent(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..7882ec7
--- /dev/null
+++ b/java/com/google/gerrit/server/config/GerritGlobalModule.java
@@ -0,0 +1,420 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.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.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(CapabilityCollection.Factory.class);
+    factory(ChangeData.AssistedFactory.class);
+    factory(ChangeJson.AssistedFactory.class);
+    factory(LabelsJson.Factory.class);
+    factory(MergeUtil.Factory.class);
+    factory(PatchScriptFactory.Factory.class);
+    factory(ProjectState.Factory.class);
+    factory(RevisionJson.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..963107a2
--- /dev/null
+++ b/java/com/google/gerrit/server/config/ScheduleConfig.java
@@ -0,0 +1,358 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 = 06: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 != INVALID_CONFIG && interval <= 0) {
+      logger.atSevere().log("Invalid interval value \"%d\" for \"%s\": must be > 0", interval, key);
+      interval = INVALID_CONFIG;
+    }
+
+    if (initialDelay != INVALID_CONFIG && initialDelay < 0) {
+      logger.atSevere().log(
+          "Invalid initial delay value \"%d\" for \"%s\": must be >= 0", initialDelay, key);
+      initialDelay = INVALID_CONFIG;
+    }
+
+    if (interval == INVALID_CONFIG || initialDelay == INVALID_CONFIG) {
+      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) {
+      // We only need to log the exception message; it already includes the
+      // section.subsection.key and bad value.
+      logger.atSevere().log("%s", e.getMessage());
+      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) {
+      logger.atSevere().log("Invalid start time: %s", e.getMessage());
+      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..740daf0
--- /dev/null
+++ b/java/com/google/gerrit/server/config/UrlFormatter.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.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 the URL for viewing a file in a given patch set of a change. */
+  default Optional<String> getPatchFileView(Change change, int patchsetId, String filename) {
+    return getChangeViewUrl(change.getProject(), change.getId())
+        .map(url -> url + "/" + patchsetId + "/" + filename);
+  }
+
+  /** Returns the URL for viewing a comment in a file in a given patch set of a change. */
+  default Optional<String> getInlineCommentView(
+      Change change, int patchsetId, String filename, short side, int startLine) {
+    return getPatchFileView(change, patchsetId, filename)
+        .map(url -> url + String.format("@%s%d", side == 0 ? "a" : "", startLine));
+  }
+
+  /** Returns a URL pointing to a section of the settings page. */
+  default Optional<String> getSettingsUrl() {
+    return getWebUrl().map(url -> url + "settings");
+  }
+
+  /**
+   * Returns a URL pointing to a section of the settings page, or the settings page if {@code
+   * section} is null.
+   */
+  default Optional<String> getSettingsUrl(@Nullable String section) {
+    return Strings.isNullOrEmpty(section)
+        ? getSettingsUrl()
+        : getSettingsUrl().map(url -> url + "#" + 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..aba4c53
--- /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 final 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..44b4921
--- /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;
+
+  protected final DynamicItem<UrlFormatter> urlFormatter;
+
+  @Inject
+  public 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..b6c5f25
--- /dev/null
+++ b/java/com/google/gerrit/server/git/MergeUtil.java
@@ -0,0 +1,1026 @@
+// Copyright (C) 2012 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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;
+  }
+
+  @SuppressWarnings("resource") // TemporaryBuffer requires calling close before reading.
+  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();
+      TemporaryBuffer buf = null;
+      try {
+        // TODO(dborowitz): Respect inCoreLimit here.
+        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));
+        }
+      } finally {
+        if (buf != null) {
+          buf.destroy();
+        }
+      }
+    }
+
+    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..7f18e1b
--- /dev/null
+++ b/java/com/google/gerrit/server/git/MergedByPushOp.java
@@ -0,0 +1,214 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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,
+        @Assisted("refName") String refName,
+        @Assisted("mergeResultRevId") String mergeResultRevId);
+  }
+
+  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 final String mergeResultRevId;
+
+  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("refName") String refName,
+      @Assisted("mergeResultRevId") String mergeResultRevId) {
+    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;
+    this.mergeResultRevId = mergeResultRevId;
+  }
+
+  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();
+    if (change.isWorkInProgress()) {
+      change.setWorkInProgress(false);
+      update.setWorkInProgress(false);
+    }
+    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(), mergeResultRevId, 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..2e79a1a
--- /dev/null
+++ b/java/com/google/gerrit/server/git/meta/VersionedMetaData.java
@@ -0,0 +1,590 @@
+// 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.gerrit.common.Nullable;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.git.LockFailureException;
+import com.google.gerrit.server.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+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);
+    }
+  }
+
+  /** 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[] {};
+    }
+
+    try (TraceTimer timer =
+            TraceContext.newTimer(
+                "Read file '%s' from ref '%s' of project '%s' from revision '%s'",
+                fileName, getRefName(), projectName, revision.name());
+        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 {
+    try (TraceTimer timer =
+        TraceContext.newTimer(
+            "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..a2d8e94
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/BranchCommitValidator.java
@@ -0,0 +1,156 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 {
+    return validCommit(objectReader, cmd, commit, isMerged, messages, rejectCommits, change, false);
+  }
+
+  /**
+   * 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.
+   * @param skipValidation whether 'skip-validation' was requested.
+   */
+  public boolean validCommit(
+      ObjectReader objectReader,
+      ReceiveCommand cmd,
+      RevCommit commit,
+      boolean isMerged,
+      List<ValidationMessage> messages,
+      NoteMap rejectCommits,
+      @Nullable Change change,
+      boolean skipValidation)
+      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,
+                skipValidation);
+      }
+
+      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..414f63a
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
@@ -0,0 +1,3253 @@
+// 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 {
+    try {
+      receivePack.getRevWalk().parseCommit(cmd.getNewId());
+    } 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 (!validRefOperation(cmd)) {
+      return;
+    }
+    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,
+                  checkMergedInto ? inputCommand.getNewId().name() : null,
+                  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 {
+    boolean skipValidation =
+        !RefNames.REFS_CONFIG.equals(cmd.getRefName())
+            && !(MagicBranch.isMagicBranch(cmd.getRefName())
+                || NEW_PATCHSET_PATTERN.matcher(cmd.getRefName()).matches())
+            && pushOptions.containsKey(PUSH_OPTION_SKIP_VALIDATION);
+    if (skipValidation) {
+      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);
+      }
+    }
+
+    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; ) {
+        // Even if skipValidation is set, we still get here when at least one plugin
+        // commit validator requires to validate all commits. In this case, however,
+        // we don't need to check the commit limit.
+        if (++n > limit && !skipValidation) {
+          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, skipValidation)) {
+          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.sort(RevSort.REVERSE);
+              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, newTip.getId().getName()));
+                    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, newTip.getId().getName())
+                        .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..af4eab0
--- /dev/null
+++ b/java/com/google/gerrit/server/git/receive/ReplaceOp.java
@@ -0,0 +1,687 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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,
+        @Nullable String mergeResultRevId,
+        @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 String mergeResultRevId;
+  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 @Nullable String mergeResultRevId,
+      @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.mergeResultRevId = mergeResultRevId;
+    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, mergeResultRevId);
+      }
+    }
+
+    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..7ab2ada
--- /dev/null
+++ b/java/com/google/gerrit/server/git/validators/CommitValidators.java
@@ -0,0 +1,900 @@
+// Copyright (C) 2012 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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,
+        boolean skipValidation)
+        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, skipValidation),
+              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 boolean skipValidation;
+    private final PluginSetContext<CommitValidationListener> commitValidationListeners;
+
+    public PluginCommitValidationListener(
+        final PluginSetContext<CommitValidationListener> commitValidationListeners) {
+      this(commitValidationListeners, false);
+    }
+
+    public PluginCommitValidationListener(
+        final PluginSetContext<CommitValidationListener> commitValidationListeners,
+        boolean skipValidation) {
+      this.skipValidation = skipValidation;
+      this.commitValidationListeners = commitValidationListeners;
+    }
+
+    private void runValidator(
+        CommitValidationListener validator,
+        List<CommitValidationMessage> messages,
+        CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      if (skipValidation && !validator.shouldValidateAllCommits()) {
+        return;
+      }
+      messages.addAll(validator.onCommitReceived(receiveEvent));
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent)
+        throws CommitValidationException {
+      List<CommitValidationMessage> messages = new ArrayList<>();
+      try {
+        commitValidationListeners.runEach(
+            l -> runValidator(l, messages, receiveEvent), CommitValidationException.class);
+      } catch (CommitValidationException e) {
+        messages.addAll(e.getMessages());
+        throw new CommitValidationException(e.getMessage(), messages);
+      }
+      return messages;
+    }
+
+    @Override
+    public boolean shouldValidateAllCommits() {
+      return commitValidationListeners.stream().anyMatch(v -> v.shouldValidateAllCommits());
+    }
+  }
+
+  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..ad3813a6
--- /dev/null
+++ b/java/com/google/gerrit/server/group/db/GroupsUpdate.java
@@ -0,0 +1,502 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.common.flogger.FluentLogger;
+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.logging.TraceContext;
+import com.google.gerrit.server.logging.TraceContext.TraceTimer;
+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 static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  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 {
+    try (TraceTimer timer =
+        TraceContext.newTimer(
+            "Creating group '%s'", groupUpdate.getName().orElseGet(groupCreation::getNameKey))) {
+      InternalGroup createdGroup = createGroupInNoteDbWithRetry(groupCreation, groupUpdate);
+      evictCachesOnGroupCreation(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 {
+    try (TraceTimer timer = TraceContext.newTimer("Updating group %s", groupUuid)) {
+      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);
+      evictCachesOnGroupUpdate(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 evictCachesOnGroupCreation(InternalGroup createdGroup) throws IOException {
+    logger.atFine().log("evict caches on creation of group %s", createdGroup.getGroupUUID());
+    // 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 evictCachesOnGroupUpdate(UpdateResult result) throws IOException {
+    logger.atFine().log("evict caches on update of group %s", result.getGroupUuid());
+    // 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/OnlineReindexMode.java b/java/com/google/gerrit/server/index/OnlineReindexMode.java
new file mode 100644
index 0000000..123229a
--- /dev/null
+++ b/java/com/google/gerrit/server/index/OnlineReindexMode.java
@@ -0,0 +1,33 @@
+// 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.server.index;
+
+import java.util.Optional;
+
+public class OnlineReindexMode {
+  private static ThreadLocal<Boolean> isOnlineReindex = new ThreadLocal<>();
+
+  public static boolean isActive() {
+    return Optional.ofNullable(isOnlineReindex.get()).orElse(Boolean.FALSE);
+  }
+
+  public static void begin() {
+    isOnlineReindex.set(Boolean.TRUE);
+  }
+
+  public static void end() {
+    isOnlineReindex.set(Boolean.FALSE);
+  }
+}
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..927440e
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/AllChangesIndexer.java
@@ -0,0 +1,272 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.index.OnlineReindexMode;
+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()) {
+        OnlineReindexMode.begin();
+
+        // 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());
+      } finally {
+        OnlineReindexMode.end();
+      }
+      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..5e75c48
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/ChangeIndexer.java
@@ -0,0 +1,543 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.base.Objects;
+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.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+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;
+
+  private final Set<IndexTask> queuedIndexTasks =
+      Collections.newSetFromMap(new ConcurrentHashMap<>());
+  private final Set<ReindexIfStaleTask> queuedReindexIfStaleTasks =
+      Collections.newSetFromMap(new ConcurrentHashMap<>());
+
+  @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) {
+    IndexTask task = new IndexTask(project, id);
+    if (queuedIndexTasks.add(task)) {
+      return submit(task);
+    }
+    return Futures.immediateCheckedFuture(null);
+  }
+
+  /**
+   * 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) {
+    ReindexIfStaleTask task = new ReindexIfStaleTask(project, id);
+    if (queuedReindexIfStaleTasks.add(task)) {
+      return submit(task, batchExecutor);
+    }
+    return Futures.immediateCheckedFuture(false);
+  }
+
+  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;
+
+    protected abstract void remove();
+
+    @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 {
+      remove();
+      ChangeData cd = newChangeData(db.get(), project, id);
+      index(cd);
+      return null;
+    }
+
+    @Override
+    public int hashCode() {
+      return Objects.hashCode(IndexTask.class, id.get());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof IndexTask)) {
+        return false;
+      }
+      IndexTask other = (IndexTask) obj;
+      return id.get() == other.id.get();
+    }
+
+    @Override
+    public String toString() {
+      return "index-change-" + id;
+    }
+
+    @Override
+    protected void remove() {
+      queuedIndexTasks.remove(this);
+    }
+  }
+
+  // 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 {
+      remove();
+      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 int hashCode() {
+      return Objects.hashCode(ReindexIfStaleTask.class, id.get());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof ReindexIfStaleTask)) {
+        return false;
+      }
+      ReindexIfStaleTask other = (ReindexIfStaleTask) obj;
+      return id.get() == other.id.get();
+    }
+
+    @Override
+    public String toString() {
+      return "reindex-if-stale-change-" + id;
+    }
+
+    @Override
+    protected void remove() {
+      queuedReindexIfStaleTasks.remove(this);
+    }
+  }
+
+  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..be4f38c
--- /dev/null
+++ b/java/com/google/gerrit/server/index/change/ReindexAfterRefUpdate.java
@@ -0,0 +1,237 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.base.Objects;
+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.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+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;
+
+  private final Set<Index> queuedIndexTasks = Collections.newSetFromMap(new ConcurrentHashMap<>());
+
+  @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) {
+              Index task = new Index(event, c.getId());
+              if (queuedIndexTasks.add(task)) {
+                // Don't retry indefinitely; if this fails changes may be stale.
+                @SuppressWarnings("unused")
+                Future<?> possiblyIgnoredError = executor.submit(task);
+              }
+            }
+          }
+
+          @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;
+
+    protected abstract void remove();
+  }
+
+  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();
+    }
+
+    @Override
+    protected void remove() {}
+  }
+
+  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();
+      remove();
+      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 int hashCode() {
+      return Objects.hashCode(Index.class, id.get());
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+      if (!(obj instanceof Index)) {
+        return false;
+      }
+      Index other = (Index) obj;
+      return id.get() == other.id.get();
+    }
+
+    @Override
+    public String toString() {
+      return "Index change " + id.get() + " of project " + event.getProjectName();
+    }
+
+    @Override
+    protected void remove() {
+      queuedIndexTasks.remove(this);
+    }
+  }
+}
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..5c0406d
--- /dev/null
+++ b/java/com/google/gerrit/server/logging/TraceContext.java
@@ -0,0 +1,313 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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);
+  }
+
+  /**
+   * 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
+   * @param arg4 fourth argument for the message
+   * @return the trace timer
+   */
+  public static TraceTimer newTimer(
+      String format, Object arg1, Object arg2, Object arg3, Object arg4) {
+    return new TraceTimer(format, arg1, arg2, arg3, arg4);
+  }
+
+  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(
+        String format,
+        @Nullable Object arg1,
+        @Nullable Object arg2,
+        @Nullable Object arg3,
+        @Nullable Object arg4) {
+      this(
+          elapsedMs -> logger.atFine().log(format + " (%d ms)", arg1, arg2, arg3, arg4, 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..7701c18
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/AddKeySender.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.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.mail.Address;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountSshKey;
+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 IdentifiedUser user;
+  private final AccountSshKey sshKey;
+  private final List<String> gpgKeys;
+
+  @AssistedInject
+  public AddKeySender(
+      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted AccountSshKey sshKey) {
+    super(ea, "addkey");
+    this.user = user;
+    this.sshKey = sshKey;
+    this.gpgKeys = null;
+  }
+
+  @AssistedInject
+  public AddKeySender(
+      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted List<String> gpgKeys) {
+    super(ea, "addkey");
+    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;
+    }
+
+    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..90f43d8
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/CommentSender.java
@@ -0,0 +1,572 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 getFileLink() {
+      return args.urlFormatter
+          .get()
+          .getPatchFileView(change, patchSetId, KeyUtil.encode(filename))
+          .orElse(null);
+    }
+
+    /** @return a web link to a comment within a given patch set and file. */
+    public String getCommentLink(short side, int startLine) {
+      return args.urlFormatter
+          .get()
+          .getInlineCommentView(change, patchSetId, KeyUtil.encode(filename), side, startLine)
+          .orElse(null);
+    }
+
+    /**
+     * @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.getFileLink());
+      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.getFileLink());
+        } else {
+          commentData.put("link", group.getCommentLink(comment.side, 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 %d of file on side %d", lineNbr, 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/DeleteKeySender.java b/java/com/google/gerrit/server/mail/send/DeleteKeySender.java
new file mode 100644
index 0000000..31e4e77
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/DeleteKeySender.java
@@ -0,0 +1,119 @@
+// 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.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.mail.Address;
+import com.google.gerrit.server.IdentifiedUser;
+import com.google.gerrit.server.account.AccountSshKey;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+import java.util.Collections;
+import java.util.List;
+
+public class DeleteKeySender extends OutgoingEmail {
+  public interface Factory {
+    DeleteKeySender create(IdentifiedUser user, AccountSshKey sshKey);
+
+    DeleteKeySender create(IdentifiedUser user, List<String> gpgKeyFingerprints);
+  }
+
+  private final IdentifiedUser user;
+  private final AccountSshKey sshKey;
+  private final List<String> gpgKeyFingerprints;
+
+  @AssistedInject
+  public DeleteKeySender(
+      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted AccountSshKey sshKey) {
+    super(ea, "deletekey");
+    this.user = user;
+    this.gpgKeyFingerprints = Collections.emptyList();
+    this.sshKey = sshKey;
+  }
+
+  @AssistedInject
+  public DeleteKeySender(
+      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted List<String> gpgKeyFingerprints) {
+    super(ea, "deletekey");
+    this.user = user;
+    this.gpgKeyFingerprints = gpgKeyFingerprints;
+    this.sshKey = null;
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+    setHeader("Subject", String.format("[Gerrit Code Review] %s Keys Deleted", getKeyType()));
+    add(RecipientType.TO, new Address(getEmail()));
+  }
+
+  @Override
+  protected boolean shouldSendMessage() {
+    return true;
+  }
+
+  @Override
+  protected void format() throws EmailException {
+    appendText(textTemplate("DeleteKey"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("DeleteKeyHtml"));
+    }
+  }
+
+  public String getEmail() {
+    return user.getAccount().getPreferredEmail();
+  }
+
+  public String getUserNameEmail() {
+    return getUserNameEmailFor(user.getAccountId());
+  }
+
+  public String getKeyType() {
+    if (sshKey != null) {
+      return "SSH";
+    } else if (gpgKeyFingerprints != null) {
+      return "GPG";
+    }
+    throw new IllegalStateException("key type is not SSH or GPG");
+  }
+
+  public String getSshKey() {
+    return (sshKey != null) ? sshKey.sshPublicKey() + "\n" : null;
+  }
+
+  public String getGpgKeyFingerprints() {
+    if (!gpgKeyFingerprints.isEmpty()) {
+      return Joiner.on("\n").join(gpgKeyFingerprints);
+    }
+    return null;
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContextEmailData.put("email", getEmail());
+    soyContextEmailData.put("gpgKeyFingerprints", getGpgKeyFingerprints());
+    soyContextEmailData.put("keyType", getKeyType());
+    soyContextEmailData.put("sshKey", getSshKey());
+    soyContextEmailData.put("userNameEmail", getUserNameEmail());
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
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/HttpPasswordUpdateSender.java b/java/com/google/gerrit/server/mail/send/HttpPasswordUpdateSender.java
new file mode 100644
index 0000000..07e165c
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/HttpPasswordUpdateSender.java
@@ -0,0 +1,81 @@
+// 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.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.server.IdentifiedUser;
+import com.google.inject.assistedinject.Assisted;
+import com.google.inject.assistedinject.AssistedInject;
+
+public class HttpPasswordUpdateSender extends OutgoingEmail {
+  public interface Factory {
+    HttpPasswordUpdateSender create(IdentifiedUser user, String operation);
+  }
+
+  private final IdentifiedUser user;
+  private final String operation;
+
+  @AssistedInject
+  public HttpPasswordUpdateSender(
+      EmailArguments ea, @Assisted IdentifiedUser user, @Assisted String operation) {
+    super(ea, "HttpPasswordUpdate");
+    this.user = user;
+    this.operation = operation;
+  }
+
+  @Override
+  protected void init() throws EmailException {
+    super.init();
+    setHeader("Subject", "[Gerrit Code Review] HTTP password was " + operation);
+    add(RecipientType.TO, new Address(getEmail()));
+  }
+
+  @Override
+  protected boolean shouldSendMessage() {
+    // Always send an email if the HTTP password is updated.
+    return true;
+  }
+
+  @Override
+  protected void format() throws EmailException {
+    appendText(textTemplate("HttpPasswordUpdate"));
+    if (useHtml()) {
+      appendHtml(soyHtmlTemplate("HttpPasswordUpdateHtml"));
+    }
+  }
+
+  public String getEmail() {
+    return user.getAccount().getPreferredEmail();
+  }
+
+  public String getUserNameEmail() {
+    return getUserNameEmailFor(user.getAccountId());
+  }
+
+  @Override
+  protected void setupSoyContext() {
+    super.setupSoyContext();
+    soyContextEmailData.put("email", getEmail());
+    soyContextEmailData.put("userNameEmail", getUserNameEmail());
+    soyContextEmailData.put("operation", operation);
+  }
+
+  @Override
+  protected boolean supportsHtml() {
+    return true;
+  }
+}
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..3bb44c7
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/MailSoyTofuProvider.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.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",
+    "DeleteKey.soy",
+    "DeleteKeyHtml.soy",
+    "DeleteReviewer.soy",
+    "DeleteReviewerHtml.soy",
+    "DeleteVote.soy",
+    "DeleteVoteHtml.soy",
+    "InboundEmailRejection.soy",
+    "InboundEmailRejectionHtml.soy",
+    "Footer.soy",
+    "FooterHtml.soy",
+    "HeaderHtml.soy",
+    "HttpPasswordUpdate.soy",
+    "HttpPasswordUpdateHtml.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..917094e
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/NewChangeSender.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.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();
+
+    String threadId = getChangeMessageThreadId();
+    setHeader("Message-ID", threadId);
+    setHeader("References", threadId);
+
+    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..a60dfea
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/NotificationEmail.java
@@ -0,0 +1,151 @@
+// Copyright (C) 2012 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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
+    }
+    if (lastIndexSlash == -1) { // No slash in the project name
+      return projectName;
+    }
+
+    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..7ad5329
--- /dev/null
+++ b/java/com/google/gerrit/server/mail/send/OutgoingEmail.java
@@ -0,0 +1,585 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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() {
+    return args.urlFormatter.get().getSettingsUrl().orElse(null);
+  }
+
+  private 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..ef157d6
--- /dev/null
+++ b/java/com/google/gerrit/server/notedb/rebuild/NoteDbMigrator.java
@@ -0,0 +1,1066 @@
+// Copyright (C) 2017 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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;
+
+/** 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);
+  }
+
+  private static class NoteDbMigrationLoggerOut extends OutputStream {
+    private StringBuilder outputBuffer = new StringBuilder();
+
+    @Override
+    public synchronized void write(int b) throws IOException {
+      if (b == '\r' || b == '\n') {
+        logger.atInfo().log(outputBuffer.toString());
+        outputBuffer = new StringBuilder();
+      } else {
+        outputBuffer.append(b);
+      }
+    }
+  }
+
+  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 = new NoteDbMigrationLoggerOut();
+    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/java/com/google/gerrit/server/patch/PatchFile.java b/java/com/google/gerrit/server/patch/PatchFile.java
new file mode 100644
index 0000000..e950c1b
--- /dev/null
+++ b/java/com/google/gerrit/server/patch/PatchFile.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.patch;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
+
+import com.google.gerrit.common.errors.NoSuchEntityException;
+import com.google.gerrit.reviewdb.client.Patch;
+import java.io.IOException;
+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.RevObject;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.TreeWalk;
+
+/** State supporting processing of a single {@link Patch} instance. */
+public class PatchFile {
+  private final Repository repo;
+  private final PatchListEntry entry;
+  private final RevTree aTree;
+  private final RevTree bTree;
+
+  private Text a;
+  private Text b;
+
+  public PatchFile(Repository repo, PatchList patchList, String fileName)
+      throws MissingObjectException, IncorrectObjectTypeException, IOException {
+    this.repo = repo;
+    this.entry = patchList.get(fileName);
+
+    try (ObjectReader reader = repo.newObjectReader();
+        RevWalk rw = new RevWalk(reader)) {
+      final RevCommit bCommit = rw.parseCommit(patchList.getNewId());
+
+      if (Patch.COMMIT_MSG.equals(fileName)) {
+        if (patchList.getComparisonType().isAgainstParentOrAutoMerge()) {
+          a = Text.EMPTY;
+        } else {
+          // For the initial commit, we have an empty tree on Side A
+          RevObject object = rw.parseAny(patchList.getOldId());
+          a = object instanceof RevCommit ? Text.forCommit(reader, object) : Text.EMPTY;
+        }
+        b = Text.forCommit(reader, bCommit);
+
+        aTree = null;
+        bTree = null;
+      } else if (Patch.MERGE_LIST.equals(fileName)) {
+        // For the initial commit, we have an empty tree on Side A
+        RevObject object = rw.parseAny(patchList.getOldId());
+        a =
+            object instanceof RevCommit
+                ? Text.forMergeList(patchList.getComparisonType(), reader, object)
+                : Text.EMPTY;
+        b = Text.forMergeList(patchList.getComparisonType(), reader, bCommit);
+
+        aTree = null;
+        bTree = null;
+      } else {
+        if (patchList.getOldId() != null) {
+          aTree = rw.parseTree(patchList.getOldId());
+        } else {
+          final RevCommit p = bCommit.getParent(0);
+          rw.parseHeaders(p);
+          aTree = p.getTree();
+        }
+        bTree = bCommit.getTree();
+      }
+    }
+  }
+
+  private String getOldName() {
+    String name = entry.getOldName();
+    if (name != null) {
+      return name;
+    }
+    return entry.getNewName();
+  }
+
+  /**
+   * Extract a line from the file, as a string.
+   *
+   * @param file the file index to extract.
+   * @param line the line number to extract (1 based; 1 is the first line).
+   * @return the string version of the file line.
+   * @throws IOException the patch or complete file content cannot be read.
+   * @throws NoSuchEntityException
+   */
+  public String getLine(int file, int line) throws IOException, NoSuchEntityException {
+    switch (file) {
+      case 0:
+        if (a == null) {
+          a = load(aTree, getOldName());
+        }
+        return a.getString(line - 1);
+
+      case 1:
+        if (b == null) {
+          b = load(bTree, entry.getNewName());
+        }
+        return b.getString(line - 1);
+
+      default:
+        throw new NoSuchEntityException();
+    }
+  }
+
+  private Text load(ObjectId tree, String path)
+      throws MissingObjectException, IncorrectObjectTypeException, CorruptObjectException,
+          IOException {
+    if (path == null) {
+      return Text.EMPTY;
+    }
+    final TreeWalk tw = TreeWalk.forPath(repo, path, tree);
+    if (tw == null) {
+      return Text.EMPTY;
+    }
+    if (tw.getFileMode(0).getObjectType() == Constants.OBJ_BLOB) {
+      return new Text(repo.open(tw.getObjectId(0), Constants.OBJ_BLOB));
+    } else if (tw.getFileMode(0).getObjectType() == Constants.OBJ_COMMIT) {
+      String str = "Subproject commit " + ObjectId.toString(tw.getObjectId(0));
+      return new Text(str.getBytes(UTF_8));
+    } else {
+      return Text.EMPTY;
+    }
+  }
+}
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..0094979
--- /dev/null
+++ b/java/com/google/gerrit/server/permissions/ProjectControl.java
@@ -0,0 +1,447 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.common.data.AccessSection.ALL;
+import static com.google.gerrit.common.data.RefConfigSection.REGEX_PREFIX;
+import static com.google.gerrit.reviewdb.client.RefNames.REFS_TAGS;
+import static com.google.gerrit.server.util.MagicBranch.NEW_CHANGE;
+
+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(ALL).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(NEW_CHANGE)
+          || section.getName().startsWith(REGEX_PREFIX + NEW_CHANGE)) {
+        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)
+          || section.getName().startsWith(REGEX_PREFIX + 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(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..b64cfeb
--- /dev/null
+++ b/java/com/google/gerrit/server/plugincontext/PluginSetContext.java
@@ -0,0 +1,174 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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;
+import java.util.stream.Stream;
+
+/**
+ * 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));
+  }
+
+  public Stream<T> stream() {
+    return dynamicSet.stream();
+  }
+
+  /**
+   * 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..0589ac1
--- /dev/null
+++ b/java/com/google/gerrit/server/project/ProjectState.java
@@ -0,0 +1,653 @@
+// 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. Must not contain any data derived from parents other than it's
+ * immediate parent's {@link com.google.gerrit.reviewdb.client.Project.NameKey}.
+ */
+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;
+
+  @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() {
+    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));
+  }
+
+  /** 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 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..3b70eee
--- /dev/null
+++ b/java/com/google/gerrit/server/project/SubmitRuleEvaluator.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.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.index.OnlineReindexMode;
+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() || OnlineReindexMode.isActive()) && 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..3a7d3e5
--- /dev/null
+++ b/java/com/google/gerrit/server/query/account/InternalAccountQuery.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.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.Multimap;
+import com.google.common.flogger.FluentLogger;
+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.UsedAt;
+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> {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  @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()));
+  }
+
+  @UsedAt(UsedAt.Project.COLLABNET)
+  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, accountStates.stream().map(AccountState.ACCOUNT_ID_FUNCTION).collect(toList()));
+      logger.atWarning().log(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(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..8e9a08f
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ChangeData.java
@@ -0,0 +1,1287 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 = getCachedSubmitRecord(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 getCachedSubmitRecord(options);
+  }
+
+  private List<SubmitRecord> getCachedSubmitRecord(SubmitRuleOptions options) {
+    List<SubmitRecord> records = submitRecords.get(options);
+    if (records != null) {
+      return records;
+    }
+
+    if (options.allowClosed() && change != null && change.getStatus().isOpen()) {
+      SubmitRuleOptions openSubmitRuleOptions = options.toBuilder().allowClosed(false).build();
+      return submitRecords.get(openSubmitRuleOptions);
+    }
+
+    return null;
+  }
+
+  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..4cc119f
--- /dev/null
+++ b/java/com/google/gerrit/server/query/change/ChangeQueryBuilder.java
@@ -0,0 +1,1380 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.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 = allMembers.stream().limit(maxTerms).collect(toSet());
+    } 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..2a7fe9a
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteDraftComments.java
@@ -0,0 +1,212 @@
+// Copyright (C) 2018 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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();
+      }
+      ctx.dontBumpLastUpdatedOn();
+      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..a60fd8e
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/DeleteSshKey.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.server.restapi.account;
+
+import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.EmailException;
+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.IdentifiedUser;
+import com.google.gerrit.server.account.AccountResource;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
+import com.google.gerrit.server.mail.send.DeleteKeySender;
+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 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 DeleteKeySender.Factory deleteKeySenderFactory;
+
+  @Inject
+  DeleteSshKey(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      VersionedAuthorizedKeys.Accessor authorizedKeys,
+      SshKeyCache sshKeyCache,
+      DeleteKeySender.Factory deleteKeySenderFactory) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.authorizedKeys = authorizedKeys;
+    this.sshKeyCache = sshKeyCache;
+    this.deleteKeySenderFactory = deleteKeySenderFactory;
+  }
+
+  @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);
+    }
+
+    IdentifiedUser user = rsrc.getUser();
+    authorizedKeys.deleteKey(user.getAccountId(), rsrc.getSshKey().seq());
+    try {
+      deleteKeySenderFactory.create(user, rsrc.getSshKey()).send();
+    } catch (EmailException e) {
+      logger.atSevere().withCause(e).log(
+          "Cannot send SSH key deletion message to %s", user.getAccount().getPreferredEmail());
+    }
+    user.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..02f59ac
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/account/PutHttpPassword.java
@@ -0,0 +1,156 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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.common.flogger.FluentLogger;
+import com.google.gerrit.common.errors.EmailException;
+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.mail.send.HttpPasswordUpdateSender;
+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 FluentLogger logger = FluentLogger.forEnclosingClass();
+
+  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;
+  private final HttpPasswordUpdateSender.Factory httpPasswordUpdateSenderFactory;
+
+  @Inject
+  PutHttpPassword(
+      Provider<CurrentUser> self,
+      PermissionBackend permissionBackend,
+      ExternalIds externalIds,
+      @UserInitiated Provider<AccountsUpdate> accountsUpdateProvider,
+      HttpPasswordUpdateSender.Factory httpPasswordUpdateSenderFactory) {
+    this.self = self;
+    this.permissionBackend = permissionBackend;
+    this.externalIds = externalIds;
+    this.accountsUpdateProvider = accountsUpdateProvider;
+    this.httpPasswordUpdateSenderFactory = httpPasswordUpdateSenderFactory;
+  }
+
+  @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);
+  }
+
+  @UsedAt(UsedAt.Project.PLUGIN_SERVICEUSER)
+  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)));
+
+    try {
+      httpPasswordUpdateSenderFactory
+          .create(user, newPassword == null ? "deleted" : "added or updated")
+          .send();
+    } catch (EmailException e) {
+      logger.atSevere().withCause(e).log(
+          "Cannot send HttpPassword update message to %s", user.getAccount().getPreferredEmail());
+    }
+
+    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..cf40b3e
--- /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:");
+      cherryPickCommit.getFilesWithGitConflicts().stream()
+          .sorted()
+          .forEach(filePath -> stringBuilder.append("\n* ").append(filePath));
+    }
+
+    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..84283e7
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Files.java
@@ -0,0 +1,368 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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.api.GerritApi;
+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.Response;
+import com.google.gerrit.extensions.restapi.RestApiException;
+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;
+    private final GerritApi gApi;
+
+    @Inject
+    ListFiles(
+        Provider<ReviewDb> db,
+        Provider<CurrentUser> self,
+        FileInfoJson fileInfoJson,
+        Revisions revisions,
+        GitRepositoryManager gitManager,
+        PatchListCache patchListCache,
+        PatchSetUtil psUtil,
+        PluginItemContext<AccountPatchReviewStore> accountPatchReviewStore,
+        GerritApi gApi) {
+      this.db = db;
+      this.self = self;
+      this.fileInfoJson = fileInfoJson;
+      this.revisions = revisions;
+      this.gitManager = gitManager;
+      this.patchListCache = patchListCache;
+      this.psUtil = psUtil;
+      this.accountPatchReviewStore = accountPatchReviewStore;
+      this.gApi = gApi;
+    }
+
+    public ListFiles setReviewed(boolean r) {
+      this.reviewed = r;
+      return this;
+    }
+
+    @Override
+    public Response<?> apply(RevisionResource resource)
+        throws RestApiException, 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) {
+        int parents =
+            gApi.changes()
+                .id(resource.getChange().getChangeId())
+                .revision(resource.getPatchSet().getId().get())
+                .commit(false)
+                .parents
+                .size();
+        if (parentNum < 0 || parentNum > parents) {
+          throw new BadRequestException(String.format("invalid parent number: %d", parentNum));
+        }
+        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..72c5589
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListChangeComments.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.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.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 ListChangeComments extends ListChangeDrafts {
+
+  @Inject
+  ListChangeComments(
+      Provider<ReviewDb> db,
+      ChangeData.Factory changeDataFactory,
+      Provider<CommentJson> commentJson,
+      CommentsUtil commentsUtil) {
+    super(db, changeDataFactory, commentJson, commentsUtil);
+  }
+
+  @Override
+  protected Iterable<Comment> listComments(ChangeResource rsrc) throws OrmException {
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    return commentsUtil.publishedByChange(db.get(), cd.notes());
+  }
+
+  @Override
+  protected boolean includeAuthorInfo() {
+    return true;
+  }
+
+  @Override
+  public boolean requireAuthentication() {
+    return false;
+  }
+}
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..93e9284
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ListChangeDrafts.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.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.gerrit.server.restapi.change.CommentJson.CommentFormatter;
+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> {
+  protected final Provider<ReviewDb> db;
+  protected final ChangeData.Factory changeDataFactory;
+  protected final Provider<CommentJson> commentJson;
+  protected 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;
+  }
+
+  protected Iterable<Comment> listComments(ChangeResource rsrc) throws OrmException {
+    ChangeData cd = changeDataFactory.create(db.get(), rsrc.getNotes());
+    return commentsUtil.draftByChangeAuthor(db.get(), cd.notes(), rsrc.getUser().getAccountId());
+  }
+
+  protected boolean includeAuthorInfo() {
+    return false;
+  }
+
+  public boolean requireAuthentication() {
+    return true;
+  }
+
+  @Override
+  public Map<String, List<CommentInfo>> apply(ChangeResource rsrc)
+      throws AuthException, OrmException, PermissionBackendException {
+    if (requireAuthentication() && !rsrc.getUser().isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+    return getCommentFormatter().format(listComments(rsrc));
+  }
+
+  public List<CommentInfo> getComments(ChangeResource rsrc)
+      throws AuthException, OrmException, PermissionBackendException {
+    if (requireAuthentication() && !rsrc.getUser().isIdentifiedUser()) {
+      throw new AuthException("Authentication required");
+    }
+    return getCommentFormatter().formatAsList(listComments(rsrc));
+  }
+
+  private CommentFormatter getCommentFormatter() {
+    return commentJson
+        .get()
+        .setFillAccounts(includeAuthorInfo())
+        .setFillPatchSet(true)
+        .newCommentFormatter();
+  }
+}
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..3165436
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Rebase.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.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.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.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;
+    try {
+      base = rebaseUtil.parseBase(rsrc, str);
+      if (base == null) {
+        throw new ResourceConflictException("base revision is missing: " + str);
+      }
+    } catch (NoSuchChangeException e) {
+      throw new UnprocessableEntityException(
+          String.format("Base change not found: %s", input.base), e);
+    }
+
+    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..ff628db
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/ReviewersUtil.java
@@ -0,0 +1,442 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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.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 groupBackend.suggest(suggestReviewers.getQuery(), projectState).stream()
+        .limit(suggestReviewers.getLimit())
+        .collect(toList());
+  }
+
+  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..7c10117
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/change/Submit.java
@@ -0,0 +1,520 @@
+// Copyright (C) 2012 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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()) {
+        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() || !resource.isCurrent()) {
+      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..367bc71
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/group/ListGroups.java
@@ -0,0 +1,446 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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 static java.util.stream.Collectors.toList;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.Strings;
+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 =
+        groupBackend.suggest(suggest, projects.stream().findFirst().orElse(null)).stream()
+            .limit(limit <= 0 ? 10 : Math.min(limit, 10))
+            .collect(toList());
+
+    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..4c02bd2
--- /dev/null
+++ b/java/com/google/gerrit/server/restapi/project/CreateProject.java
@@ -0,0 +1,425 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 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 Provider<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 Provider<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();
+    }
+  }
+
+  // TODO(dpursehouse): Add @UsedAt annotation
+  public 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.get());
+      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..b6b3d6b
--- /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.common.Input;
+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, Input> {
+
+  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, Input 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..0b702c7
--- /dev/null
+++ b/java/com/google/gerrit/server/rules/PrologEnvironment.java
@@ -0,0 +1,265 @@
+// 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);
+    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) {
+        logger.atFine().log(
+            "predicate class is CONSULT_STREAM_2: override reductionLimit with compileLimit (%d)",
+            compileLimit);
+        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..91cdcda
--- /dev/null
+++ b/java/com/google/gerrit/server/schema/Schema_130.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.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.util.SortedSet;
+import java.util.TreeSet;
+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 (Exception 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..692884e
--- /dev/null
+++ b/java/com/google/gerrit/sshd/ChangeArgumentParser.java
@@ -0,0 +1,144 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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.Nullable;
+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, @Nullable ProjectState projectState)
+      throws UnloggedFailure, OrmException, PermissionBackendException, IOException {
+    addChange(id, changes, projectState, true);
+  }
+
+  public void addChange(
+      String id,
+      Map<Change.Id, ChangeResource> changes,
+      @Nullable 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 != null && !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..68962db
--- /dev/null
+++ b/java/com/google/gerrit/sshd/DispatchCommand.java
@@ -0,0 +1,197 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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.registration.DynamicSet;
+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;
+  private final DynamicSet<SshExecuteCommandInterceptor> commandInterceptors;
+
+  @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,
+      DynamicSet<SshExecuteCommandInterceptor> commandInterceptors,
+      @Assisted Map<String, CommandProvider> all) {
+    this.permissionBackend = permissionBackend;
+    commands = all;
+    atomicCmd = Atomics.newReference();
+    this.commandInterceptors = commandInterceptors;
+  }
+
+  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);
+      String actualCommandName = commandName;
+      if (cmd instanceof BaseCommand) {
+        final BaseCommand bc = (BaseCommand) cmd;
+        if (!getName().isEmpty()) {
+          actualCommandName = getName() + " " + commandName;
+        }
+        bc.setName(actualCommandName);
+        bc.setArguments(args.toArray(new String[args.size()]));
+
+      } else if (!args.isEmpty()) {
+        throw die(commandName + " does not take arguments");
+      }
+
+      for (SshExecuteCommandInterceptor commandInterceptor : commandInterceptors) {
+        if (!commandInterceptor.accept(actualCommandName, args)) {
+          throw new UnloggedFailure(
+              126,
+              String.format(
+                  "blocked by %s, contact gerrit administrators for more details",
+                  commandInterceptor.name()));
+        }
+      }
+
+      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/SshExecuteCommandInterceptor.java b/java/com/google/gerrit/sshd/SshExecuteCommandInterceptor.java
similarity index 100%
rename from gerrit-sshd/src/main/java/com/google/gerrit/sshd/SshExecuteCommandInterceptor.java
rename to java/com/google/gerrit/sshd/SshExecuteCommandInterceptor.java
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..df1f633
--- /dev/null
+++ b/java/com/google/gerrit/sshd/SshModule.java
@@ -0,0 +1,146 @@
+// Copyright (C) 2009 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF 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);
+    DynamicSet.setOf(binder(), SshExecuteCommandInterceptor.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..856c8a5
--- /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(ctx.getUser())
+                .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/GerritJUnit.java b/java/com/google/gerrit/testing/GerritJUnit.java
new file mode 100644
index 0000000..0771c39
--- /dev/null
+++ b/java/com/google/gerrit/testing/GerritJUnit.java
@@ -0,0 +1,67 @@
+// 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.testing;
+
+/** Static JUnit utility methods. */
+public class GerritJUnit {
+  /**
+   * Assert that an exception is thrown by a block of code.
+   *
+   * <p>This method is source-compatible with <a
+   * href="https://junit.org/junit4/javadoc/latest/org/junit/Assert.html#assertThrows(java.lang.Class,%20org.junit.function.ThrowingRunnable)">JUnit
+   * 4.13 beta</a>.
+   *
+   * <p>This construction is recommended by the Truth team for use in conjunction with asserting
+   * over a {@code ThrowableSubject} on the return type:
+   *
+   * <pre>
+   *   MyException e = assertThrows(MyException.class, () -> doSomething(foo));
+   *   assertThat(e).isInstanceOf(MySubException.class);
+   *   assertThat(e).hasMessageThat().contains("sub-exception occurred");
+   * </pre>
+   *
+   * @param throwableClass expected exception type.
+   * @param runnable runnable containing arbitrary code.
+   * @return exception that was thrown.
+   */
+  public static <T extends Throwable> T assertThrows(
+      Class<T> throwableClass, ThrowingRunnable runnable) {
+    try {
+      runnable.run();
+    } catch (Throwable t) {
+      if (!throwableClass.isInstance(t)) {
+        throw new AssertionError(
+            "expected "
+                + throwableClass.getName()
+                + " but "
+                + t.getClass().getName()
+                + " was thrown",
+            t);
+      }
+      @SuppressWarnings("unchecked")
+      T toReturn = (T) t;
+      return toReturn;
+    }
+    throw new AssertionError(
+        "expected " + throwableClass.getName() + " but no exception was thrown");
+  }
+
+  @FunctionalInterface
+  public interface ThrowingRunnable {
+    void run() throws Throwable;
+  }
+
+  private GerritJUnit() {}
+}
diff --git a/java/com/google/gerrit/testing/GerritJUnitTest.java b/java/com/google/gerrit/testing/GerritJUnitTest.java
new file mode 100644
index 0000000..430f48f
--- /dev/null
+++ b/java/com/google/gerrit/testing/GerritJUnitTest.java
@@ -0,0 +1,90 @@
+// 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.testing;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+
+import org.junit.Test;
+
+public class GerritJUnitTest {
+  private static class MyException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    MyException(String msg) {
+      super(msg);
+    }
+  }
+
+  private static class MySubException extends MyException {
+    private static final long serialVersionUID = 1L;
+
+    MySubException(String msg) {
+      super(msg);
+    }
+  }
+
+  @Test
+  public void assertThrowsCatchesSpecifiedExceptionType() {
+    MyException e =
+        assertThrows(
+            MyException.class,
+            () -> {
+              throw new MyException("foo");
+            });
+    assertThat(e).hasMessageThat().isEqualTo("foo");
+  }
+
+  @Test
+  public void assertThrowsCatchesSubclassOfSpecifiedExceptionType() {
+    MyException e =
+        assertThrows(
+            MyException.class,
+            () -> {
+              throw new MySubException("foo");
+            });
+    assertThat(e).isInstanceOf(MySubException.class);
+    assertThat(e).hasMessageThat().isEqualTo("foo");
+  }
+
+  @Test
+  public void assertThrowsConvertsUnexpectedExceptionTypeToAssertionError() {
+    try {
+      assertThrows(
+          IllegalStateException.class,
+          () -> {
+            throw new MyException("foo");
+          });
+      assert_().fail("expected AssertionError");
+    } catch (AssertionError e) {
+      assertThat(e).hasMessageThat().contains(IllegalStateException.class.getSimpleName());
+      assertThat(e).hasMessageThat().contains(MyException.class.getSimpleName());
+      assertThat(e).hasCauseThat().isInstanceOf(MyException.class);
+      assertThat(e).hasCauseThat().hasMessageThat().isEqualTo("foo");
+    }
+  }
+
+  @Test
+  public void assertThrowsThrowsAssertionErrorWhenNothingThrown() {
+    try {
+      assertThrows(MyException.class, () -> {});
+      assert_().fail("expected AssertionError");
+    } catch (AssertionError e) {
+      assertThat(e).hasMessageThat().contains(MyException.class.getSimpleName());
+      assertThat(e).hasCauseThat().isNull();
+    }
+  }
+}
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..be30ab7
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/accounts/AccountIT.java
@@ -0,0 +1,3279 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 com.google.gerrit.testing.GerritJUnit.assertThrows;
+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));
+  }
+
+  @Test
+  public void createWithInvalidEmailAddress() throws Exception {
+    AccountInput input = new AccountInput();
+    input.username = name("test");
+    input.email = "invalid email address";
+
+    // Invalid email address should cause the creation to fail
+    BadRequestException thrown =
+        assertThrows(BadRequestException.class, () -> gApi.accounts().create(input));
+    assertThat(thrown).hasMessageThat().isEqualTo("invalid email address");
+
+    // The account should not have been created
+    assertThrows(ResourceNotFoundException.class, () -> gApi.accounts().id(input.username).get());
+  }
+
+  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 addEmailAndSetPreferred() throws Exception {
+    String email = "foo.bar@example.com";
+    EmailInput input = new EmailInput();
+    input.email = email;
+    input.noConfirmation = true;
+    input.preferred = true;
+    gApi.accounts().self().addEmail(input);
+
+    // Account is reindexed twice; once on adding the new email,
+    // and then again on setting the email preferred.
+    accountIndexedCounter.assertReindexOf(admin, 2);
+
+    String preferred = gApi.accounts().self().get().email;
+    assertThat(preferred).isEqualTo(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 deletePreferredEmail() throws Exception {
+    String previous = gApi.accounts().self().get().email;
+    String email = "foo.bar.baz@example.com";
+    EmailInput input = new EmailInput();
+    input.email = email;
+    input.noConfirmation = true;
+    input.preferred = true;
+    gApi.accounts().self().addEmail(input);
+
+    // Account is reindexed twice; once on adding the new email,
+    // and then again on setting the email preferred.
+    accountIndexedCounter.assertReindexOf(admin, 2);
+
+    // The new preferred email is set
+    assertThat(gApi.accounts().self().get().email).isEqualTo(email);
+
+    accountIndexedCounter.clear();
+    gApi.accounts().self().deleteEmail(input.email);
+    accountIndexedCounter.assertReindexOf(admin);
+
+    resetCurrentApiUser();
+    assertThat(getEmails()).containsExactly(previous);
+    assertThat(gApi.accounts().self().get().email).isNull();
+  }
+
+  @Test
+  @Sandboxed
+  public void deleteAllEmails() throws Exception {
+    EmailInput input = new EmailInput();
+    input.email = "foo.bar@example.com";
+    input.noConfirmation = true;
+    gApi.accounts().self().addEmail(input);
+
+    resetCurrentApiUser();
+    Set<String> allEmails = getEmails();
+    assertThat(allEmails).hasSize(2);
+
+    for (String email : allEmails) {
+      gApi.accounts().self().deleteEmail(email);
+    }
+
+    resetCurrentApiUser();
+    assertThat(getEmails()).isEmpty();
+    assertThat(gApi.accounts().self().get().email).isNull();
+  }
+
+  @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");
+
+    sender.clear();
+    assertKeyMapContains(key, addGpgKey(key.getPublicKeyArmored()));
+    assertKeys(key);
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("new GPG keys have been added");
+
+    setApiUser(user);
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage(id);
+    gApi.accounts().self().gpgKey(id).get();
+  }
+
+  @Test
+  public void adminCannotAddGpgKeyToOtherAccount() throws Exception {
+    TestKey key = validKeyWithoutExpiration();
+    addExternalIdEmail(user, "test1@example.com");
+
+    sender.clear();
+    setApiUser(admin);
+    exception.expect(ResourceNotFoundException.class);
+    addGpgKey(user, key.getPublicKeyArmored());
+  }
+
+  @Test
+  public void reAddExistingGpgKey() throws Exception {
+    addExternalIdEmail(admin, "test5@example.com");
+    TestKey key = validKeyWithSecondUserId();
+    String id = key.getKeyIdString();
+    PGPPublicKey pk = key.getPublicKey();
+
+    sender.clear();
+    GpgKeyInfo info = addGpgKey(armor(pk)).get(id);
+    assertThat(info.userIds).hasSize(2);
+    assertIteratorSize(2, getOnlyKeyFromStore(key).getUserIDs());
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("new GPG keys have been added");
+
+    pk = PGPPublicKey.removeCertification(pk, "foo:myId");
+    sender.clear();
+    info = addGpgKeyNoReindex(armor(pk)).get(id);
+    assertThat(info.userIds).hasSize(1);
+    assertIteratorSize(1, getOnlyKeyFromStore(key).getUserIDs());
+    // TODO: Issue 10769: Adding an already existing key should not result in a notification email
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("new GPG keys have been added");
+  }
+
+  @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(user, 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);
+
+    sender.clear();
+    gApi.accounts().self().gpgKey(id).delete();
+    accountIndexedCounter.assertReindexOf(admin);
+    assertKeys();
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("GPG keys have been deleted");
+
+    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 initial = TestSshKeys.publicKey(keyPair, admin.email);
+    assertThat(key.sshPublicKey).isEqualTo(initial);
+    accountIndexedCounter.assertNoReindex();
+
+    // Add a new key
+    sender.clear();
+    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);
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("new SSH keys have been added");
+
+    // Add an existing key (the request succeeds, but the key isn't added again)
+    sender.clear();
+    gApi.accounts().self().addSshKey(initial);
+    info = gApi.accounts().self().listSshKeys();
+    assertThat(info).hasSize(2);
+    assertSequenceNumbers(info);
+    accountIndexedCounter.assertNoReindex();
+    // TODO: Issue 10769: Adding an already existing key should not result in a notification email
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("new SSH keys have been added");
+
+    // Add another new key
+    sender.clear();
+    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);
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("new SSH keys have been added");
+
+    // Delete second key
+    sender.clear();
+    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);
+
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("SSH keys have been deleted");
+
+    // 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);
+  }
+
+  @Test
+  @UseSsh
+  public void adminCanAddOrRemoveSshKeyOnOtherAccount() 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 initial = TestSshKeys.publicKey(keyPair, admin.email);
+    assertThat(key.sshPublicKey).isEqualTo(initial);
+    accountIndexedCounter.assertNoReindex();
+
+    // Add a new key
+    sender.clear();
+    String newKey = TestSshKeys.publicKey(TestSshKeys.genSshKey(), user.email);
+    gApi.accounts().id(user.username).addSshKey(newKey);
+    info = gApi.accounts().id(user.username).listSshKeys();
+    assertThat(info).hasSize(2);
+    assertSequenceNumbers(info);
+    accountIndexedCounter.assertReindexOf(user);
+
+    assertThat(sender.getMessages()).hasSize(1);
+    Message message = sender.getMessages().get(0);
+    assertThat(message.rcpt()).containsExactly(user.emailAddress);
+    assertThat(message.body()).contains("new SSH keys have been added");
+
+    // Delete key
+    sender.clear();
+    gApi.accounts().id(user.username).deleteSshKey(1);
+    info = gApi.accounts().id(user.username).listSshKeys();
+    assertThat(info).hasSize(1);
+    accountIndexedCounter.assertReindexOf(user);
+
+    assertThat(sender.getMessages()).hasSize(1);
+    message = sender.getMessages().get(0);
+    assertThat(message.rcpt()).containsExactly(user.emailAddress);
+    assertThat(message.body()).contains("SSH keys have been deleted");
+  }
+
+  @Test
+  @UseSsh
+  public void userCannotAddSshKeyToOtherAccount() throws Exception {
+    String newKey = TestSshKeys.publicKey(TestSshKeys.genSshKey(), admin.email);
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.accounts().id(admin.username).addSshKey(newKey);
+  }
+
+  @Test
+  @UseSsh
+  public void userCannotDeleteSshKeyOfOtherAccount() throws Exception {
+    setApiUser(user);
+    exception.expect(ResourceNotFoundException.class);
+    gApi.accounts().id(admin.username).deleteSshKey(0);
+  }
+
+  // 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();
+    }
+  }
+
+  @Test
+  public void userCanGenerateNewHttpPassword() throws Exception {
+    sender.clear();
+    String newPassword = gApi.accounts().self().generateHttpPassword();
+    assertThat(newPassword).isNotNull();
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was added or updated");
+  }
+
+  @Test
+  public void adminCanGenerateNewHttpPasswordForUser() throws Exception {
+    setApiUser(admin);
+    sender.clear();
+    String newPassword = gApi.accounts().id(user.username).generateHttpPassword();
+    assertThat(newPassword).isNotNull();
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was added or updated");
+  }
+
+  @Test
+  public void userCannotGenerateNewHttpPasswordForOtherUser() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.accounts().id(admin.username).generateHttpPassword();
+  }
+
+  @Test
+  public void userCannotExplicitlySetHttpPassword() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.accounts().self().setHttpPassword("my-new-password");
+  }
+
+  @Test
+  public void userCannotExplicitlySetHttpPasswordForOtherUser() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.accounts().id(admin.username).setHttpPassword("my-new-password");
+  }
+
+  @Test
+  public void userCanRemoveHttpPassword() throws Exception {
+    setApiUser(user);
+    sender.clear();
+    assertThat(gApi.accounts().self().setHttpPassword(null)).isNull();
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was deleted");
+  }
+
+  @Test
+  public void userCannotRemoveHttpPasswordForOtherUser() throws Exception {
+    setApiUser(user);
+    exception.expect(AuthException.class);
+    gApi.accounts().id(admin.username).setHttpPassword(null);
+  }
+
+  @Test
+  public void adminCanExplicitlySetHttpPasswordForUser() throws Exception {
+    setApiUser(admin);
+    String httpPassword = "new-password-for-user";
+    sender.clear();
+    assertThat(gApi.accounts().id(user.username).setHttpPassword(httpPassword))
+        .isEqualTo(httpPassword);
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was added or updated");
+  }
+
+  @Test
+  public void adminCanRemoveHttpPasswordForUser() throws Exception {
+    setApiUser(admin);
+    sender.clear();
+    assertThat(gApi.accounts().id(user.username).setHttpPassword(null)).isNull();
+    assertThat(sender.getMessages()).hasSize(1);
+    assertThat(sender.getMessages().get(0).body()).contains("HTTP password was deleted");
+  }
+
+  @Test
+  public void cannotGenerateHttpPasswordWhenUsernameIsNotSet() throws Exception {
+    setApiUser(admin);
+    int userId = accountCreator.create().id.get();
+    assertThat(gApi.accounts().id(userId).get().username).isNull();
+    exception.expect(ResourceConflictException.class);
+    exception.expectMessage("username");
+    gApi.accounts().id(userId).generateHttpPassword();
+  }
+
+  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 {
+    return addGpgKey(admin, armored);
+  }
+
+  private Map<String, GpgKeyInfo> addGpgKey(TestAccount account, String armored) throws Exception {
+    Map<String, GpgKeyInfo> gpgKeys =
+        gApi.accounts()
+            .id(account.username)
+            .putGpgKeys(ImmutableList.of(armored), ImmutableList.<String>of());
+    accountIndexedCounter.assertReindexOf(gApi.accounts().id(account.username).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..4f9374b
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -0,0 +1,4259 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.accounts.DeleteDraftCommentsInput;
+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.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.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 {
+    String changeId = createNewChange();
+    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 rebaseOnNonExistingChange() throws Exception {
+    String changeId = createChange().getChangeId();
+    RebaseInput in = new RebaseInput();
+    in.base = "999999";
+    exception.expect(UnprocessableEntityException.class);
+    exception.expectMessage("Base change not found: " + in.base);
+    gApi.changes().id(changeId).rebase(in);
+  }
+
+  @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 from this change.");
+    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");
+  }
+
+  private 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();
+  }
+
+  @Test
+  public void draftCommentsShouldNotUpdateChangeTimestamp() throws Exception {
+    String changeId = createNewChange();
+    Timestamp changeTs = getChangeLastUpdate(changeId);
+    DraftApi draftApi = addDraftComment(changeId);
+    assertThat(getChangeLastUpdate(changeId)).isEqualTo(changeTs);
+    draftApi.delete();
+    assertThat(getChangeLastUpdate(changeId)).isEqualTo(changeTs);
+  }
+
+  @Test
+  public void deletingAllDraftCommentsShouldNotUpdateChangeTimestamp() throws Exception {
+    String changeId = createNewChange();
+    Timestamp changeTs = getChangeLastUpdate(changeId);
+    addDraftComment(changeId);
+    assertThat(getChangeLastUpdate(changeId)).isEqualTo(changeTs);
+    gApi.accounts().self().deleteDraftComments(new DeleteDraftCommentsInput());
+    assertThat(getChangeLastUpdate(changeId)).isEqualTo(changeTs);
+  }
+
+  private Timestamp getChangeLastUpdate(String changeId) throws RestApiException {
+    Timestamp changeTs = gApi.changes().id(changeId).get().updated;
+    return changeTs;
+  }
+
+  private String createNewChange() 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();
+    return changeId;
+  }
+
+  private DraftApi addDraftComment(String changeId) throws RestApiException {
+    DraftInput comment = new DraftInput();
+    comment.message = "foo";
+    comment.path = "/foo";
+    return gApi.changes().id(changeId).current().createDraft(comment);
+  }
+
+  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..d632113
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/change/StickyApprovalsIT.java
@@ -0,0 +1,639 @@
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 notStickyWithCopyOnNoChangeWhenSecondParentIsUpdated() throws Exception {
+    try (ProjectConfigUpdate u = updateProject(project)) {
+      u.getConfig().getLabelSections().get("Code-Review").setCopyAllScoresIfNoChange(true);
+      u.save();
+    }
+
+    String changeId = createChangeForMergeCommit();
+    vote(admin, changeId, 2, 1);
+    vote(user, changeId, -2, -1);
+
+    updateSecondParent(changeId);
+    ChangeInfo c = detailedChange(changeId);
+    assertVotes(c, admin, 0, 0, null);
+    assertVotes(c, user, 0, 0, null);
+  }
+
+  @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 void updateSecondParent(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 commitParent1 = testRepo.getRevWalk().parseCommit(ObjectId.fromString(parent1));
+
+    testRepo.reset(parent2);
+    PushOneCommit.Result newParent2 = createChange("new parent 2", "p2-2.txt", "content 2-2");
+
+    PushOneCommit merge = pushFactory.create(db, admin.getIdent(), testRepo, changeId);
+    merge.setParents(ImmutableList.of(commitParent1, newParent2.getCommit()));
+    PushOneCommit.Result result = merge.to("refs/for/master");
+    result.assertOkStatus();
+
+    assertThat(getChangeKind(changeId)).isEqualTo(REWORK);
+  }
+
+  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/CommitIT.java b/javatests/com/google/gerrit/acceptance/api/project/CommitIT.java
new file mode 100644
index 0000000..39d630a
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/project/CommitIT.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.acceptance.api.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.gerrit.acceptance.AbstractDaemonTest;
+import com.google.gerrit.acceptance.NoHttpd;
+import com.google.gerrit.acceptance.PushOneCommit.Result;
+import com.google.gerrit.acceptance.TestAccount;
+import com.google.gerrit.common.data.Permission;
+import com.google.gerrit.extensions.api.changes.CherryPickInput;
+import com.google.gerrit.extensions.api.changes.IncludedInInfo;
+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.extensions.common.ChangeInfo;
+import com.google.gerrit.extensions.common.ChangeMessageInfo;
+import com.google.gerrit.extensions.common.CommitInfo;
+import com.google.gerrit.extensions.common.GitPerson;
+import com.google.gerrit.extensions.common.RevisionInfo;
+import com.google.gerrit.reviewdb.client.Branch;
+import java.util.Iterator;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.junit.Test;
+
+@NoHttpd
+public class CommitIT extends AbstractDaemonTest {
+  @Test
+  public void getCommitInfo() throws Exception {
+    Result result = createChange();
+    String commitId = result.getCommit().getId().name();
+    CommitInfo info = gApi.projects().name(project.get()).commit(commitId).get();
+    assertThat(info.commit).isEqualTo(commitId);
+    assertThat(info.parents.stream().map(c -> c.commit).collect(toList()))
+        .containsExactly(result.getCommit().getParent(0).name());
+    assertThat(info.subject).isEqualTo(result.getCommit().getShortMessage());
+    assertPerson(info.author, admin);
+    assertPerson(info.committer, admin);
+    assertThat(info.webLinks).isNull();
+  }
+
+  @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");
+  }
+
+  @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 IncludedInInfo getIncludedIn(ObjectId id) throws Exception {
+    return gApi.projects().name(project.get()).commit(id.name()).includedIn();
+  }
+
+  private static void assertPerson(GitPerson actual, TestAccount expected) {
+    assertThat(actual.email).isEqualTo(expected.email);
+    assertThat(actual.name).isEqualTo(expected.fullName);
+  }
+}
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..4db2cf8
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionIT.java
@@ -0,0 +1,1643 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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 com.google.gerrit.testing.GerritJUnit.assertThrows;
+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);
+  }
+
+  @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.keySet()).containsExactly(FILE_NAME, COMMIT_MSG);
+  }
+
+  @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 filesOnMergeCommitChangeWithInvalidParent() throws Exception {
+    PushOneCommit.Result r = createMergeCommitChange("refs/for/master");
+
+    BadRequestException thrown =
+        assertThrows(
+            BadRequestException.class,
+            () ->
+                gApi.changes()
+                    .id(r.getChangeId())
+                    .revision(r.getCommit().name())
+                    .files(3)
+                    .keySet());
+    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: 3");
+    thrown =
+        assertThrows(
+            BadRequestException.class,
+            () ->
+                gApi.changes()
+                    .id(r.getChangeId())
+                    .revision(r.getCommit().name())
+                    .files(-1)
+                    .keySet());
+    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: -1");
+  }
+
+  @Test
+  public void listFilesWithInvalidParent() throws Exception {
+    PushOneCommit.Result result1 = createChange();
+    String changeId = result1.getChangeId();
+    PushOneCommit.Result result2 = amendChange(changeId, SUBJECT, "b.txt", "b");
+    String revId2 = result2.getCommit().name();
+
+    BadRequestException thrown =
+        assertThrows(
+            BadRequestException.class,
+            () -> gApi.changes().id(changeId).revision(revId2).files(2).keySet());
+    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: 2");
+
+    thrown =
+        assertThrows(
+            BadRequestException.class,
+            () -> gApi.changes().id(changeId).revision(revId2).files(-1).keySet());
+    assertThat(thrown).hasMessageThat().isEqualTo("invalid parent number: -1");
+  }
+
+  @Test
+  public void listFilesOnDifferentBases() throws Exception {
+    RevCommit initialCommit = getHead(repo());
+
+    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");
+
+    ResourceNotFoundException thrown =
+        assertThrows(
+            ResourceNotFoundException.class,
+            () -> gApi.changes().id(changeId).revision(revId3).files(initialCommit.getName()));
+    assertThat(thrown).hasMessageThat().contains(initialCommit.getName());
+
+    String invalidRev = "deadbeef";
+    thrown =
+        assertThrows(
+            ResourceNotFoundException.class,
+            () -> gApi.changes().id(changeId).revision(revId3).files(invalidRev));
+    assertThat(thrown).hasMessageThat().contains(invalidRev);
+  }
+
+  @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..8e14330
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/AbstractPushForReview.java
@@ -0,0 +1,2635 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+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.events.CommitReceivedEvent;
+import com.google.gerrit.server.git.receive.NoteDbPushOption;
+import com.google.gerrit.server.git.receive.ReceiveConstants;
+import com.google.gerrit.server.git.validators.CommitValidationListener;
+import com.google.gerrit.server.git.validators.CommitValidationMessage;
+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 com.google.inject.Inject;
+import java.util.ArrayList;
+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.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+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;
+
+  @Inject private DynamicSet<CommitValidationListener> commitValidators;
+
+  @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.
+    String changeId = r.getChangeId();
+    r = amendChange(changeId, "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(changeId, "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(changeId, "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(changeId, "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(changeId, "refs/for/master%wip,ready");
+    r.assertErrorStatus();
+
+    // Pushing directly to the branch removes the work-in-progress flag
+    String master = "refs/heads/master";
+    assertPushOk(pushHead(testRepo, master, false), master);
+    ChangeInfo result = Iterables.getOnlyElement(gApi.changes().query(changeId).get());
+    assertThat(result.status).isEqualTo(ChangeStatus.MERGED);
+    assertThat(result.workInProgress).isNull();
+  }
+
+  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 {
+    testMaxBatchCommits();
+  }
+
+  @GerritConfig(name = "receive.maxBatchCommits", value = "2")
+  @Test
+  public void maxBatchCommitsWithDefaultValidator() throws Exception {
+    TestValidator validator = new TestValidator();
+    RegistrationHandle handle = commitValidators.add("test-validator", validator);
+    try {
+      testMaxBatchCommits();
+    } finally {
+      handle.remove();
+    }
+  }
+
+  @GerritConfig(name = "receive.maxBatchCommits", value = "2")
+  @Test
+  public void maxBatchCommitsWithValidateAllCommitsValidator() throws Exception {
+    TestValidator validator = new TestValidator(true);
+    RegistrationHandle handle = commitValidators.add("test-validator", validator);
+    try {
+      testMaxBatchCommits();
+    } finally {
+      handle.remove();
+    }
+  }
+
+  private void testMaxBatchCommits() 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());
+  }
+
+  private static class TestValidator implements CommitValidationListener {
+    private final AtomicInteger count = new AtomicInteger();
+    private final boolean validateAll;
+
+    TestValidator(boolean validateAll) {
+      this.validateAll = validateAll;
+    }
+
+    TestValidator() {
+      this(false);
+    }
+
+    @Override
+    public List<CommitValidationMessage> onCommitReceived(CommitReceivedEvent receiveEvent) {
+      count.incrementAndGet();
+      return Collections.emptyList();
+    }
+
+    @Override
+    public boolean shouldValidateAllCommits() {
+      return validateAll;
+    }
+
+    public int count() {
+      return count.get();
+    }
+  }
+
+  @Test
+  public void skipValidation() throws Exception {
+    String master = "refs/heads/master";
+    TestValidator validator = new TestValidator();
+    RegistrationHandle handle = commitValidators.add("test-validator", validator);
+    RegistrationHandle handle2 = null;
+
+    try {
+      // Validation listener is called on normal push
+      PushOneCommit push =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
+      PushOneCommit.Result r = push.to(master);
+      r.assertOkStatus();
+      assertThat(validator.count()).isEqualTo(1);
+
+      // Push is rejected and validation listener is not called when not allowed
+      // to use skip option
+      PushOneCommit push2 =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
+      push2.setPushOptions(ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
+      r = push2.to(master);
+      r.assertErrorStatus("not permitted: skip validation");
+      assertThat(validator.count()).isEqualTo(1);
+
+      // Validation listener is not called when skip option is used
+      grantSkipValidation(project, master, SystemGroupBackend.REGISTERED_USERS);
+      PushOneCommit push3 =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
+      push3.setPushOptions(ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
+      r = push3.to(master);
+      r.assertOkStatus();
+      assertThat(validator.count()).isEqualTo(1);
+
+      // Validation listener that needs to validate all commits gets called even
+      // when the skip option is used.
+      TestValidator validator2 = new TestValidator(true);
+      handle2 = commitValidators.add("test-validator-2", validator2);
+      PushOneCommit push4 =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
+      push4.setPushOptions(ImmutableList.of(PUSH_OPTION_SKIP_VALIDATION));
+      r = push4.to(master);
+      r.assertOkStatus();
+      // First listener was not called; its count remains the same.
+      assertThat(validator.count()).isEqualTo(1);
+      // Second listener was called.
+      assertThat(validator2.count()).isEqualTo(1);
+    } finally {
+      handle.remove();
+      if (handle2 != null) {
+        handle2.remove();
+      }
+    }
+  }
+
+  @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..3da771a
--- /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 = [f],
+    group = f[:f.index(".")],
+    labels = ["git"],
+    deps = [
+        ":push_for_review",
+        ":submodule_util",
+    ],
+) for f in glob(["*IT.java"])]
+
+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/javatests/com/google/gerrit/acceptance/git/RefOperationValidationIT.java b/javatests/com/google/gerrit/acceptance/git/RefOperationValidationIT.java
new file mode 100644
index 0000000..d1d4f0c
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/RefOperationValidationIT.java
@@ -0,0 +1,198 @@
+// 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.git;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.common.truth.Truth.assert_;
+import static com.google.gerrit.acceptance.GitUtil.deleteRef;
+import static org.eclipse.jgit.lib.Constants.HEAD;
+import static org.eclipse.jgit.transport.ReceiveCommand.Type.CREATE;
+import static org.eclipse.jgit.transport.ReceiveCommand.Type.DELETE;
+import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE;
+import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE_NONFASTFORWARD;
+
+import com.google.gerrit.acceptance.AbstractDaemonTest;
+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.registration.DynamicSet;
+import com.google.gerrit.extensions.registration.RegistrationHandle;
+import com.google.gerrit.extensions.restapi.RestApiException;
+import com.google.gerrit.server.events.RefReceivedEvent;
+import com.google.gerrit.server.git.validators.RefOperationValidationListener;
+import com.google.gerrit.server.git.validators.ValidationMessage;
+import com.google.gerrit.server.validators.ValidationException;
+import com.google.inject.Inject;
+import java.util.Collections;
+import java.util.List;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.RefUpdate;
+import org.eclipse.jgit.transport.PushResult;
+import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.transport.RemoteRefUpdate;
+import org.junit.Test;
+
+public class RefOperationValidationIT extends AbstractDaemonTest {
+  private static final String TEST_REF = "refs/heads/protected";
+
+  @Inject DynamicSet<RefOperationValidationListener> validators;
+
+  private class TestRefValidator implements RefOperationValidationListener, AutoCloseable {
+    private final ReceiveCommand.Type rejectType;
+    private final String rejectRef;
+    private final RegistrationHandle handle;
+
+    public TestRefValidator(ReceiveCommand.Type rejectType) {
+      this.rejectType = rejectType;
+      this.rejectRef = TEST_REF;
+      this.handle = validators.add("test-" + rejectType.name(), this);
+    }
+
+    @Override
+    public List<ValidationMessage> onRefOperation(RefReceivedEvent refEvent)
+        throws ValidationException {
+      if (refEvent.getRefName().equals(rejectRef)
+          && refEvent.command.getType().equals(rejectType)) {
+        throw new ValidationException(rejectType.name());
+      }
+      return Collections.emptyList();
+    }
+
+    @Override
+    public void close() throws Exception {
+      handle.remove();
+    }
+  }
+
+  @Test
+  public void rejectRefCreation() throws Exception {
+    try (TestRefValidator validator = new TestRefValidator(CREATE)) {
+      gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
+      assert_().fail("expected exception");
+    } catch (RestApiException expected) {
+      assertThat(expected).hasMessageThat().contains(CREATE.name());
+    }
+  }
+
+  @Test
+  public void rejectRefCreationByPush() throws Exception {
+    try (TestRefValidator validator = new TestRefValidator(CREATE)) {
+      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();
+      PushOneCommit.Result r2 = push1.to(TEST_REF);
+      r2.assertErrorStatus(CREATE.name());
+    }
+  }
+
+  @Test
+  public void rejectRefDeletion() throws Exception {
+    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
+    try (TestRefValidator validator = new TestRefValidator(DELETE)) {
+      gApi.projects().name(project.get()).branch(TEST_REF).delete();
+      assert_().fail("expected exception");
+    } catch (RestApiException expected) {
+      assertThat(expected).hasMessageThat().contains(DELETE.name());
+    }
+  }
+
+  @Test
+  public void rejectRefDeletionByPush() throws Exception {
+    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
+    grant(project, "refs/*", Permission.DELETE, true);
+    try (TestRefValidator validator = new TestRefValidator(DELETE)) {
+      PushResult result = deleteRef(testRepo, TEST_REF);
+      RemoteRefUpdate refUpdate = result.getRemoteUpdate(TEST_REF);
+      assertThat(refUpdate.getMessage()).contains(DELETE.name());
+    }
+  }
+
+  @Test
+  public void rejectRefUpdateFastForward() throws Exception {
+    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
+    try (TestRefValidator validator = new TestRefValidator(UPDATE)) {
+      grant(project, "refs/*", Permission.PUSH, true);
+      PushOneCommit push1 =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change1", "a.txt", "content");
+      PushOneCommit.Result r1 = push1.to(TEST_REF);
+      r1.assertErrorStatus(UPDATE.name());
+    }
+  }
+
+  @Test
+  public void rejectRefUpdateNonFastForward() throws Exception {
+    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
+    try (TestRefValidator validator = new TestRefValidator(UPDATE_NONFASTFORWARD)) {
+      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(TEST_REF);
+      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(TEST_REF);
+      r2.assertErrorStatus(UPDATE_NONFASTFORWARD.name());
+    }
+  }
+
+  @Test
+  public void rejectRefUpdateNonFastForwardToExistingCommit() throws Exception {
+    gApi.projects().name(project.get()).branch(TEST_REF).create(new BranchInput());
+
+    try (TestRefValidator validator = new TestRefValidator(UPDATE_NONFASTFORWARD)) {
+      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();
+      ObjectId push1Id = r1.getCommit();
+
+      PushOneCommit push2 =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change2", "b.txt", "content");
+      PushOneCommit.Result r2 = push2.to("refs/heads/master");
+      r2.assertOkStatus();
+      ObjectId push2Id = r2.getCommit();
+
+      RefUpdate ru = repo().updateRef(HEAD);
+      ru.setNewObjectId(push1Id);
+      assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
+
+      PushOneCommit push3 =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change3", "c.txt", "content");
+      PushOneCommit.Result r3 = push3.to(TEST_REF);
+      r3.assertOkStatus();
+
+      ru = repo().updateRef(HEAD);
+      ru.setNewObjectId(push2Id);
+      assertThat(ru.forceUpdate()).isEqualTo(RefUpdate.Result.FORCED);
+
+      PushOneCommit push4 =
+          pushFactory.create(db, admin.getIdent(), testRepo, "change4", "d.txt", "content");
+      push4.setForce(true);
+      PushOneCommit.Result r4 = push4.to(TEST_REF);
+      r4.assertErrorStatus(UPDATE_NONFASTFORWARD.name());
+    }
+  }
+}
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..7646c45
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/git/SubmitOnPushIT.java
@@ -0,0 +1,382 @@
+// Copyright (C) 2013 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.events.ChangeMergedEvent;
+import com.google.gerrit.server.notedb.ChangeNotes;
+import com.google.gerrit.server.query.change.ChangeData;
+import com.google.inject.Inject;
+import java.util.List;
+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 correctNewRevOnMergeByPushToBranch() throws Exception {
+    grant(project, "refs/heads/master", Permission.PUSH);
+    push("refs/for/master", PushOneCommit.SUBJECT, "one.txt", "One");
+    PushOneCommit.Result r = push("refs/for/master", PushOneCommit.SUBJECT, "two.txt", "Two");
+    startEventRecorder();
+    git().push().setRefSpecs(new RefSpec(r.getCommit().name() + ":refs/heads/master")).call();
+    List<ChangeMergedEvent> changeMergedEvents =
+        eventRecorder.getChangeMergedEvents(project.get(), "refs/heads/master", 2);
+    assertThat(changeMergedEvents.get(0).newRev).isEqualTo(r.getPatchSet().getRevision().get());
+    assertThat(changeMergedEvents.get(1).newRev).isEqualTo(r.getPatchSet().getRevision().get());
+  }
+
+  @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..c18c092
--- /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_8);
+  }
+
+  @ConfigSuite.Config
+  public static Config elasticsearchV7() {
+    return getConfig(ElasticVersion.V7_3);
+  }
+
+  @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..e388d6c
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/change/CreateChangeIT.java
@@ -0,0 +1,515 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.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.MergeInput;
+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.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 createChangeOnNonExistingBaseChangeFails() throws Exception {
+    ChangeInput input = newChangeInput(ChangeStatus.NEW);
+    input.baseChange = "999999";
+    assertCreateFails(
+        input, UnprocessableEntityException.class, "Base change not found: " + input.baseChange);
+  }
+
+  @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);
+  }
+
+  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..940f2cf
--- /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 from this change.");
+    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..dfce883
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/rest/project/ListProjectsIT.java
@@ -0,0 +1,388 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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.nio.charset.StandardCharsets.UTF_8;
+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(), UTF_8));
+      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(), UTF_8);
+
+      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..b66f3d9
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/server/change/CommentsIT.java
@@ -0,0 +1,1243 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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));
+
+      List<CommentInfo> list = getDraftCommentsAsList(changeId);
+      assertThat(list).hasSize(1);
+      actual = list.get(0);
+      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);
+
+      List<CommentInfo> list = getDraftCommentsAsList(changeId);
+      assertThat(list).hasSize(4);
+      assertThat(Lists.transform(list, 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);
+
+      List<CommentInfo> list = getPublishedCommentsAsList(changeId);
+      assertThat(Lists.transform(list, 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);
+
+      List<CommentInfo> list = getPublishedCommentsAsList(changeId);
+      assertThat(Lists.transform(list, 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();
+    assertThat(getPublishedCommentsAsList(changeId)).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);
+
+    List<CommentInfo> list = getPublishedCommentsAsList(changeId);
+    assertThat(Lists.transform(list, 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 result = createChange();
+    String changeId = result.getChangeId();
+
+    pushFactory
+        .create(db, admin.getIdent(), testRepo, SUBJECT, FILE_NAME, "initial content\n", changeId)
+        .to("refs/heads/master");
+
+    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, createLineRange(1, 0, 7), "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/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/1/a.txt \n"
+                + "File a.txt:\n"
+                + "\n"
+                + url
+                + "c/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/1/a.txt@a1 \n"
+                + "PS1, Line 1: initial\n"
+                + "what happened to this?\n"
+                + "\n"
+                + "\n"
+                + url
+                + "c/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/1/a.txt@1 \n"
+                + "PS1, Line 1: boring\n"
+                + "Is it that bad?\n"
+                + "\n"
+                + "\n"
+                + url
+                + "c/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/2/a.txt \n"
+                + "File a.txt:\n"
+                + "\n"
+                + url
+                + "c/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/2/a.txt@a1 \n"
+                + "PS2, Line 1: initial content\n"
+                + "comment 1 on base\n"
+                + "\n"
+                + "\n"
+                + url
+                + "c/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/2/a.txt@a2 \n"
+                + "PS2, Line 2: \n"
+                + "comment 2 on base\n"
+                + "\n"
+                + "\n"
+                + url
+                + "c/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/2/a.txt@1 \n"
+                + "PS2, Line 1: interesting\n"
+                + "better now\n"
+                + "\n"
+                + "\n"
+                + url
+                + "c/"
+                + project.get()
+                + "/+/"
+                + c
+                + "/2/a.txt@2 \n"
+                + "PS2, Line 2: cntent\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 List<CommentInfo> getPublishedCommentsAsList(String changeId) throws Exception {
+    return gApi.changes().id(changeId).commentsAsList();
+  }
+
+  private Map<String, List<CommentInfo>> getDraftComments(String changeId, String revId)
+      throws Exception {
+    return gApi.changes().id(changeId).revision(revId).drafts();
+  }
+
+  private List<CommentInfo> getDraftCommentsAsList(String changeId) throws Exception {
+    return gApi.changes().id(changeId).draftsAsList();
+  }
+
+  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.startLine, 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,
+      int line,
+      Comment.Range range,
+      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 (range != null) {
+      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, line, null, 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..6ccd9e0
--- /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_8);
+  }
+
+  @ConfigSuite.Config
+  public static Config elasticsearchV7() {
+    return getConfig(ElasticVersion.V7_3);
+  }
+
+  @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/javatests/com/google/gerrit/acceptance/ssh/SetReviewersIT.java b/javatests/com/google/gerrit/acceptance/ssh/SetReviewersIT.java
new file mode 100644
index 0000000..9108f68
--- /dev/null
+++ b/javatests/com/google/gerrit/acceptance/ssh/SetReviewersIT.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.acceptance.ssh;
+
+import static com.google.common.truth.Truth.assertThat;
+
+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.SshSession;
+import com.google.gerrit.acceptance.UseSsh;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.testing.ConfigSuite;
+import org.eclipse.jgit.lib.Config;
+import org.junit.Before;
+import org.junit.Test;
+
+@UseSsh
+@NoHttpd
+public class SetReviewersIT extends AbstractDaemonTest {
+  PushOneCommit.Result change;
+  SshSession session;
+
+  @ConfigSuite.Config
+  public static Config asAdmin() {
+    Config cfg = new Config();
+    cfg.setBoolean("SetReviewersIT", null, "asAdmin", true);
+    return cfg;
+  }
+
+  @Before
+  public void setUp() throws Exception {
+    change = createChange();
+    session =
+        cfg.getBoolean("SetReviewersIT", null, "asAdmin", false) ? adminSshSession : userSshSession;
+  }
+
+  @Test
+  public void byCommitHash() throws Exception {
+    String id = change.getCommit().getId().toString().split("\\s+")[1];
+    addReviewer(id);
+    removeReviewer(id);
+  }
+
+  @Test
+  public void byChangeID() throws Exception {
+    addReviewer(change.getChangeId());
+    removeReviewer(change.getChangeId());
+  }
+
+  private void setReviewer(boolean add, String id) throws Exception {
+    session.exec(String.format("gerrit set-reviewers -%s %s %s", add ? "a" : "r", user.email, id));
+    session.assertSuccess();
+    ImmutableSet<Id> reviewers = change.getChange().getReviewers().all();
+    if (add) {
+      assertThat(reviewers).contains(user.id);
+    } else {
+      assertThat(reviewers).doesNotContain(user.id);
+    }
+  }
+
+  private void addReviewer(String id) throws Exception {
+    setReviewer(true, id);
+  }
+
+  private void removeReviewer(String id) throws Exception {
+    setReviewer(false, id);
+  }
+}
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..d214ae0
--- /dev/null
+++ b/javatests/com/google/gerrit/elasticsearch/ElasticContainer.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.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 "blacktop/elasticsearch:5.6.16";
+      case V6_2:
+        return "blacktop/elasticsearch:6.2.4";
+      case V6_3:
+        return "blacktop/elasticsearch:6.3.2";
+      case V6_4:
+        return "blacktop/elasticsearch:6.4.3";
+      case V6_5:
+        return "blacktop/elasticsearch:6.5.4";
+      case V6_6:
+        return "blacktop/elasticsearch:6.6.2";
+      case V6_7:
+        return "blacktop/elasticsearch:6.7.2";
+      case V6_8:
+        return "blacktop/elasticsearch:6.8.2";
+      case V7_0:
+        return "blacktop/elasticsearch:7.0.1";
+      case V7_1:
+        return "blacktop/elasticsearch:7.1.1";
+      case V7_2:
+        return "blacktop/elasticsearch:7.2.1";
+      case V7_3:
+        return "blacktop/elasticsearch:7.3.1";
+    }
+    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..191b83c
--- /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_8);
+    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..08f4839
--- /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_8);
+    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..8bc5767
--- /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_8);
+    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..de8e922
--- /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_8);
+    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..d998d75
--- /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_3);
+    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..c1af5dd
--- /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_3);
+    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..ea4c7f1
--- /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_3);
+    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..6cc12f1
--- /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_3);
+    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..55f0374
--- /dev/null
+++ b/javatests/com/google/gerrit/server/config/ScheduleConfigTest.java
@@ -0,0 +1,240 @@
+// Copyright (C) 2014 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY 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("11:00", "1 hour")).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("11:00", "1 day")).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("11:00", "1 week")).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();
+
+    rc.setString("a", null, ScheduleConfig.KEY_STARTTIME, "1:00");
+    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/javatests/com/google/gerrit/server/events/EventJsonTest.java b/javatests/com/google/gerrit/server/events/EventJsonTest.java
new file mode 100644
index 0000000..fb7ffd4
--- /dev/null
+++ b/javatests/com/google/gerrit/server/events/EventJsonTest.java
@@ -0,0 +1,624 @@
+// 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.server.events;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.reviewdb.client.Change.Status.NEW;
+
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.truth.MapSubject;
+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.server.data.AccountAttribute;
+import com.google.gerrit.server.data.ChangeAttribute;
+import com.google.gerrit.server.data.RefUpdateAttribute;
+import com.google.gerrit.server.util.time.TimeUtil;
+import com.google.gerrit.testing.GerritBaseTests;
+import com.google.gerrit.testing.TestTimeUtil;
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import com.google.gson.reflect.TypeToken;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import org.junit.Before;
+import org.junit.Test;
+
+public class EventJsonTest extends GerritBaseTests {
+  private static final String BRANCH = "mybranch";
+  private static final String CHANGE_ID = "Ideadbeefdeadbeefdeadbeefdeadbeefdeadbeef";
+  private static final int CHANGE_NUM = 1000;
+  private static final double CHANGE_NUM_DOUBLE = CHANGE_NUM;
+  private static final String COMMIT_MESSAGE = "This is a test commit message";
+  private static final String PROJECT = "myproject";
+  private static final String REF = "refs/heads/" + BRANCH;
+  private static final double TS1 = 1.2543444E9;
+  private static final double TS2 = 1.254344401E9;
+  private static final String URL = "http://somewhere.com";
+
+  // Must match StreamEvents#gson. (In master, the definition is refactored to be hared.)
+  private final Gson gson =
+      new GsonBuilder()
+          .registerTypeAdapter(Supplier.class, new SupplierSerializer())
+          .registerTypeAdapter(Project.NameKey.class, new ProjectNameKeySerializer())
+          .create();
+
+  @Before
+  public void setTimeForTesting() {
+    TestTimeUtil.resetWithClockStep(1, TimeUnit.SECONDS);
+  }
+
+  @Test
+  public void refUpdatedEvent() {
+    RefUpdatedEvent event = new RefUpdatedEvent();
+
+    RefUpdateAttribute refUpdatedAttribute = new RefUpdateAttribute();
+    refUpdatedAttribute.refName = REF;
+    event.refUpdate = createSupplier(refUpdatedAttribute);
+    event.submitter = newAccount("submitter");
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "submitter",
+                    ImmutableMap.builder()
+                        .put("name", event.submitter.get().name)
+                        .put("email", event.submitter.get().email)
+                        .put("username", event.submitter.get().username)
+                        .build())
+                .put("refUpdate", ImmutableMap.of("refName", REF))
+                .put("type", "ref-updated")
+                .put("eventCreatedOn", TS1)
+                .build());
+  }
+
+  @Test
+  public void patchSetCreatedEvent() {
+    Change change = newChange();
+    PatchSetCreatedEvent event = new PatchSetCreatedEvent(change);
+    event.change = asChangeAttribute(change);
+    event.uploader = newAccount("uploader");
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "uploader",
+                    ImmutableMap.builder()
+                        .put("name", event.uploader.get().name)
+                        .put("email", event.uploader.get().email)
+                        .put("username", event.uploader.get().username)
+                        .build())
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "patchset-created")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void assigneeChangedEvent() {
+    Change change = newChange();
+    AssigneeChangedEvent event = new AssigneeChangedEvent(change);
+    event.change = asChangeAttribute(change);
+    event.changer = newAccount("changer");
+    event.oldAssignee = newAccount("oldAssignee");
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "changer",
+                    ImmutableMap.builder()
+                        .put("name", event.changer.get().name)
+                        .put("email", event.changer.get().email)
+                        .put("username", event.changer.get().username)
+                        .build())
+                .put(
+                    "oldAssignee",
+                    ImmutableMap.builder()
+                        .put("name", event.oldAssignee.get().name)
+                        .put("email", event.oldAssignee.get().email)
+                        .put("username", event.oldAssignee.get().username)
+                        .build())
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "assignee-changed")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void changeDeletedEvent() {
+    Change change = newChange();
+    ChangeDeletedEvent event = new ChangeDeletedEvent(change);
+    event.change = asChangeAttribute(change);
+    event.deleter = newAccount("deleter");
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "deleter",
+                    ImmutableMap.builder()
+                        .put("name", event.deleter.get().name)
+                        .put("email", event.deleter.get().email)
+                        .put("username", event.deleter.get().username)
+                        .build())
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "change-deleted")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void hashtagsChangedEvent() {
+    Change change = newChange();
+    HashtagsChangedEvent event = new HashtagsChangedEvent(change);
+    event.change = asChangeAttribute(change);
+    event.editor = newAccount("editor");
+    event.added = new String[] {"added"};
+    event.removed = new String[] {"removed"};
+    event.hashtags = new String[] {"hashtags"};
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "editor",
+                    ImmutableMap.builder()
+                        .put("name", event.editor.get().name)
+                        .put("email", event.editor.get().email)
+                        .put("username", event.editor.get().username)
+                        .build())
+                .put("added", list("added"))
+                .put("removed", list("removed"))
+                .put("hashtags", list("hashtags"))
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "hashtags-changed")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void changeAbandonedEvent() {
+    Change change = newChange();
+    ChangeAbandonedEvent event = new ChangeAbandonedEvent(change);
+    event.change = asChangeAttribute(change);
+    event.abandoner = newAccount("abandoner");
+    event.reason = "some reason";
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "abandoner",
+                    ImmutableMap.builder()
+                        .put("name", event.abandoner.get().name)
+                        .put("email", event.abandoner.get().email)
+                        .put("username", event.abandoner.get().username)
+                        .build())
+                .put("reason", "some reason")
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "change-abandoned")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void changeMergedEvent() {
+    Change change = newChange();
+    ChangeMergedEvent event = new ChangeMergedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "change-merged")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void changeRestoredEvent() {
+    Change change = newChange();
+    ChangeRestoredEvent event = new ChangeRestoredEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "change-restored")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void commentAddedEvent() {
+    Change change = newChange();
+    CommentAddedEvent event = new CommentAddedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "comment-added")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void privateStateChangedEvent() {
+    Change change = newChange();
+    PrivateStateChangedEvent event = new PrivateStateChangedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "private-state-changed")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void reviewerAddedEvent() {
+    Change change = newChange();
+    ReviewerAddedEvent event = new ReviewerAddedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "reviewer-added")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void reviewerDeletedEvent() {
+    Change change = newChange();
+    ReviewerDeletedEvent event = new ReviewerDeletedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "reviewer-deleted")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void voteDeletedEvent() {
+    Change change = newChange();
+    VoteDeletedEvent event = new VoteDeletedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "vote-deleted")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void workInProgressStateChangedEvent() {
+    Change change = newChange();
+    WorkInProgressStateChangedEvent event = new WorkInProgressStateChangedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "wip-state-changed")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void topicChangedEvent() {
+    Change change = newChange();
+    TopicChangedEvent event = new TopicChangedEvent(change);
+    event.change = asChangeAttribute(change);
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put(
+                    "change",
+                    ImmutableMap.builder()
+                        .put("project", PROJECT)
+                        .put("branch", BRANCH)
+                        .put("id", CHANGE_ID)
+                        .put("number", CHANGE_NUM_DOUBLE)
+                        .put("url", URL)
+                        .put("commitMessage", COMMIT_MESSAGE)
+                        .put("createdOn", TS1)
+                        .put("status", NEW.name())
+                        .build())
+                .put("project", PROJECT)
+                .put("refName", REF)
+                .put("changeKey", map("id", CHANGE_ID))
+                .put("type", "topic-changed")
+                .put("eventCreatedOn", TS2)
+                .build());
+  }
+
+  @Test
+  public void projectCreatedEvent() {
+    ProjectCreatedEvent event = new ProjectCreatedEvent();
+    event.projectName = PROJECT;
+    event.headName = REF;
+
+    assertThatJsonMap(event)
+        .isEqualTo(
+            ImmutableMap.builder()
+                .put("projectName", PROJECT)
+                .put("headName", REF)
+                .put("type", "project-created")
+                .put("eventCreatedOn", TS1)
+                .build());
+  }
+
+  private Supplier<AccountAttribute> newAccount(String name) {
+    AccountAttribute account = new AccountAttribute();
+    account.name = name;
+    account.email = name + "@somewhere.com";
+    account.username = name;
+    return Suppliers.ofInstance(account);
+  }
+
+  private Change newChange() {
+    return new Change(
+        new Change.Key(CHANGE_ID),
+        new Change.Id(CHANGE_NUM),
+        new Account.Id(9999),
+        new Branch.NameKey(new Project.NameKey(PROJECT), BRANCH),
+        TimeUtil.nowTs());
+  }
+
+  private <T> Supplier<T> createSupplier(T value) {
+    return Suppliers.memoize(() -> value);
+  }
+
+  private Supplier<ChangeAttribute> asChangeAttribute(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();
+    a.commitMessage = COMMIT_MESSAGE;
+    a.url = URL;
+    a.status = change.getStatus();
+    a.createdOn = change.getCreatedOn().getTime() / 1000L;
+    a.wip = change.isWorkInProgress() ? true : null;
+    a.isPrivate = change.isPrivate() ? true : null;
+    return Suppliers.ofInstance(a);
+  }
+
+  private MapSubject assertThatJsonMap(Object src) {
+    // Parse JSON into a raw Java map:
+    //  * Doesn't depend on field iteration order.
+    //  * Avoids excessively long string literals in asserts.
+    Map<Object, Object> map =
+        gson.fromJson(gson.toJson(src), new TypeToken<Map<Object, Object>>() {}.getType());
+    return assertThat(map);
+  }
+
+  private static ImmutableMap<Object, Object> map(Object k, Object v) {
+    return ImmutableMap.of(k, v);
+  }
+
+  private static ImmutableList<Object> list(Object... es) {
+    return ImmutableList.copyOf(es);
+  }
+}
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..b87c4a1
--- /dev/null
+++ b/javatests/com/google/gerrit/server/mail/send/NotificationEmailTest.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.mail.send;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.gerrit.server.mail.send.NotificationEmail.getInstanceAndProjectName;
+import static com.google.gerrit.server.mail.send.NotificationEmail.getShortProjectName;
+
+import org.junit.Test;
+
+public class NotificationEmailTest {
+  @Test
+  public void instanceAndProjectName() throws Exception {
+    assertThat(getInstanceAndProjectName("test", "/my/api")).isEqualTo("test/api");
+    assertThat(getInstanceAndProjectName("test", "/api")).isEqualTo("test/api");
+    assertThat(getInstanceAndProjectName("test", "api")).isEqualTo("test/api");
+  }
+
+  @Test
+  public void instanceAndProjectNameNull() throws Exception {
+    assertThat(getInstanceAndProjectName(null, "/my/api")).isEqualTo("...api");
+    assertThat(getInstanceAndProjectName(null, "/api")).isEqualTo("api");
+    assertThat(getInstanceAndProjectName(null, "api")).isEqualTo("api");
+  }
+
+  @Test
+  public void shortProjectName() throws Exception {
+    assertThat(getShortProjectName("api")).isEqualTo("api");
+    assertThat(getShortProjectName("/api")).isEqualTo("api");
+    assertThat(getShortProjectName("/my/api")).isEqualTo("...api");
+    assertThat(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..7de50dc
--- /dev/null
+++ b/javatests/com/google/gerrit/server/permissions/RefControlTest.java
@@ -0,0 +1,1041 @@
+// 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 blockPartialRangeLocally() {
+    block(local, LABEL + "Code-Review", +1, +2, DEVS, "refs/heads/master");
+
+    ProjectControl u = user(local, DEVS);
+
+    PermissionRange range = u.controlForRef("refs/heads/master").getRange(LABEL + "Code-Review");
+    assertCannotVote(2, range);
+  }
+
+  @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 7e4d2e8..3aee3aa 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",
@@ -309,3 +504,9 @@
     visibility = ["//visibility:public"],
     exports = ["@postgresql//jar"],
 )
+
+sh_test(
+    name = "nongoogle_test",
+    srcs = ["nongoogle_test.sh"],
+    data = ["//tools:nongoogle.bzl"],
+)
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..587fd8a 100644
--- a/lib/greenmail/BUILD
+++ b/lib/greenmail/BUILD
@@ -1,7 +1,22 @@
 package(default_visibility = ["//visibility:public"])
 
+POST_JDK8_DEPS = [":javax-activation"]
+
+java_library(
+    name = "javax-activation",
+    testonly = 1,
+    data = ["//lib:LICENSE-DO_NOT_DISTRIBUTE"],
+    exports = ["@javax-activation//jar"],
+)
+
 java_library(
     name = "greenmail",
+    testonly = True,
     data = ["//lib:LICENSE-Apache2.0"],
     exports = ["@greenmail//jar"],
+    runtime_deps = select({
+        "//:java9": POST_JDK8_DEPS,
+        "//:java_next": POST_JDK8_DEPS,
+        "//conditions:default": [],
+    }),
 )
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..3d13d83 100644
--- a/lib/highlightjs/highlight.min.js
+++ b/lib/highlightjs/highlight.min.js
@@ -1,124 +1,481 @@
 /*
- 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.15.10 | BSD3 License | git.io/hljslicense */
+var $jscomp=$jscomp||{};$jscomp.scope={};$jscomp.arrayIteratorImpl=function(b){var k=0;return function(){return k<b.length?{done:!1,value:b[k++]}:{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,k,t){b!=Array.prototype&&b!=Object.prototype&&(b[k]=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.SymbolClass=function(b,k){this.$jscomp$symbol$id_=b;$jscomp.defineProperty(this,"description",{configurable:!0,writable:!0,value:k})};$jscomp.SymbolClass.prototype.toString=function(){return this.$jscomp$symbol$id_};$jscomp.Symbol=function(){function b(t){if(this instanceof b)throw new TypeError("Symbol is not a constructor");return new $jscomp.SymbolClass($jscomp.SYMBOL_PREFIX+(t||"")+"_"+k++,t)}var k=0;return b}();
+$jscomp.initSymbolIterator=function(){$jscomp.initSymbol();var b=$jscomp.global.Symbol.iterator;b||(b=$jscomp.global.Symbol.iterator=$jscomp.global.Symbol("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("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,k){$jscomp.initSymbolIterator();b instanceof String&&(b+="");var t=0,r={next:function(){if(t<b.length){var u=t++;return{value:k(u,b[u]),done:!1}}r.next=function(){return{done:!0,value:void 0}};return r.next()}};r[Symbol.iterator]=function(){return r};return r};
+$jscomp.polyfill=function(b,k,t,r){if(k){t=$jscomp.global;b=b.split(".");for(r=0;r<b.length-1;r++){var u=b[r];u in t||(t[u]={});t=t[u]}b=b[b.length-1];r=t[b];k=k(r);k!=r&&null!=k&&$jscomp.defineProperty(t,b,{configurable:!0,writable:!0,value:k})}};$jscomp.polyfill("Array.prototype.keys",function(b){return b?b:function(){return $jscomp.iteratorFromArray(this,function(b){return b})}},"es6","es3");
+(function(b){var k="object"===typeof window&&window||"object"===typeof self&&self;"undefined"===typeof exports||exports.nodeType?k&&(k.hljs=b({}),"function"===typeof define&&define.amd&&define([],function(){return k.hljs})):b(exports)})(function(b){function k(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 r(a){var c,b={},e=Array.prototype.slice.call(arguments,1);for(c in a)b[c]=a[c];e.forEach(function(a){for(c in a)b[c]=
+a[c]});return b}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 N(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){m+="<"+a.nodeName.toLowerCase()+
+H.map.call(a.attributes,function(a){return" "+a.nodeName+'="'+k(a.value).replace('"',"&quot;")+'"'}).join("")+">"}function g(a){m+="</"+a.nodeName.toLowerCase()+">"}function h(a){("start"===a.event?f:g)(a.node)}for(var n=0,m="",p=[];a.length||c.length;){var l=d();m+=k(b.substring(n,l[0].offset));n=l[0].offset;if(l===a){p.reverse().forEach(g);do h(l.splice(0,1)[0]),l=d();while(l===a&&l.length&&l[0].offset===n);p.reverse().forEach(f)}else"start"===l[0].event?p.push(l[0].node):p.pop(),h(l.splice(0,1)[0])}return m+
+k(b.substr(n))}function O(a){a.variants&&!a.cached_variants&&(a.cached_variants=a.variants.map(function(c){return r(a,{variants:null},c)}));return a.cached_variants||a.endsWithParent&&[r(a)]||[a]}function I(a){if(y&&!a.langApiRestored){a.langApiRestored=!0;for(var c in y)a[c]&&(a[y[c]]=a[c]);(a.contains||[]).concat(a.variants||[]).forEach(I)}}function P(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(a,b){for(var d=
+/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./,e=0,f="",g=0;g<a.length;g++){var h=e,k=c(a[g]);for(0<g&&(f+=b);0<k.length;){var q=d.exec(k);if(null==q){f+=k;break}f+=k.substring(0,q.index);k=k.substring(q.index+q[0].length);"\\"==q[0][0]&&q[1]?f+="\\"+String(Number(q[1])+h):(f+=q[0],"("==q[0]&&e++)}}return f}function f(d,h){if(!d.compiled){d.compiled=!0;d.keywords=d.keywords||d.beginKeywords;if(d.keywords){var g={},m=function(c,d){a.case_insensitive&&(d=d.toLowerCase());d.split(" ").forEach(function(a){a=
+a.split("|");g[a[0]]=[c,a[1]?Number(a[1]):1]})};"string"===typeof d.keywords?m("keyword",d.keywords):D(d.keywords).forEach(function(a){m(a,d.keywords[a])});d.keywords=g}d.lexemesRe=b(d.lexemes||/\w+/,!0);h&&(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&&h.terminator_end&&
+(d.terminator_end+=(d.end?"|":"")+h.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 O("self"===a?d:a)}));d.contains.forEach(function(a){f(a,d)});d.starts&&f(d.starts,h);h=d.contains.map(function(a){return a.beginKeywords?"\\.?(?:"+a.begin+")\\.?":a.begin}).concat([d.terminator_end,d.illegal]).map(c).filter(Boolean);d.terminators=h.length?b(e(h,"|"),!0):
+{exec:function(){return null}}}}f(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 a?'<span class="'+(b?"":w.classPrefix)+(a+'">')+c+(d?"":"</span>"):c}function h(){var a=x,c;if(null!=l.subLanguage)if((c="string"===typeof l.subLanguage)&&!z[l.subLanguage])c=k(q);else{var d=c?B(l.subLanguage,q,!0,r[l.subLanguage]):F(q,l.subLanguage.length?l.subLanguage:void 0);0<l.relevance&&
+(u+=d.relevance);c&&(r[l.subLanguage]=d.top);c=g(d.language,d.value,!1,!0)}else if(l.keywords){d="";var b=0;l.lexemesRe.lastIndex=0;for(c=l.lexemesRe.exec(q);c;){d+=k(q.substring(b,c.index));b=l;var e=c;e=p.case_insensitive?e[0].toLowerCase():e[0];(b=b.keywords.hasOwnProperty(e)&&b.keywords[e])?(u+=b[1],d+=g(b[0],k(c[0]))):d+=k(c[0]);b=l.lexemesRe.lastIndex;c=l.lexemesRe.exec(q)}c=d+k(q.substr(b))}else c=k(q);x=a+c;q=""}function n(a){x+=a.className?g(a.className,"",!0):"";l=Object.create(a,{parent:{value:l}})}
+function m(a,c){q+=a;if(null==c)return h(),0;a:{a=l;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?q+=c:(a.excludeBegin&&(q+=c),h(),a.returnBegin||a.excludeBegin||(q=c)),n(a,c),a.returnBegin?0:c.length;if(a=e(l,c)){f=l;f.skip?q+=c:(f.returnEnd||f.excludeEnd||(q+=c),h(),f.excludeEnd&&
+(q=c));do l.className&&(x+="</span>"),l.skip||l.subLanguage||(u+=l.relevance),l=l.parent;while(l!==a.parent);a.starts&&(a.endSameAsBegin&&(a.starts.endRe=a.endRe),n(a.starts,""));return f.returnEnd?0:c.length}if(!d&&t(l.illegalRe,c))throw Error('Illegal lexeme "'+c+'" for mode "'+(l.className||"<unnamed>")+'"');q+=c;return c.length||1}var p=A(a);if(!p)throw Error('Unknown language: "'+a+'"');P(p);var l=b||p,r={},x="";for(b=l;b!==p;b=b.parent)b.className&&(x=g(b.className,"",!0)+x);var q="",u=0;try{for(var v,
+y,C=0;;){l.terminators.lastIndex=C;v=l.terminators.exec(c);if(!v)break;y=m(c.substring(C,v.index),v[0]);C=v.index+y}m(c.substr(C));for(b=l;b.parent;b=b.parent)b.className&&(x+="</span>");return{relevance:u,value:x,language:a,top:l}}catch(E){if(E.message&&-1!==E.message.indexOf("Illegal"))return{relevance:0,value:k(c)};throw E;}}function F(a,c){c=c||w.languages||D(z);var d={relevance:0,value:k(a)},b=d;c.filter(A).filter(J).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 K(a){return w.tabReplace||w.useBR?a.replace(Q,function(a,d){return w.useBR&&"\n"===a?"<br>":w.tabReplace?d.replace(/\t/g,w.tabReplace):""}):a}function L(a){var c,d;a:{var b=a.className+" ";b+=a.parentNode?a.parentNode.className:"";if(d=R.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(M.test(f)||A(f)){d=f;break a}}d=void 0}}if(!M.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):F(c);f=u(f);if(f.length){var g=document.createElementNS("http://www.w3.org/1999/xhtml","div");g.innerHTML=b.value;b.value=N(f,u(g),c)}b.value=K(b.value);a.innerHTML=b.value;c=a.className;d=d?G[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");H.forEach.call(a,L)}}function A(a){a=(a||"").toLowerCase();return z[a]||z[G[a]]}function J(a){return(a=A(a))&&!a.disableAutodetect}var H=[],D=Object.keys,z={},G={},M=/^(no-?highlight|plain|text)$/i,R=/\blang(?:uage)?-([\w-]+)\b/i,Q=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,y,w={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0};b.highlight=B;b.highlightAuto=
+F;b.fixMarkup=K;b.highlightBlock=L;b.configure=function(a){w=r(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);I(c);c.aliases&&c.aliases.forEach(function(c){G[c]=a})};b.listLanguages=function(){return D(z)};b.getLanguage=A;b.autoDetection=J;b.inherit=r;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"([^()\\ ]{0,16})\((?:.|\n)*?\)\1"/},{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*\\(",h={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,
+literal:"true false nullptr NULL"},n=[c,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,e,b];return{aliases:"c cc h c++ h++ hpp hh hxx cxx".split(" "),keywords:h,illegal:"</",contains:n.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:h,contains:["self",c]},{begin:a.IDENT_RE+"::",keywords:h},{variants:[{begin:/=/,end:/;/},{begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",
+end:/;/}],keywords:h,contains:n.concat([{begin:/\(/,end:/\)/,keywords:h,contains:n.concat(["self"]),relevance:0}]),relevance:0},{className:"function",begin:"("+a.IDENT_RE+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0,keywords:h,illegal:/[^\w\s\*&]/,contains:[{begin:g,returnBegin:!0,contains:[a.TITLE_MODE],relevance:0},{className:"params",begin:/\(/,end:/\)/,keywords:h,relevance:0,contains:[a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b,e,c,{begin:/\(/,end:/\)/,keywords:h,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:h}}});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 wsf".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","vbscript"]}},{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:"true false NOT AND OR",
+built_in:"ComSpec Clipboard ClipboardAll ErrorLevel"},contains:[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:"variable",begin:"%[a-zA-Z0-9#_$@]+%"},{className:"built_in",begin:"^\\s*\\w+\\s*(,|%)"},{className:"title",variants:[{begin:'^[^\\n";]+::(?!=)'},{begin:'^[^\\n";]+:(?!=)',relevance:0}]},{className:"meta",begin:"^\\s*#\\w+",end:"$",relevance:0},{className:"built_in",begin:"A_[a-zA-Z0-9]+"},
+{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:"",begin:/\\"/},{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:"[\\]\\}]"},h=
+{className:"comment",begin:"\\^[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},n=a.COMMENT("\\^\\{","\\}"),m={className:"symbol",begin:"[:]{1,2}[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},p={begin:"\\(",end:"\\)"},l={endsWithParent:!0,relevance:0},k={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:l},r=[p,b,h,n,e,m,g,c,f,{begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",relevance:0}];p.contains=[a.COMMENT("comment",""),k,l];l.contains=r;g.contains=r;n.contains=[g];return{aliases:["clj"],illegal:/\S/,contains:[p,b,h,n,e,m,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},h={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},n={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},m={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},k={className:"meta",begin:"@\\[",end:"\\]",contains:[a.inherit(a.QUOTE_STRING_MODE,{className:"meta-string"})]};
+a=[f,g,h,m,n,k,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},h=a.inherit(g,{illegal:/\n/}),n={className:"string",begin:/\$"/,end:'"',illegal:/\n/,contains:[{begin:"{{"},
+{begin:"}}"},a.BACKSLASH_ESCAPE,h]},m={className:"string",begin:/\$@"/,end:'"',contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},g]},k=a.inherit(m,{illegal:/\n/,contains:[{begin:"{{"},{begin:"}}"},{begin:'""'},h]});g.contains=[m,n,e,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,b,a.C_BLOCK_COMMENT_MODE];h.contains=[k,n,f,a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,b,a.inherit(a.C_BLOCK_COMMENT_MODE,{illegal:/\n/})];e={variants:[m,n,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_\.\-]+|--[a-zA-Z0-9_-]+)\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,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}],
+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",
+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:"^\\s*([*+-]|(\\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 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]},
+h={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,h,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-]*/"},h={className:"symbol",begin:"^\\s*[a-zA-Z_][a-zA-Z\\d_]*:"},n={className:"params",begin:"<",end:">",contains:[b,f]},m={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,h,m,n,a.C_LINE_COMMENT_MODE,
+a.C_BLOCK_COMMENT_MODE,b,c]},f,g,h,m,n,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+)(?:.|\n)*?\n\s*\1\b/,returnBegin:!0,contains:[{begin:/<<[-~]?'?/},{begin:/\w+/,endSameAsBegin:!0,contains:[a.BACKSLASH_ESCAPE,f]}]}]},h={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*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?"}),h].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;h.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}]},h={begin:"{",end:"}",relevance:0},n={begin:"\\b_([A-Z][A-Za-z0-9_]*)?",relevance:0},m={begin:"[A-Z][a-zA-Z0-9_]*",relevance:0},k={begin:"#"+a.UNDERSCORE_IDENT_RE,relevance:0,
+returnBegin:!0,contains:[{begin:"#"+a.UNDERSCORE_IDENT_RE,relevance:0},{begin:"{",end:"}",relevance:0}]},l={beginKeywords:"fun receive if try case",end:"end",keywords:c};l.contains=[b,f,a.inherit(a.APOS_STRING_MODE,{className:""}),l,g,a.QUOTE_STRING_MODE,e,h,n,m,k];f=[b,f,l,g,a.QUOTE_STRING_MODE,e,h,n,m,k];g.contains[1].contains=f;h.contains=f;k.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,k,n,m,h,{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"},b=a.COMMENT("@",
+"@"),e={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,b]},f={begin:/\bstruct\s+/,end:/\s/,keywords:"struct",contains:[{className:"type",begin:a.UNDERSCORE_IDENT_RE,
+relevance:0}]},g=[{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,b,f]}],h={className:"title",begin:a.UNDERSCORE_IDENT_RE,relevance:0},n=function(c,d,e){c=a.inherit({className:"function",beginKeywords:c,end:d,excludeEnd:!0,contains:[].concat(g)},e||{});c.contains.push(h);c.contains.push(a.C_NUMBER_MODE);c.contains.push(a.C_BLOCK_COMMENT_MODE);c.contains.push(b);
+return c},m={className:"built_in",begin:"\\b("+c.built_in.split(" ").join("|")+")\\b"},k={className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE],relevance:0},l={begin:a.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,keywords:c,relevance:0,contains:[{beginKeywords:c.keyword},m,{className:"built_in",begin:a.UNDERSCORE_IDENT_RE,relevance:0}]};m={begin:/\(/,end:/\)/,relevance:0,keywords:{built_in:c.built_in,literal:c.literal},contains:[a.C_NUMBER_MODE,a.C_BLOCK_COMMENT_MODE,b,m,l,k,"self"]};
+l.contains.push(m);return{aliases:["gss"],case_insensitive:!0,keywords:c,illegal:/(\{[%#]|[%#]\}| <- )/,contains:[a.C_NUMBER_MODE,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,b,k,e,{className:"keyword",begin:/\bexternal (matrix|string|array|sparse matrix|struct|proc|keyword|fn)/},n("proc keyword",";"),n("fn","="),{beginKeywords:"for threadfor",end:/;/,relevance:0,contains:[a.C_BLOCK_COMMENT_MODE,b,m]},{variants:[{begin:a.UNDERSCORE_IDENT_RE+"\\."+a.UNDERSCORE_IDENT_RE},{begin:a.UNDERSCORE_IDENT_RE+
+"\\s*="}],relevance:0},l,f]}});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+"[i]",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 b={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:b}]},{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 b={className:"number",begin:"[-+]?\\d+(\\.\\d+)?",relevance:0},d=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:"[\\]\\}]"},h={className:"comment",begin:"\\^[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},k=a.COMMENT("\\^\\{","\\}"),m={className:"symbol",begin:"[:]{1,2}[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*"},p={begin:"\\(",end:"\\)"},l={endsWithParent:!0,relevance:0},r={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:l},t=[p,d,h,k,e,m,g,b,f,{begin:"[a-zA-Z_\\-!.?+*=<>&#'][a-zA-Z_\\-!.?+*=<>&#'0-9/;:]*",relevance:0}];p.contains=[a.COMMENT("comment",""),r,l];l.contains=t;g.contains=t;return{aliases:["hylang"],illegal:/\S/,contains:[{className:"meta",begin:"^#!",end:"$"},p,d,h,k,e,m,g,b,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 b={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:[a.COMMENT(";","$"),a.HASH_COMMENT_MODE,{className:"literal",begin:/\bon|off|true|false|yes|no\b/},{className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{begin:/\$\{(.*?)}/}]},b,{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 b={className:"number",begin:a.NUMBER_RE,relevance:0},d={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},h={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,contains:[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,h,d,b,e]},g,a,h,d,b,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.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 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",
 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*\\<",
+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:[]},f={begin:"html`",end:"",starts:{end:"`",returnEnd:!1,contains:[a.BACKSLASH_ESCAPE,e],subLanguage:"xml"}},g={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[a.BACKSLASH_ESCAPE,e],subLanguage:"css"}},h={className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,e]};e.contains=[a.APOS_STRING_MODE,
+a.QUOTE_STRING_MODE,f,g,h,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,f,g,h,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}]}]},{className:"",begin:/\s/,end:/\s*/,skip:!0},{begin:/</,
+end:/(\/[A-Za-z0-9\\._:-]+|[A-Za-z0-9\\._:-]+\/)>/,subLanguage:"xml",contains:[{begin:/<[A-Za-z0-9\\._:-]+\s*\/>/,skip:!0},{begin:/<[A-Za-z0-9\\._:-]+/,end:/(\/[A-Za-z0-9\\._:-]+|[A-Za-z0-9\\._:-]+\/)>/,skip:!0,contains:[{begin:/<[A-Za-z0-9\\._:-]+\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.C_NUMBER_MODE]},f={className:"variable",begin:"\\$"+a.UNDERSCORE_IDENT_RE};f={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]}]};e.contains.push(f);
+e={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(f,{className:"meta-string"})]}]},h=a.COMMENT("/\\*","\\*/",{contains:[a.C_BLOCK_COMMENT_MODE]}),k={variants:[{className:"type",begin:a.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/,contains:[]}]};k.variants[1].contains=[k];k.variants[1].contains=[k];return{aliases:["kt"],
+keywords:b,contains:[a.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),a.C_LINE_COMMENT_MODE,h,{className:"keyword",begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol",begin:/@\w+/}]}},d,e,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:[k,a.C_LINE_COMMENT_MODE,h],relevance:0},a.C_LINE_COMMENT_MODE,h,e,g,f,a.C_NUMBER_MODE]},h]},{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},e,g]},f,{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 h={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 k={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,h,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,k,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_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},h={begin:"[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*",
+relevance:0},k={contains:[d,e,f,g,{begin:"\\(",end:"\\)",contains:["self",b,e,d,h]},h],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_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*)*"}]},p={begin:"\\(\\s*",end:"\\)"},
+l={endsWithParent:!0,relevance:0};p.contains=[{className:"name",variants:[{begin:"[a-zA-Z_\\-\\+\\*\\/\\<\\=\\>\\&\\#][a-zA-Z0-9_\\-\\+\\*\\/\\<\\=\\>\\&\\#!]*"},{begin:"\\|[^]*?\\|"}]},l];l.contains=[k,m,p,b,d,e,a,f,g,{begin:"\\|[^]*?\\|"},h];return{illegal:/\S/,contains:[d,{className:"meta",begin:"^#!",end:"$"},b,e,a,k,m,p,h]}});b.registerLanguage("livecodeserver",function(a){var b={className:"variable",variants:[{begin:"\\b([gtps][A-Z]{1}[a-zA-Z0-9]*)(\\[.+\\])?(?:\\s*?)"},{begin:"\\$_[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 difference 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 messageAuthenticationCode messageDigest 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 libURLSetDriver libURLSetCustomHTTPHeaders libUrlSetExpect100 libURLSetFTPListCommand libURLSetFTPMode libURLSetFTPStopTime libURLSetStatusCallback load extension loadedExtensions 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 symmetric union unload vectorDotProduct 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","wl"],lexemes:"(\\$|\\b)"+a.IDENT_RE+"\\b",keywords:"AASTriangle AbelianGroup Abort AbortKernels AbortProtect AbortScheduledTask Above Abs AbsArg AbsArgPlot Absolute AbsoluteCorrelation AbsoluteCorrelationFunction AbsoluteCurrentValue AbsoluteDashing AbsoluteFileName AbsoluteOptions AbsolutePointSize AbsoluteThickness AbsoluteTime AbsoluteTiming AcceptanceThreshold AccountingForm Accumulate Accuracy AccuracyGoal ActionDelay ActionMenu ActionMenuBox ActionMenuBoxOptions Activate Active ActiveClassification ActiveClassificationObject ActiveItem ActivePrediction ActivePredictionObject ActiveStyle AcyclicGraphQ AddOnHelpPath AddSides AddTo AddToSearchIndex AddUsers AdjacencyGraph AdjacencyList AdjacencyMatrix AdjustmentBox AdjustmentBoxOptions AdjustTimeSeriesForecast AdministrativeDivisionData AffineHalfSpace AffineSpace AffineStateSpaceModel AffineTransform After AggregatedEntityClass AggregationLayer AircraftData AirportData AirPressureData AirTemperatureData AiryAi AiryAiPrime AiryAiZero AiryBi AiryBiPrime AiryBiZero AlgebraicIntegerQ AlgebraicNumber AlgebraicNumberDenominator AlgebraicNumberNorm AlgebraicNumberPolynomial AlgebraicNumberTrace AlgebraicRules AlgebraicRulesData Algebraics AlgebraicUnitQ Alignment AlignmentMarker AlignmentPoint All AllowAdultContent AllowedCloudExtraParameters AllowedCloudParameterExtensions AllowedDimensions AllowedFrequencyRange AllowedHeads AllowGroupClose AllowIncomplete AllowInlineCells AllowKernelInitialization AllowLooseGrammar AllowReverseGroupClose AllowScriptLevelChange AllTrue Alphabet AlphabeticOrder AlphabeticSort AlphaChannel AlternateImage AlternatingFactorial AlternatingGroup AlternativeHypothesis Alternatives AltitudeMethod AmbientLight AmbiguityFunction AmbiguityList Analytic AnatomyData AnatomyForm AnatomyPlot3D AnatomySkinStyle AnatomyStyling AnchoredSearch And AndersonDarlingTest AngerJ AngleBisector AngleBracket AnglePath AnglePath3D AngleVector AngularGauge Animate AnimationCycleOffset AnimationCycleRepetitions AnimationDirection AnimationDisplayTime AnimationRate AnimationRepetitions AnimationRunning AnimationRunTime AnimationTimeIndex Animator AnimatorBox AnimatorBoxOptions AnimatorElements Annotate Annotation AnnotationDelete AnnotationNames AnnotationRules AnnotationValue Annuity AnnuityDue Annulus AnomalyDetection AnomalyDetectorFunction Anonymous Antialiasing AntihermitianMatrixQ Antisymmetric AntisymmetricMatrixQ Antonyms AnyOrder AnySubset AnyTrue Apart ApartSquareFree APIFunction Appearance AppearanceElements AppearanceRules AppellF1 Append AppendCheck AppendLayer AppendTo ApplicationIdentificationKey Apply ApplySides ArcCos ArcCosh ArcCot ArcCoth ArcCsc ArcCsch ArcCurvature ARCHProcess ArcLength ArcSec ArcSech ArcSin ArcSinDistribution ArcSinh ArcTan ArcTanh Area Arg ArgMax ArgMin ArgumentCountQ ARIMAProcess ArithmeticGeometricMean ARMAProcess Around AroundReplace ARProcess Array ArrayComponents ArrayDepth ArrayFilter ArrayFlatten ArrayMesh ArrayPad ArrayPlot ArrayQ ArrayResample ArrayReshape ArrayRules Arrays Arrow Arrow3DBox ArrowBox Arrowheads ASATriangle Ask AskAppend AskConfirm AskDisplay AskedQ AskedValue AskFunction AskState AskTemplateDisplay AspectRatio AspectRatioFixed Assert AssociateTo Association AssociationFormat AssociationMap AssociationQ AssociationThread AssumeDeterministic Assuming Assumptions AstronomicalData AsymptoticDSolveValue AsymptoticEqual AsymptoticEquivalent AsymptoticGreater AsymptoticGreaterEqual AsymptoticIntegrate AsymptoticLess AsymptoticLessEqual AsymptoticOutputTracker AsymptoticRSolveValue AsymptoticSolve AsymptoticSum Asynchronous AsynchronousTaskObject AsynchronousTasks Atom AtomCoordinates AtomCount AtomDiagramCoordinates AtomList AtomQ AttentionLayer Attributes Audio AudioAmplify AudioAnnotate AudioAnnotationLookup AudioBlockMap AudioCapture AudioChannelAssignment AudioChannelCombine AudioChannelMix AudioChannels AudioChannelSeparate AudioData AudioDelay AudioDelete AudioDevice AudioDistance AudioFade AudioFrequencyShift AudioGenerator AudioIdentify AudioInputDevice AudioInsert AudioIntervals AudioJoin AudioLabel AudioLength AudioLocalMeasurements AudioLooping AudioLoudness AudioMeasurements AudioNormalize AudioOutputDevice AudioOverlay AudioPad AudioPan AudioPartition AudioPause AudioPitchShift AudioPlay AudioPlot AudioQ AudioRecord AudioReplace AudioResample AudioReverb AudioSampleRate AudioSpectralMap AudioSpectralTransformation AudioSplit AudioStop AudioStream AudioStreams AudioTimeStretch AudioTrim AudioType AugmentedPolyhedron AugmentedSymmetricPolynomial Authenticate Authentication AuthenticationDialog AutoAction Autocomplete AutocompletionFunction AutoCopy AutocorrelationTest AutoDelete AutoEvaluateEvents AutoGeneratedPackage AutoIndent AutoIndentSpacings AutoItalicWords AutoloadPath AutoMatch Automatic AutomaticImageSize AutoMultiplicationSymbol AutoNumberFormatting AutoOpenNotebooks AutoOpenPalettes AutoQuoteCharacters AutoRefreshed AutoRemove AutorunSequencing AutoScaling AutoScroll AutoSpacing AutoStyleOptions AutoStyleWords AutoSubmitting Axes AxesEdge AxesLabel AxesOrigin AxesStyle AxiomaticTheory AxisBabyMonsterGroupB Back Background BackgroundAppearance BackgroundTasksSettings Backslash Backsubstitution Backward Ball Band BandpassFilter BandstopFilter BarabasiAlbertGraphDistribution BarChart BarChart3D BarcodeImage BarcodeRecognize BaringhausHenzeTest BarLegend BarlowProschanImportance BarnesG BarOrigin BarSpacing BartlettHannWindow BartlettWindow BaseDecode BaseEncode BaseForm Baseline BaselinePosition BaseStyle BasicRecurrentLayer BatchNormalizationLayer BatchSize BatesDistribution BattleLemarieWavelet BayesianMaximization BayesianMaximizationObject BayesianMinimization BayesianMinimizationObject 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 Between BetweennessCentrality BeveledPolyhedron BezierCurve BezierCurve3DBox BezierCurve3DBoxOptions BezierCurveBox BezierCurveBoxOptions BezierFunction BilateralFilter Binarize BinaryDeserialize BinaryDistance BinaryFormat BinaryImageQ BinaryRead BinaryReadList BinarySerialize BinaryWrite BinCounts BinLists Binomial BinomialDistribution BinomialProcess BinormalDistribution BiorthogonalSplineWavelet BipartiteGraphQ BiquadraticFilterModel BirnbaumImportance BirnbaumSaundersDistribution BitAnd BitClear BitGet BitLength BitNot BitOr BitSet BitShiftLeft BitShiftRight BitXor BiweightLocation BiweightMidvariance Black BlackmanHarrisWindow BlackmanNuttallWindow BlackmanWindow Blank BlankForm BlankNullSequence BlankSequence Blend Block BlockchainAddressData BlockchainBase BlockchainBlockData BlockchainContractValue BlockchainData BlockchainGet BlockchainKeyEncode BlockchainPut BlockchainTokenData BlockchainTransaction BlockchainTransactionData BlockchainTransactionSign BlockchainTransactionSubmit BlockMap BlockRandom BlomqvistBeta BlomqvistBetaTest Blue Blur BodePlot BohmanWindow Bold Bond BondCount BondList BondQ Bookmarks Boole BooleanConsecutiveFunction BooleanConvert BooleanCountingFunction BooleanFunction BooleanGraph BooleanMaxterms BooleanMinimize BooleanMinterms BooleanQ BooleanRegion Booleans BooleanStrings BooleanTable BooleanVariables BorderDimensions BorelTannerDistribution Bottom BottomHatTransform BoundaryDiscretizeGraphics BoundaryDiscretizeRegion BoundaryMesh BoundaryMeshRegion BoundaryMeshRegionQ BoundaryStyle BoundedRegionQ BoundingRegion Bounds Box BoxBaselineShift BoxData BoxDimensions Boxed Boxes BoxForm BoxFormFormatTypes BoxFrame BoxID BoxMargins BoxMatrix BoxObject BoxRatios BoxRotation BoxRotationPoint BoxStyle BoxWhiskerChart Bra BracketingBar BraKet BrayCurtisDistance BreadthFirstScan Break BridgeData BrightnessEqualize BroadcastStationData Brown BrownForsytheTest BrownianBridgeProcess BrowserCategory BSplineBasis BSplineCurve BSplineCurve3DBox BSplineCurve3DBoxOptions BSplineCurveBox BSplineCurveBoxOptions BSplineFunction BSplineSurface BSplineSurface3DBox BSplineSurface3DBoxOptions BubbleChart BubbleChart3D BubbleScale BubbleSizes BuildingData BulletGauge BusinessDayQ ButterflyGraph ButterworthFilterModel Button ButtonBar ButtonBox ButtonBoxOptions ButtonCell ButtonContents ButtonData ButtonEvaluator ButtonExpandable ButtonFrame ButtonFunction ButtonMargins ButtonMinHeight ButtonNote ButtonNotebook ButtonSource ButtonStyle ButtonStyleMenuListing Byte ByteArray ByteArrayFormat ByteArrayQ ByteArrayToString ByteCount ByteOrderingC CachedValue CacheGraphics CachePersistence CalendarConvert CalendarData CalendarType Callout CalloutMarker CalloutStyle CallPacket CanberraDistance Cancel CancelButton CandlestickChart CanonicalGraph CanonicalizePolygon CanonicalizePolyhedron CanonicalName CanonicalWarpingCorrespondence CanonicalWarpingDistance CantorMesh CantorStaircase Cap CapForm CapitalDifferentialD Capitalize CapsuleShape CaptureRunning CardinalBSplineBasis CarlemanLinearize CarmichaelLambda CaseOrdering Cases CaseSensitive Cashflow Casoratian Catalan CatalanNumber Catch Catenate CatenateLayer CauchyDistribution CauchyWindow CayleyGraph CDF CDFDeploy CDFInformation CDFWavelet Ceiling CelestialSystem Cell CellAutoOverwrite CellBaseline CellBoundingBox CellBracketOptions CellChangeTimes CellContents CellContext CellDingbat CellDynamicExpression CellEditDuplicate CellElementsBoundingBox CellElementSpacings CellEpilog CellEvaluationDuplicate CellEvaluationFunction CellEvaluationLanguage CellEventActions CellFrame CellFrameColor CellFrameLabelMargins CellFrameLabels CellFrameMargins CellGroup CellGroupData CellGrouping CellGroupingRules CellHorizontalScrolling CellID CellLabel CellLabelAutoDelete CellLabelMargins CellLabelPositioning CellLabelStyle CellLabelTemplate CellMargins CellObject CellOpen CellPrint CellProlog Cells CellSize CellStyle CellTags CellularAutomaton CensoredDistribution Censoring Center CenterArray CenterDot CentralFeature CentralMoment CentralMomentGeneratingFunction Cepstrogram CepstrogramArray CepstrumArray CForm ChampernowneNumber ChangeOptions ChannelBase ChannelBrokerAction ChannelDatabin ChannelHistoryLength ChannelListen ChannelListener ChannelListeners ChannelListenerWait ChannelObject ChannelPreSendFunction ChannelReceiverFunction ChannelSend ChannelSubscribers ChanVeseBinarize Character CharacterCounts CharacterEncoding CharacterEncodingsPath CharacteristicFunction CharacteristicPolynomial CharacterName 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 ChromaticityPlot ChromaticityPlot3D ChromaticPolynomial Circle CircleBox CircleDot CircleMinus CirclePlus CirclePoints CircleThrough CircleTimes CirculantGraph CircularOrthogonalMatrixDistribution CircularQuaternionMatrixDistribution CircularRealMatrixDistribution CircularSymplecticMatrixDistribution CircularUnitaryMatrixDistribution Circumsphere CityData ClassifierFunction ClassifierInformation ClassifierMeasurements ClassifierMeasurementsObject Classify ClassPriors Clear ClearAll ClearAttributes ClearCookies ClearPermissions ClearSystemCache ClebschGordan ClickPane Clip ClipboardNotebook ClipFill ClippingStyle ClipPlanes ClipPlanesStyle ClipRange Clock ClockGauge ClockwiseContourIntegral Close Closed CloseKernels ClosenessCentrality Closing ClosingAutoSave ClosingEvent CloudAccountData CloudBase CloudConnect CloudDeploy CloudDirectory CloudDisconnect CloudEvaluate CloudExport CloudExpression CloudExpressions CloudFunction CloudGet CloudImport CloudLoggingData CloudObject CloudObjectInformation CloudObjectInformationData CloudObjectNameFormat CloudObjects CloudObjectURLType CloudPublish CloudPut CloudRenderingMethod CloudSave CloudShare CloudSubmit CloudSymbol CloudUnshare ClusterClassify ClusterDissimilarityFunction ClusteringComponents ClusteringTree CMYKColor Coarse CodeAssistOptions Coefficient CoefficientArrays CoefficientDomain CoefficientList CoefficientRules CoifletWavelet Collect Colon ColonForm ColorBalance ColorCombine ColorConvert ColorCoverage ColorData ColorDataFunction ColorDetect ColorDistance ColorFunction ColorFunctionScaling Colorize ColorNegate ColorOutput ColorProfileData ColorQ ColorQuantize ColorReplace ColorRules ColorSelectorSettings ColorSeparate ColorSetter ColorSetterBox ColorSetterBoxOptions ColorSlider ColorsNear ColorSpace ColorToneMapping Column ColumnAlignments ColumnBackgrounds ColumnForm ColumnLines ColumnsEqual ColumnSpacings ColumnWidths CombinedEntityClass CombinerFunction CometData CommonDefaultFormatTypes Commonest CommonestFilter CommonName CommonUnits CommunityBoundaryStyle CommunityGraphPlot CommunityLabels CommunityRegionStyle CompanyData CompatibleUnitQ CompilationOptions CompilationTarget Compile Compiled CompiledCodeFunction CompiledFunction CompilerOptions Complement CompleteGraph CompleteGraphQ CompleteKaryTree CompletionsListPacket Complex Complexes ComplexExpand ComplexInfinity ComplexityFunction ComplexListPlot ComplexPlot ComplexPlot3D ComponentMeasurements ComponentwiseContextMenu Compose ComposeList ComposeSeries CompositeQ Composition CompoundElement CompoundExpression CompoundPoissonDistribution CompoundPoissonProcess CompoundRenewalProcess Compress CompressedData ComputeUncertainty Condition ConditionalExpression Conditioned Cone ConeBox ConfidenceLevel ConfidenceRange ConfidenceTransform ConfigurationPath ConformAudio ConformImages Congruent ConicHullRegion ConicHullRegion3DBox ConicHullRegionBox ConicOptimization Conjugate ConjugateTranspose Conjunction Connect ConnectedComponents ConnectedGraphComponents ConnectedGraphQ ConnectedMeshComponents ConnectedMoleculeComponents ConnectedMoleculeQ ConnectionSettings ConnectLibraryCallbackFunction ConnectSystemModelComponents ConnesWindow ConoverTest ConsoleMessage ConsoleMessagePacket ConsolePrint Constant ConstantArray ConstantArrayLayer ConstantImage ConstantPlusLayer ConstantRegionQ Constants ConstantTimesLayer ConstellationData ConstrainedMax ConstrainedMin Construct Containing ContainsAll ContainsAny ContainsExactly ContainsNone ContainsOnly ContentFieldOptions ContentLocationFunction ContentObject ContentPadding ContentsBoundingBox ContentSelectable ContentSize Context ContextMenu Contexts ContextToFileName Continuation Continue ContinuedFraction ContinuedFractionK ContinuousAction ContinuousMarkovProcess ContinuousTask ContinuousTimeModelQ ContinuousWaveletData ContinuousWaveletTransform ContourDetect ContourGraphics ContourIntegral ContourLabels ContourLines ContourPlot ContourPlot3D Contours ContourShading ContourSmoothing ContourStyle ContraharmonicMean ContrastiveLossLayer Control ControlActive ControlAlignment ControlGroupContentsBox ControllabilityGramian ControllabilityMatrix ControllableDecomposition ControllableModelQ ControllerDuration ControllerInformation ControllerInformationData ControllerLinking ControllerManipulate ControllerMethod ControllerPath ControllerState ControlPlacement ControlsRendering ControlType Convergents ConversionOptions ConversionRules ConvertToBitmapPacket ConvertToPostScript ConvertToPostScriptPacket ConvexHullMesh ConvexPolygonQ ConvexPolyhedronQ ConvolutionLayer Convolve ConwayGroupCo1 ConwayGroupCo2 ConwayGroupCo3 CookieFunction Cookies CoordinateBoundingBox CoordinateBoundingBoxArray CoordinateBounds CoordinateBoundsArray CoordinateChartData CoordinatesToolOptions CoordinateTransform CoordinateTransformData CoprimeQ Coproduct CopulaDistribution Copyable CopyDatabin CopyDirectory CopyFile CopyTag CopyToClipboard CornerFilter CornerNeighbors Correlation CorrelationDistance CorrelationFunction CorrelationTest Cos Cosh CoshIntegral CosineDistance CosineWindow CosIntegral Cot Coth Count CountDistinct CountDistinctBy CounterAssignments CounterBox CounterBoxOptions CounterClockwiseContourIntegral CounterEvaluator CounterFunction CounterIncrements CounterStyle CounterStyleMenuListing CountRoots CountryData Counts CountsBy Covariance CovarianceEstimatorFunction CovarianceFunction CoxianDistribution CoxIngersollRossProcess CoxModel CoxModelFit CramerVonMisesTest CreateArchive CreateCellID CreateChannel CreateCloudExpression CreateDatabin CreateDataSystemModel CreateDialog CreateDirectory CreateDocument CreateFile CreateIntermediateDirectories CreateManagedLibraryExpression CreateNotebook CreatePalette CreatePalettePacket CreatePermissionsGroup CreateScheduledTask CreateSearchIndex CreateSystemModel CreateTemporary CreateUUID CreateWindow CriterionFunction CriticalityFailureImportance CriticalitySuccessImportance CriticalSection Cross CrossEntropyLossLayer CrossingCount CrossingDetect CrossingPolygon CrossMatrix Csc Csch CTCLossLayer Cube CubeRoot Cubics Cuboid CuboidBox Cumulant CumulantGeneratingFunction Cup CupCap Curl CurlyDoubleQuote CurlyQuote CurrencyConvert CurrentDate CurrentImage CurrentlySpeakingPacket CurrentNotebookImage CurrentScreenImage CurrentValue Curry CurvatureFlowFilter CurveClosed Cyan CycleGraph CycleIndexPolynomial Cycles CyclicGroup Cyclotomic Cylinder CylinderBox CylindricalDecompositionD DagumDistribution DamData DamerauLevenshteinDistance DampingFactor Darker Dashed Dashing DatabaseConnect DatabaseDisconnect DatabaseReference Databin DatabinAdd DatabinRemove Databins DatabinUpload DataCompression DataDistribution DataRange DataReversed Dataset Date DateBounds Dated DateDelimiters DateDifference DatedUnit DateFormat DateFunction DateHistogram DateList DateListLogPlot DateListPlot DateListStepPlot DateObject DateObjectQ DateOverlapsQ DatePattern DatePlus DateRange DateReduction DateString DateTicksFormat DateValue DateWithinQ DaubechiesWavelet DavisDistribution DawsonF DayCount DayCountConvention DayHemisphere DaylightQ DayMatchQ DayName DayNightTerminator DayPlus DayRange DayRound DeBruijnGraph DeBruijnSequence Debug DebugTag Decapitalize Decimal DecimalForm DeclareKnownSymbols DeclarePackage Decompose DeconvolutionLayer Decrement Decrypt DecryptFile DedekindEta DeepSpaceProbeData 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 DefaultPrintPrecision DefaultStyle DefaultStyleDefinitions DefaultTextFormatType DefaultTextInlineFormatType DefaultTicksStyle DefaultTooltipStyle DefaultValue DefaultValues Defer DefineExternal DefineInputStreamMethod DefineOutputStreamMethod DefineResourceFunction Definition Degree DegreeCentrality DegreeGraphDistribution DegreeLexicographic DegreeReverseLexicographic DEigensystem DEigenvalues Deinitialization Del DelaunayMesh Delayed Deletable Delete DeleteAnomalies DeleteBorderComponents DeleteCases DeleteChannel DeleteCloudExpression DeleteContents DeleteDirectory DeleteDuplicates DeleteDuplicatesBy DeleteFile DeleteMissing DeleteObject DeletePermissionsKey DeleteSearchIndex DeleteSmallComponents DeleteStopwords DeleteWithContents DeletionWarning DelimitedArray DelimitedSequence Delimiter DelimiterFlashTime DelimiterMatching Delimiters DeliveryFunction Dendrogram Denominator DensityGraphics DensityHistogram DensityPlot DensityPlot3D DependentVariables Deploy Deployed Depth DepthFirstScan Derivative DerivativeFilter DerivedKey DescriptorStateSpace DesignMatrix DestroyAfterEvaluation Det DeviceClose DeviceConfigure DeviceExecute DeviceExecuteAsynchronous DeviceObject DeviceOpen DeviceOpenQ DeviceRead DeviceReadBuffer DeviceReadLatest DeviceReadList DeviceReadTimeSeries Devices DeviceStreams DeviceWrite DeviceWriteBuffer DGaussianWavelet DiacriticalPositioning Diagonal DiagonalizableMatrixQ DiagonalMatrix DiagonalMatrixQ Dialog DialogIndent DialogInput DialogLevel DialogNotebook DialogProlog DialogReturn DialogSymbols Diamond DiamondMatrix DiceDissimilarity DictionaryLookup DictionaryWordQ DifferenceDelta DifferenceOrder DifferenceQuotient DifferenceRoot DifferenceRootReduce Differences DifferentialD DifferentialRoot DifferentialRootReduce DifferentiatorFilter DigitalSignature DigitBlock DigitBlockMinimum DigitCharacter DigitCount DigitQ DihedralAngle DihedralGroup Dilation DimensionalCombinations DimensionalMeshComponents DimensionReduce DimensionReducerFunction DimensionReduction Dimensions DiracComb DiracDelta DirectedEdge DirectedEdges DirectedGraph DirectedGraphQ DirectedInfinity Direction Directive Directory DirectoryName DirectoryQ DirectoryStack DirichletBeta DirichletCharacter DirichletCondition DirichletConvolve DirichletDistribution DirichletEta DirichletL DirichletLambda DirichletTransform DirichletWindow DisableConsolePrintPacket DisableFormatting DiscreteChirpZTransform DiscreteConvolve DiscreteDelta DiscreteHadamardTransform DiscreteIndicator DiscreteLimit DiscreteLQEstimatorGains DiscreteLQRegulatorGains DiscreteLyapunovSolve DiscreteMarkovProcess DiscreteMaxLimit DiscreteMinLimit DiscretePlot DiscretePlot3D DiscreteRatio DiscreteRiccatiSolve DiscreteShift DiscreteTimeModelQ DiscreteUniformDistribution DiscreteVariables DiscreteWaveletData DiscreteWaveletPacketTransform DiscreteWaveletTransform DiscretizeGraphics DiscretizeRegion Discriminant DisjointQ Disjunction Disk DiskBox DiskMatrix DiskSegment Dispatch DispatchQ DispersionEstimatorFunction Display DisplayAllSteps DisplayEndPacket DisplayFlushImagePacket DisplayForm DisplayFunction DisplayPacket DisplayRules DisplaySetSizePacket DisplayString DisplayTemporary DisplayWith DisplayWithRef DisplayWithVariable DistanceFunction DistanceMatrix DistanceTransform Distribute Distributed DistributedContexts DistributeDefinitions DistributionChart DistributionDomain DistributionFitTest DistributionParameterAssumptions DistributionParameterQ Dithering Div Divergence Divide DivideBy Dividers DivideSides Divisible Divisors DivisorSigma DivisorSum DMSList DMSString Do DockedCells DocumentGenerator DocumentGeneratorInformation DocumentGeneratorInformationData DocumentGenerators DocumentNotebook DocumentWeightingRules Dodecahedron DomainRegistrationInformation DominantColors DOSTextFormat Dot DotDashed DotEqual DotLayer DotPlusLayer 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 DropoutLayer DSolve DSolveValue Dt DualLinearProgramming DualPolyhedron DualSystemsModel DumpGet DumpSave DuplicateFreeQ Duration Dynamic DynamicBox DynamicBoxOptions DynamicEvaluationTimeout DynamicGeoGraphics DynamicImage DynamicLocation DynamicModule DynamicModuleBox DynamicModuleBoxOptions DynamicModuleParent DynamicModuleValues DynamicName DynamicNamespace DynamicReference DynamicSetting DynamicUpdating DynamicWrapper DynamicWrapperBox DynamicWrapperBoxOptionsE EarthImpactData EarthquakeData EccentricityCentrality Echo EchoFunction EclipseType EdgeAdd EdgeBetweennessCentrality EdgeCapacity EdgeCapForm EdgeColor EdgeConnectivity EdgeContract EdgeCost EdgeCount EdgeCoverQ EdgeCycleMatrix EdgeDashing EdgeDelete EdgeDetect EdgeForm EdgeIndex EdgeJoinForm EdgeLabeling EdgeLabels EdgeLabelStyle EdgeList EdgeOpacity EdgeQ EdgeRenderingFunction EdgeRules EdgeShapeFunction EdgeStyle EdgeThickness EdgeWeight EdgeWeightedGraphQ Editable EditButtonSettings EditCellTagsSettings EditDistance EffectiveInterest Eigensystem Eigenvalues EigenvectorCentrality Eigenvectors Element ElementData ElementwiseLayer ElidedForms Eliminate EliminationOrder Ellipsoid EllipticE EllipticExp EllipticExpPrime EllipticF EllipticFilterModel EllipticK EllipticLog EllipticNomeQ EllipticPi EllipticReducedHalfPeriods EllipticTheta EllipticThetaPrime EmbedCode EmbeddedHTML EmbeddedService EmbeddingLayer EmbeddingObject EmitSound EmphasizeSyntaxErrors EmpiricalDistribution Empty EmptyGraphQ EmptyRegion EnableConsolePrintPacket Enabled Encode Encrypt EncryptedObject EncryptFile End EndAdd EndDialogPacket EndFrontEndInteractionPacket EndOfBuffer EndOfFile EndOfLine EndOfString EndPackage EngineEnvironment EngineeringForm Enter EnterExpressionPacket EnterTextPacket Entity EntityClass EntityClassList EntityCopies EntityFunction EntityGroup EntityInstance EntityList EntityPrefetch EntityProperties EntityProperty EntityPropertyClass EntityRegister EntityStore EntityStores EntityTypeName EntityUnregister EntityValue Entropy EntropyFilter Environment Epilog EpilogFunction Equal EqualColumns EqualRows EqualTilde EqualTo EquatedTo Equilibrium EquirippleFilterKernel Equivalent Erf Erfc Erfi ErlangB ErlangC ErlangDistribution Erosion ErrorBox ErrorBoxOptions ErrorNorm ErrorPacket ErrorsDialogSettings EscapeRadius EstimatedBackground EstimatedDistribution EstimatedProcess EstimatorGains EstimatorRegulator EuclideanDistance EulerAngles EulerCharacteristic EulerE EulerGamma EulerianGraphQ EulerMatrix EulerPhi Evaluatable Evaluate Evaluated EvaluatePacket EvaluateScheduledTask EvaluationBox EvaluationCell EvaluationCompletionAction EvaluationData EvaluationElements EvaluationEnvironment EvaluationMode EvaluationMonitor EvaluationNotebook EvaluationObject EvaluationOrder Evaluator EvaluatorNames EvenQ EventData EventEvaluator EventHandler EventHandlerTag EventLabels EventSeries ExactBlackmanWindow ExactNumberQ ExactRootIsolation ExampleData Except ExcludedForms ExcludedLines ExcludedPhysicalQuantities ExcludePods Exclusions ExclusionsStyle Exists Exit ExitDialog ExoplanetData Exp Expand ExpandAll ExpandDenominator ExpandFileName ExpandNumerator Expectation ExpectationE ExpectedValue ExpGammaDistribution ExpIntegralE ExpIntegralEi ExpirationDate Exponent ExponentFunction ExponentialDistribution ExponentialFamily ExponentialGeneratingFunction ExponentialMovingAverage ExponentialPowerDistribution ExponentPosition ExponentStep Export ExportAutoReplacements ExportByteArray ExportForm ExportPacket ExportString Expression ExpressionCell ExpressionPacket ExpressionUUID ExpToTrig ExtendedEntityClass ExtendedGCD Extension ExtentElementFunction ExtentMarkers ExtentSize ExternalBundle ExternalCall ExternalDataCharacterEncoding ExternalEvaluate ExternalFunction ExternalFunctionName ExternalObject ExternalOptions ExternalSessionObject ExternalSessions ExternalTypeSignature ExternalValue Extract ExtractArchive ExtractLayer ExtremeValueDistributionFaceForm FaceGrids FaceGridsStyle FacialFeatures Factor FactorComplete Factorial Factorial2 FactorialMoment FactorialMomentGeneratingFunction FactorialPower FactorInteger FactorList FactorSquareFree FactorSquareFreeList FactorTerms FactorTermsList Fail Failure FailureAction FailureDistribution FailureQ False FareySequence FARIMAProcess FeatureDistance FeatureExtract FeatureExtraction FeatureExtractor FeatureExtractorFunction FeatureNames FeatureNearest FeatureSpacePlot FeatureSpacePlot3D FeatureTypes FEDisableConsolePrintPacket FeedbackLinearize FeedbackSector FeedbackSectorStyle FeedbackType FEEnableConsolePrintPacket FetalGrowthData Fibonacci Fibonorial FieldCompletionFunction FieldHint FieldHintStyle FieldMasked FieldSize File FileBaseName FileByteCount FileConvert FileDate FileExistsQ FileExtension FileFormat FileHandler FileHash FileInformation FileName FileNameDepth FileNameDialogSettings FileNameDrop FileNameForms FileNameJoin FileNames FileNameSetter FileNameSplit FileNameTake FilePrint FileSize FileSystemMap FileSystemScan FileTemplate FileTemplateApply FileType FilledCurve FilledCurveBox FilledCurveBoxOptions Filling FillingStyle FillingTransform FilteredEntityClass FilterRules FinancialBond FinancialData FinancialDerivative FinancialIndicator Find FindAnomalies FindArgMax FindArgMin FindChannels FindClique FindClusters FindCookies FindCurvePath FindCycle FindDevices FindDistribution FindDistributionParameters FindDivisions FindEdgeCover FindEdgeCut FindEdgeIndependentPaths FindEquationalProof FindEulerianCycle FindExternalEvaluators FindFaces FindFile FindFit FindFormula FindFundamentalCycles FindGeneratingFunction FindGeoLocation FindGeometricConjectures FindGeometricTransform FindGraphCommunities FindGraphIsomorphism FindGraphPartition FindHamiltonianCycle FindHamiltonianPath FindHiddenMarkovStates FindIndependentEdgeSet FindIndependentVertexSet FindInstance FindIntegerNullVector FindKClan FindKClique FindKClub FindKPlex FindLibrary FindLinearRecurrence FindList FindMatchingColor FindMaximum FindMaximumFlow FindMaxValue FindMeshDefects FindMinimum FindMinimumCostFlow FindMinimumCut FindMinValue FindMoleculeSubstructure FindPath FindPeaks FindPermutation FindPostmanTour FindProcessParameters FindRepeat FindRoot FindSequenceFunction FindSettings FindShortestPath FindShortestTour FindSpanningTree FindSystemModelEquilibrium FindTextualAnswer FindThreshold FindTransientRepeat FindVertexCover FindVertexCut FindVertexIndependentPaths Fine FinishDynamic FiniteAbelianGroupCount FiniteGroupCount FiniteGroupData First FirstCase FirstPassageTimeDistribution FirstPosition FischerGroupFi22 FischerGroupFi23 FischerGroupFi24Prime FisherHypergeometricDistribution FisherRatioTest FisherZDistribution Fit FitAll FitRegularization FittedModel FixedOrder FixedPoint FixedPointList FlashSelection Flat Flatten FlattenAt FlattenLayer FlatTopWindow FlipView Floor FlowPolynomial FlushPrintOutputPacket Fold FoldList FoldPair FoldPairList FollowRedirects Font FontColor FontFamily FontForm FontName FontOpacity FontPostScriptName FontProperties FontReencoding FontSize FontSlant FontSubstitutions FontTracking FontVariations FontWeight For ForAll Format FormatRules FormatType FormatTypeAutoConvert FormatValues FormBox FormBoxOptions FormControl FormFunction FormLayoutFunction FormObject FormPage FormTheme FormulaData FormulaLookup FortranForm Forward ForwardBackward Fourier FourierCoefficient FourierCosCoefficient FourierCosSeries FourierCosTransform FourierDCT FourierDCTFilter FourierDCTMatrix FourierDST FourierDSTMatrix FourierMatrix FourierParameters FourierSequenceTransform FourierSeries FourierSinCoefficient FourierSinSeries FourierSinTransform FourierTransform FourierTrigSeries FractionalBrownianMotionProcess FractionalGaussianNoiseProcess FractionalPart FractionBox FractionBoxOptions FractionLine Frame FrameBox FrameBoxOptions Framed FrameInset FrameLabel Frameless FrameMargins FrameRate FrameStyle FrameTicks FrameTicksStyle FRatioDistribution FrechetDistribution FreeQ FrenetSerretSystem FrequencySamplingFilterKernel FresnelC FresnelF FresnelG FresnelS Friday FrobeniusNumber FrobeniusSolve FromAbsoluteTime FromCharacterCode FromCoefficientRules FromContinuedFraction FromDate FromDigits FromDMS FromEntity FromJulianDate FromLetterNumber FromPolarCoordinates FromRomanNumeral FromSphericalCoordinates FromUnixTime Front FrontEndDynamicExpression FrontEndEventActions FrontEndExecute FrontEndObject FrontEndResource FrontEndResourceString FrontEndStackSize FrontEndToken FrontEndTokenExecute FrontEndValueCache FrontEndVersion FrontFaceColor FrontFaceOpacity Full FullAxes FullDefinition FullForm FullGraphics FullInformationOutputRegulator FullOptions FullRegion FullSimplify Function FunctionCompile FunctionCompileExport FunctionCompileExportByteArray FunctionCompileExportLibrary FunctionCompileExportString FunctionDomain FunctionExpand FunctionInterpolation FunctionPeriod FunctionRange FunctionSpace FussellVeselyImportanceGaborFilter GaborMatrix GaborWavelet GainMargins GainPhaseMargins GalaxyData GalleryView Gamma GammaDistribution GammaRegularized GapPenalty GARCHProcess GatedRecurrentLayer Gather GatherBy GaugeFaceElementFunction GaugeFaceStyle GaugeFrameElementFunction GaugeFrameSize GaugeFrameStyle GaugeLabels GaugeMarkers GaugeStyle GaussianFilter GaussianIntegers GaussianMatrix GaussianOrthogonalMatrixDistribution GaussianSymplecticMatrixDistribution GaussianUnitaryMatrixDistribution GaussianWindow GCD GegenbauerC General GeneralizedLinearModelFit GenerateAsymmetricKeyPair GenerateConditions GeneratedCell GeneratedDocumentBinding GenerateDerivedKey GenerateDigitalSignature GenerateDocument GeneratedParameters GeneratedQuantityMagnitudes GenerateHTTPResponse GenerateSecuredAuthenticationKey GenerateSymmetricKey GeneratingFunction GeneratorDescription GeneratorHistoryLength GeneratorOutputType Generic GenericCylindricalDecomposition GenomeData GenomeLookup GeoAntipode GeoArea GeoArraySize GeoBackground GeoBoundingBox GeoBounds GeoBoundsRegion GeoBubbleChart GeoCenter GeoCircle GeodesicClosing GeodesicDilation GeodesicErosion GeodesicOpening GeoDestination GeodesyData GeoDirection GeoDisk GeoDisplacement GeoDistance GeoDistanceList GeoElevationData GeoEntities GeoGraphics GeogravityModelData GeoGridDirectionDifference GeoGridLines GeoGridLinesStyle GeoGridPosition GeoGridRange GeoGridRangePadding GeoGridUnitArea GeoGridUnitDistance GeoGridVector GeoGroup GeoHemisphere GeoHemisphereBoundary GeoHistogram GeoIdentify GeoImage GeoLabels GeoLength GeoListPlot GeoLocation GeologicalPeriodData GeomagneticModelData GeoMarker GeometricAssertion GeometricBrownianMotionProcess GeometricDistribution GeometricMean GeometricMeanFilter GeometricScene GeometricTransformation GeometricTransformation3DBox GeometricTransformation3DBoxOptions GeometricTransformationBox GeometricTransformationBoxOptions GeoModel GeoNearest GeoPath GeoPosition GeoPositionENU GeoPositionXYZ GeoProjection GeoProjectionData GeoRange GeoRangePadding GeoRegionValuePlot GeoResolution GeoScaleBar GeoServer GeoSmoothHistogram GeoStreamPlot GeoStyling GeoStylingImageFunction GeoVariant GeoVector GeoVectorENU GeoVectorPlot GeoVectorXYZ GeoVisibleRegion GeoVisibleRegionBoundary GeoWithinQ GeoZoomLevel GestureHandler GestureHandlerTag Get GetBoundingBoxSizePacket GetContext GetEnvironment GetFileName GetFrontEndOptionsDataPacket GetLinebreakInformationPacket GetMenusPacket GetPageBreakInformationPacket Glaisher GlobalClusteringCoefficient GlobalPreferences GlobalSession Glow GoldenAngle GoldenRatio GompertzMakehamDistribution GoodmanKruskalGamma GoodmanKruskalGammaTest Goto Grad Gradient GradientFilter GradientOrientationFilter GrammarApply GrammarRules GrammarToken Graph Graph3D GraphAssortativity GraphAutomorphismGroup 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 Greater GreaterEqual GreaterEqualLess GreaterEqualThan GreaterFullEqual GreaterGreater GreaterLess GreaterSlantEqual GreaterThan GreaterTilde Green GreenFunction Grid GridBaseline GridBox GridBoxAlignment GridBoxBackground GridBoxDividers GridBoxFrame GridBoxItemSize GridBoxItemStyle GridBoxOptions GridBoxSpacings GridCreationSettings GridDefaultElement GridElementStyleOptions GridFrame GridFrameMargins GridGraph GridLines GridLinesStyle GroebnerBasis GroupActionBase GroupBy GroupCentralizer GroupElementFromWord GroupElementPosition GroupElementQ GroupElements GroupElementToWord GroupGenerators Groupings GroupMultiplicationTable GroupOrbits GroupOrder GroupPageBreakWithin GroupSetwiseStabilizer GroupStabilizer GroupStabilizerChain GroupTogetherGrouping GroupTogetherNestedGrouping GrowCutComponents Gudermannian GuidedFilter GumbelDistributionHaarWavelet HadamardMatrix HalfLine HalfNormalDistribution HalfPlane HalfSpace HamiltonianGraphQ HammingDistance HammingWindow HandlerFunctions HandlerFunctionsKeys HankelH1 HankelH2 HankelMatrix HankelTransform HannPoissonWindow HannWindow HaradaNortonGroupHN HararyGraph HarmonicMean HarmonicMeanFilter HarmonicNumber Hash Haversine HazardFunction Head HeadCompose HeaderLines Heads HeavisideLambda HeavisidePi HeavisideTheta HeldGroupHe HeldPart HelpBrowserLookup HelpBrowserNotebook HelpBrowserSettings Here HermiteDecomposition HermiteH HermitianMatrixQ HessenbergDecomposition Hessian HexadecimalCharacter Hexahedron HexahedronBox HexahedronBoxOptions HiddenMarkovProcess HiddenSurface Highlighted HighlightGraph HighlightImage HighlightMesh HighpassFilter HigmanSimsGroupHS HilbertCurve HilbertFilter HilbertMatrix Histogram Histogram3D HistogramDistribution HistogramList HistogramTransform HistogramTransformInterpolation HistoricalPeriodData HitMissTransform HITSCentrality HjorthDistribution HodgeDual HoeffdingD HoeffdingDTest Hold HoldAll HoldAllComplete HoldComplete HoldFirst HoldForm HoldPattern HoldRest HolidayCalendar HomeDirectory HomePage Horizontal HorizontalForm HorizontalGauge HorizontalScrollPosition HornerForm HostLookup HotellingTSquareDistribution HoytDistribution HTMLSave HTTPErrorResponse HTTPRedirect HTTPRequest HTTPRequestData HTTPResponse Hue HumanGrowthData HumpDownHump HumpEqual HurwitzLerchPhi HurwitzZeta HyperbolicDistribution HypercubeGraph HyperexponentialDistribution Hyperfactorial Hypergeometric0F1 Hypergeometric0F1Regularized Hypergeometric1F1 Hypergeometric1F1Regularized Hypergeometric2F1 Hypergeometric2F1Regularized HypergeometricDistribution HypergeometricPFQ HypergeometricPFQRegularized HypergeometricU Hyperlink HyperlinkCreationSettings Hyperplane Hyphenation HyphenationOptions HypoexponentialDistribution HypothesisTestDataI IconData Iconize IconizedObject IconRules Icosahedron Identity IdentityMatrix If IgnoreCase IgnoreDiacritics IgnorePunctuation IgnoreSpellCheck IgnoringInactive Im Image Image3D Image3DProjection Image3DSlices ImageAccumulate ImageAdd ImageAdjust ImageAlign ImageApply ImageApplyIndexed ImageAspectRatio ImageAssemble ImageAugmentationLayer ImageBoundingBoxes ImageCache ImageCacheValid ImageCapture ImageCaptureFunction ImageCases ImageChannels ImageClip ImageCollage ImageColorSpace ImageCompose ImageContainsQ ImageContents ImageConvolve ImageCooccurrence ImageCorners ImageCorrelate ImageCorrespondingPoints ImageCrop ImageData ImageDeconvolve ImageDemosaic ImageDifference ImageDimensions ImageDisplacements ImageDistance ImageEffect ImageExposureCombine ImageFeatureTrack ImageFileApply ImageFileFilter ImageFileScan ImageFilter ImageFocusCombine ImageForestingComponents ImageFormattingWidth ImageForwardTransformation ImageGraphics ImageHistogram ImageIdentify ImageInstanceQ ImageKeypoints ImageLevels ImageLines ImageMargins ImageMarker ImageMarkers ImageMeasurements ImageMesh ImageMultiply ImageOffset ImagePad ImagePadding ImagePartition ImagePeriodogram ImagePerspectiveTransformation ImagePosition ImagePreviewFunction ImagePyramid ImagePyramidApply ImageQ ImageRangeCache ImageRecolor ImageReflect ImageRegion ImageResize ImageResolution ImageRestyle ImageRotate ImageRotated ImageSaliencyFilter ImageScaled ImageScan ImageSize ImageSizeAction ImageSizeCache ImageSizeMultipliers ImageSizeRaw ImageSubtract ImageTake ImageTransformation ImageTrim ImageType ImageValue ImageValuePositions ImagingDevice ImplicitRegion Implies Import ImportAutoReplacements ImportByteArray ImportOptions ImportString ImprovementImportance In Inactivate Inactive IncidenceGraph IncidenceList IncidenceMatrix IncludeAromaticBonds IncludeConstantBasis IncludeDefinitions IncludeDirectories IncludeFileExtension IncludeGeneratorTasks IncludeHydrogens IncludeInflections IncludeMetaInformation IncludePods IncludeQuantities IncludeRelatedTables IncludeSingularTerm IncludeWindowTimes Increment IndefiniteMatrixQ Indent IndentingNewlineSpacings IndentMaxFraction IndependenceTest IndependentEdgeSetQ IndependentPhysicalQuantity IndependentUnit IndependentUnitDimension IndependentVertexSetQ Indeterminate IndeterminateThreshold IndexCreationOptions Indexed IndexGraph IndexTag Inequality InexactNumberQ InexactNumbers InfiniteLine InfinitePlane Infinity Infix InflationAdjust InflationMethod Information InformationData InformationDataGrid Inherited InheritScope InhomogeneousPoissonProcess InitialEvaluationHistory Initialization InitializationCell InitializationCellEvaluation InitializationCellWarning InitializationObjects InitializationValue Initialize InitialSeeding InlineCounterAssignments InlineCounterIncrements InlineRules Inner InnerPolygon InnerPolyhedron Inpaint Input InputAliases InputAssumptions InputAutoReplacements InputField InputFieldBox InputFieldBoxOptions InputForm InputGrouping InputNamePacket InputNotebook InputPacket InputSettings InputStream InputString InputStringPacket InputToBoxFormPacket Insert InsertionFunction InsertionPointObject InsertLinebreaks InsertResults Inset Inset3DBox Inset3DBoxOptions InsetBox InsetBoxOptions Insphere Install InstallService InstanceNormalizationLayer InString Integer IntegerDigits IntegerExponent IntegerLength IntegerName IntegerPart IntegerPartitions IntegerQ IntegerReverse Integers IntegerString Integral Integrate Interactive InteractiveTradingChart Interlaced Interleaving InternallyBalancedDecomposition InterpolatingFunction InterpolatingPolynomial Interpolation InterpolationOrder InterpolationPoints InterpolationPrecision Interpretation InterpretationBox InterpretationBoxOptions InterpretationFunction Interpreter InterpretTemplate InterquartileRange Interrupt InterruptSettings IntersectingQ Intersection Interval IntervalIntersection IntervalMarkers IntervalMarkersStyle IntervalMemberQ IntervalSlider IntervalUnion Into Inverse InverseBetaRegularized InverseCDF InverseChiSquareDistribution InverseContinuousWaveletTransform InverseDistanceTransform InverseEllipticNomeQ InverseErf InverseErfc InverseFourier InverseFourierCosTransform InverseFourierSequenceTransform InverseFourierSinTransform InverseFourierTransform InverseFunction InverseFunctions InverseGammaDistribution InverseGammaRegularized InverseGaussianDistribution InverseGudermannian InverseHankelTransform InverseHaversine InverseImagePyramid InverseJacobiCD InverseJacobiCN InverseJacobiCS InverseJacobiDC InverseJacobiDN InverseJacobiDS InverseJacobiNC InverseJacobiND InverseJacobiNS InverseJacobiSC InverseJacobiSD InverseJacobiSN InverseLaplaceTransform InverseMellinTransform InversePermutation InverseRadon InverseRadonTransform InverseSeries InverseShortTimeFourier InverseSpectrogram InverseSurvivalFunction InverseTransformedRegion InverseWaveletTransform InverseWeierstrassP InverseWishartMatrixDistribution InverseZTransform Invisible InvisibleApplication InvisibleTimes IPAddress IrreduciblePolynomialQ IslandData IsolatingInterval IsomorphicGraphQ IsotopeData Italic Item ItemAspectRatio ItemBox ItemBoxOptions ItemSize ItemStyle ItoProcessJaccardDissimilarity JacobiAmplitude Jacobian JacobiCD JacobiCN JacobiCS JacobiDC JacobiDN JacobiDS JacobiNC JacobiND JacobiNS JacobiP JacobiSC JacobiSD JacobiSN JacobiSymbol JacobiZeta JankoGroupJ1 JankoGroupJ2 JankoGroupJ3 JankoGroupJ4 JarqueBeraALMTest JohnsonDistribution Join JoinAcross Joined JoinedCurve JoinedCurveBox JoinedCurveBoxOptions JoinForm JordanDecomposition JordanModelDecomposition JulianDate JuliaSetBoettcher JuliaSetIterationCount JuliaSetPlot JuliaSetPointsK KagiChart KaiserBesselWindow KaiserWindow KalmanEstimator KalmanFilter KarhunenLoeveDecomposition KaryTree KatzCentrality KCoreComponents KDistribution KEdgeConnectedComponents KEdgeConnectedGraphQ KelvinBei KelvinBer KelvinKei KelvinKer KendallTau KendallTauTest KernelExecute KernelFunction KernelMixtureDistribution Kernels Ket Key KeyCollisionFunction KeyComplement KeyDrop KeyDropFrom KeyExistsQ KeyFreeQ KeyIntersection KeyMap KeyMemberQ KeypointStrength Keys KeySelect KeySort KeySortBy KeyTake KeyUnion KeyValueMap KeyValuePattern Khinchin KillProcess KirchhoffGraph KirchhoffMatrix KleinInvariantJ KnapsackSolve KnightTourGraph KnotData KnownUnitQ KochCurve KolmogorovSmirnovTest KroneckerDelta KroneckerModelDecomposition KroneckerProduct KroneckerSymbol KuiperTest KumaraswamyDistribution Kurtosis KuwaharaFilter KVertexConnectedComponents KVertexConnectedGraphQLABColor Label Labeled LabeledSlider LabelingFunction LabelingSize LabelStyle LabelVisibility LaguerreL LakeData LambdaComponents LambertW LaminaData LanczosWindow LandauDistribution Language LanguageCategory LanguageData LanguageIdentify LanguageOptions LaplaceDistribution LaplaceTransform Laplacian LaplacianFilter LaplacianGaussianFilter Large Larger Last Latitude LatitudeLongitude LatticeData LatticeReduce Launch LaunchKernels LayeredGraphPlot LayerSizeFunction LayoutInformation LCHColor LCM LeaderSize LeafCount LeapYearQ LearnDistribution LearnedDistribution LearningRate LearningRateMultipliers 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 LessEqualThan LessFullEqual LessGreater LessLess LessSlantEqual LessThan LessTilde LetterCharacter LetterCounts LetterNumber LetterQ Level LeveneTest LeviCivitaTensor LevyDistribution Lexicographic LibraryDataType 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 Line3DBoxOptions LinearFilter LinearFractionalOptimization LinearFractionalTransform LinearGradientImage LinearizingTransformationData LinearLayer LinearModelFit LinearOffsetFunction LinearOptimization LinearProgramming LinearRecurrence LinearSolve LinearSolveFunction LineBox LineBoxOptions LineBreak LinebreakAdjustments LineBreakChart LinebreakSemicolonWeighting LineBreakWithin LineColor 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 LinkRankCentrality LinkRead LinkReadHeld LinkReadyQ Links LinkService LinkWrite LinkWriteHeld LiouvilleLambda List Listable ListAnimate ListContourPlot ListContourPlot3D ListConvolve ListCorrelate ListCurvePathPlot ListDeconvolve ListDensityPlot ListDensityPlot3D Listen ListFormat ListFourierSequenceTransform ListInterpolation ListLineIntegralConvolutionPlot ListLinePlot ListLogLinearPlot ListLogLogPlot ListLogPlot ListPicker ListPickerBox ListPickerBoxBackground ListPickerBoxOptions ListPlay ListPlot ListPlot3D ListPointPlot3D ListPolarPlot ListQ ListSliceContourPlot3D ListSliceDensityPlot3D ListSliceVectorPlot3D ListStepPlot ListStreamDensityPlot ListStreamPlot ListSurfacePlot3D ListVectorDensityPlot ListVectorPlot ListVectorPlot3D ListZTransform Literal LiteralSearch LocalAdaptiveBinarize LocalCache LocalClusteringCoefficient LocalizeDefinitions LocalizeVariables LocalObject LocalObjects LocalResponseNormalizationLayer LocalSubmit LocalSymbol LocalTime LocalTimeZone LocationEquivalenceTest LocationTest Locator LocatorAutoCreate LocatorBox LocatorBoxOptions LocatorCentering LocatorPane LocatorPaneBox LocatorPaneBoxOptions LocatorRegion Locked Log Log10 Log2 LogBarnesG LogGamma LogGammaDistribution LogicalExpand LogIntegral LogisticDistribution LogisticSigmoid LogitModelFit LogLikelihood LogLinearPlot LogLogisticDistribution LogLogPlot LogMultinormalDistribution LogNormalDistribution LogPlot LogRankTest LogSeriesDistribution LongEqual Longest LongestCommonSequence LongestCommonSequencePositions LongestCommonSubsequence LongestCommonSubsequencePositions LongestMatch LongestOrderedSequence LongForm Longitude LongLeftArrow LongLeftRightArrow LongRightArrow LongShortTermMemoryLayer Lookup Loopback LoopFreeGraphQ LossFunction LowerCaseQ LowerLeftArrow LowerRightArrow LowerTriangularize LowerTriangularMatrixQ LowpassFilter LQEstimatorGains LQGRegulator LQOutputRegulatorGains LQRegulatorGains LUBackSubstitution LucasL LuccioSamiComponents LUDecomposition LunarEclipse LUVColor LyapunovSolve LyonsGroupLyMachineID MachineName MachineNumberQ MachinePrecision MacintoshSystemPageSetup Magenta Magnification Magnify MailAddressValidation MailExecute MailFolder MailItem MailReceiverFunction MailResponseFunction MailSearch MailServerConnect MailServerConnection MailSettings MainSolve MaintainDynamicCaches Majority MakeBoxes MakeExpression MakeRules ManagedLibraryExpressionID ManagedLibraryExpressionQ MandelbrotSetBoettcher MandelbrotSetDistance MandelbrotSetIterationCount MandelbrotSetMemberQ MandelbrotSetPlot MangoldtLambda ManhattanDistance Manipulate Manipulator MannedSpaceMissionData MannWhitneyTest MantissaExponent Manual Map MapAll MapAt MapIndexed MAProcess MapThread MarchenkoPasturDistribution MarcumQ MardiaCombinedTest MardiaKurtosisTest MardiaSkewnessTest MarginalDistribution MarkovProcessProperties Masking MatchingDissimilarity MatchLocalNameQ MatchLocalNames MatchQ Material MathematicalFunctionData MathematicaNotation MathieuC MathieuCharacteristicA MathieuCharacteristicB MathieuCharacteristicExponent MathieuCPrime MathieuGroupM11 MathieuGroupM12 MathieuGroupM22 MathieuGroupM23 MathieuGroupM24 MathieuS MathieuSPrime MathMLForm MathMLText Matrices MatrixExp MatrixForm MatrixFunction MatrixLog MatrixNormalDistribution MatrixPlot MatrixPower MatrixPropertyDistribution MatrixQ MatrixRank MatrixTDistribution Max MaxBend MaxCellMeasure MaxColorDistance MaxDetect MaxDuration MaxExtraBandwidths MaxExtraConditions MaxFeatureDisplacement MaxFeatures MaxFilter MaximalBy Maximize MaxItems MaxIterations MaxLimit MaxMemoryUsed MaxMixtureKernels MaxOverlapFraction MaxPlotPoints MaxPoints MaxRecursion MaxStableDistribution MaxStepFraction MaxSteps MaxStepSize MaxTrainingRounds MaxValue MaxwellDistribution MaxWordGap McLaughlinGroupMcL Mean MeanAbsoluteLossLayer MeanAround MeanClusteringCoefficient MeanDegreeConnectivity MeanDeviation MeanFilter MeanGraphDistance MeanNeighborDegree MeanShift MeanShiftFilter MeanSquaredLossLayer Median MedianDeviation MedianFilter MedicalTestData Medium MeijerG MeijerGReduce MeixnerDistribution MellinConvolve MellinTransform MemberQ MemoryAvailable MemoryConstrained MemoryConstraint MemoryInUse MengerMesh Menu MenuAppearance MenuCommandKey MenuEvaluator MenuItem MenuList MenuPacket MenuSortingValue MenuStyle MenuView Merge MergeDifferences MergingFunction MersennePrimeExponent MersennePrimeExponentQ Mesh MeshCellCentroid MeshCellCount MeshCellHighlight MeshCellIndex MeshCellLabel MeshCellMarker MeshCellMeasure MeshCellQuality MeshCells MeshCellShapeFunction MeshCellStyle MeshCoordinates MeshFunctions MeshPrimitives MeshQualityGoal MeshRange MeshRefinementFunction MeshRegion MeshRegionQ MeshShading MeshStyle Message MessageDialog MessageList MessageName MessageObject MessageOptions MessagePacket Messages MessagesNotebook MetaCharacters MetaInformation MeteorShowerData Method MethodOptions MexicanHatWavelet MeyerWavelet Midpoint Min MinColorDistance MinDetect MineralData MinFilter MinimalBy MinimalPolynomial MinimalStateSpaceModel Minimize MinimumTimeIncrement MinIntervalSize MinkowskiQuestionMark MinLimit MinMax MinorPlanetData Minors MinRecursion MinSize MinStableDistribution Minus MinusPlus MinValue Missing MissingBehavior MissingDataMethod MissingDataRules MissingQ MissingString MissingStyle MissingValuePattern MittagLefflerE MixedFractionParts MixedGraphQ MixedMagnitude MixedRadix MixedRadixQuantity MixedUnit MixtureDistribution Mod Modal Mode Modular ModularInverse ModularLambda Module Modulus MoebiusMu Molecule MoleculeContainsQ MoleculeEquivalentQ MoleculeGraph MoleculeModify MoleculePattern MoleculePlot MoleculePlot3D MoleculeProperty MoleculeQ MoleculeValue Moment Momentary MomentConvert MomentEvaluate MomentGeneratingFunction MomentOfInertia Monday Monitor MonomialList MonomialOrder MonsterGroupM MoonPhase MoonPosition MorletWavelet MorphologicalBinarize MorphologicalBranchPoints MorphologicalComponents MorphologicalEulerNumber MorphologicalGraph MorphologicalPerimeter MorphologicalTransform MortalityData Most MountainData MouseAnnotation MouseAppearance MouseAppearanceTag MouseButtons Mouseover MousePointerNote MousePosition MovieData MovingAverage MovingMap MovingMedian MoyalDistribution Multicolumn MultiedgeStyle MultigraphQ MultilaunchWarning MultiLetterItalics MultiLetterStyle MultilineFunction Multinomial MultinomialDistribution MultinormalDistribution MultiplicativeOrder Multiplicity MultiplySides Multiselection MultivariateHypergeometricDistribution MultivariatePoissonDistribution MultivariateTDistributionN NakagamiDistribution NameQ Names NamespaceBox NamespaceBoxOptions Nand NArgMax NArgMin NBernoulliB NBodySimulation NBodySimulationData NCache NDEigensystem NDEigenvalues NDSolve NDSolveValue Nearest NearestFunction NearestNeighborGraph NearestTo NebulaData NeedCurrentFrontEndPackagePacket NeedCurrentFrontEndSymbolsPacket NeedlemanWunschSimilarity Needs Negative NegativeBinomialDistribution NegativeDefiniteMatrixQ NegativeIntegers NegativeMultinomialDistribution NegativeRationals NegativeReals NegativeSemidefiniteMatrixQ NeighborhoodData NeighborhoodGraph Nest NestedGreaterGreater NestedLessLess NestedScriptRules NestGraph NestList NestWhile NestWhileList NetAppend NetBidirectionalOperator NetChain NetDecoder NetDelete NetDrop NetEncoder NetEvaluationMode NetExtract NetFlatten NetFoldOperator NetGraph NetInformation NetInitialize NetInsert NetInsertSharedArrays NetJoin NetMapOperator NetMapThreadOperator NetMeasurements NetModel NetNestOperator NetPairEmbeddingOperator NetPort NetPortGradient NetPrepend NetRename NetReplace NetReplacePart NetSharedArray NetStateObject NetTake NetTrain NetTrainResultsObject NetworkPacketCapture NetworkPacketRecording NetworkPacketRecordingDuring NetworkPacketTrace NeumannValue NevilleThetaC NevilleThetaD NevilleThetaN NevilleThetaS NewPrimitiveStyle NExpectation Next NextCell NextDate NextPrime NextScheduledTaskTime NHoldAll NHoldFirst NHoldRest NicholsGridLines NicholsPlot NightHemisphere NIntegrate NMaximize NMaxValue NMinimize NMinValue NominalVariables NonAssociative NoncentralBetaDistribution NoncentralChiSquareDistribution NoncentralFRatioDistribution NoncentralStudentTDistribution NonCommutativeMultiply NonConstants NondimensionalizationTransform None NoneTrue NonlinearModelFit NonlinearStateSpaceModel NonlocalMeansFilter NonNegative NonNegativeIntegers NonNegativeRationals NonNegativeReals NonPositive NonPositiveIntegers NonPositiveRationals NonPositiveReals Nor NorlundB Norm Normal NormalDistribution NormalGrouping NormalizationLayer Normalize Normalized NormalizedSquaredEuclideanDistance NormalMatrixQ 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 NotebookImport NotebookInformation NotebookInterfaceObject NotebookLocate NotebookObject NotebookOpen NotebookOpenReturnObject NotebookPath NotebookPrint NotebookPut NotebookPutReturnObject NotebookRead NotebookResetGeneratedCells Notebooks NotebookSave NotebookSaveAs NotebookSelection NotebookSetupLayoutInformationPacket NotebooksMenu NotebookTemplate NotebookWrite NotElement NotEqualTilde NotExists NotGreater NotGreaterEqual NotGreaterFullEqual NotGreaterGreater NotGreaterLess NotGreaterSlantEqual NotGreaterTilde Nothing NotHumpDownHump NotHumpEqual NotificationFunction 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 Now NoWhitespace NProbability NProduct NProductFactors NRoots NSolve NSum NSumTerms NuclearExplosionData NuclearReactorData Null NullRecords NullSpace NullWords Number NumberCompose NumberDecompose NumberExpand NumberFieldClassNumber NumberFieldDiscriminant NumberFieldFundamentalUnits NumberFieldIntegralBasis NumberFieldNormRepresentatives NumberFieldRegulator NumberFieldRootsOfUnity NumberFieldSignature NumberForm NumberFormat NumberLinePlot NumberMarks NumberMultiplier NumberPadding NumberPoint NumberQ NumberSeparator NumberSigns NumberString Numerator NumeratorDenominator NumericalOrder NumericalSort NumericArray NumericArrayQ NumericArrayType NumericFunction NumericQ NuttallWindow NValues NyquistGridLines NyquistPlotO ObservabilityGramian ObservabilityMatrix ObservableDecomposition ObservableModelQ OceanData Octahedron OddQ Off Offset OLEData On ONanGroupON Once OneIdentity Opacity OpacityFunction OpacityFunctionScaling Open OpenAppend Opener OpenerBox OpenerBoxOptions OpenerView OpenFunctionInspectorPacket Opening OpenRead OpenSpecialOptions OpenTemporary OpenWrite Operate OperatingSystem OptimumFlowData Optional OptionalElement OptionInspectorSettings OptionQ Options OptionsPacket OptionsPattern OptionValue OptionValueBox OptionValueBoxOptions Or Orange Order OrderDistribution OrderedQ Ordering OrderingBy OrderingLayer Orderless OrderlessPatternSequence OrnsteinUhlenbeckProcess Orthogonalize OrthogonalMatrixQ Out Outer OuterPolygon OuterPolyhedron 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 OverwriteTarget OwenT OwnValuesPackage PackingMethod PaddedForm Padding PaddingLayer PaddingSize PadeApproximant PadLeft PadRight PageBreakAbove PageBreakBelow PageBreakWithin PageFooterLines PageFooters PageHeaderLines PageHeaders PageHeight PageRankCentrality PageTheme PageWidth Pagination PairedBarChart PairedHistogram PairedSmoothHistogram PairedTTest PairedZTest PaletteNotebook PalettePath PalindromeQ Pane PaneBox PaneBoxOptions Panel PanelBox PanelBoxOptions Paneled PaneSelector PaneSelectorBox PaneSelectorBoxOptions PaperWidth ParabolicCylinderD ParagraphIndent ParagraphSpacing ParallelArray ParallelCombine ParallelDo Parallelepiped ParallelEvaluate Parallelization Parallelize ParallelMap ParallelNeeds Parallelogram ParallelProduct ParallelSubmit ParallelSum ParallelTable ParallelTry Parameter ParameterEstimator ParameterMixtureDistribution ParameterVariables ParametricFunction ParametricNDSolve ParametricNDSolveValue ParametricPlot ParametricPlot3D ParametricRegion ParentBox ParentCell ParentConnect ParentDirectory ParentForm Parenthesize ParentList ParentNotebook ParetoDistribution ParetoPickandsDistribution ParkData Part PartBehavior PartialCorrelationFunction PartialD ParticleAcceleratorData ParticleData Partition PartitionGranularity PartitionsP PartitionsQ PartLayer PartOfSpeech PartProtection ParzenWindow PascalDistribution PassEventsDown PassEventsUp Paste PasteAutoQuoteCharacters PasteBoxFormInlineCells PasteButton Path PathGraph PathGraphQ Pattern PatternSequence PatternTest PauliMatrix PaulWavelet Pause PausedTime PDF PeakDetect PeanoCurve PearsonChiSquareTest PearsonCorrelationTest PearsonDistribution PercentForm PerfectNumber PerfectNumberQ PerformanceGoal Perimeter PeriodicBoundaryCondition PeriodicInterpolation Periodogram PeriodogramArray Permanent Permissions PermissionsGroup PermissionsGroupMemberQ PermissionsGroups PermissionsKey PermissionsKeys PermutationCycles PermutationCyclesQ PermutationGroup PermutationLength PermutationList PermutationListQ PermutationMax PermutationMin PermutationOrder PermutationPower PermutationProduct PermutationReplace Permutations PermutationSupport Permute PeronaMalikFilter Perpendicular PerpendicularBisector PersistenceLocation PersistenceTime PersistentObject PersistentObjects PersistentValue PersonData PERTDistribution PetersenGraph PhaseMargins PhaseRange PhysicalSystemData Pi Pick PIDData PIDDerivativeFilter PIDFeedforward PIDTune Piecewise PiecewiseExpand PieChart PieChart3D PillaiTrace PillaiTraceTest PingTime Pink PitchRecognize Pivoting PixelConstrained PixelValue PixelValuePositions Placed Placeholder PlaceholderReplace Plain PlanarAngle PlanarGraph PlanarGraphQ PlanckRadiationLaw PlaneCurveData PlanetaryMoonData PlanetData PlantData Play PlayRange Plot Plot3D Plot3Matrix PlotDivision PlotJoined PlotLabel PlotLabels PlotLayout PlotLegends PlotMarkers PlotPoints PlotRange PlotRangeClipping PlotRangeClipPlanesStyle PlotRangePadding PlotRegion PlotStyle PlotTheme Pluralize Plus PlusMinus Pochhammer PodStates PodWidth Point Point3DBox Point3DBoxOptions PointBox PointBoxOptions PointFigureChart PointLegend PointSize PoissonConsulDistribution PoissonDistribution PoissonProcess PoissonWindow PolarAxes PolarAxesOrigin PolarGridLines PolarPlot PolarTicks PoleZeroMarkers PolyaAeppliDistribution PolyGamma Polygon Polygon3DBox Polygon3DBoxOptions PolygonalNumber PolygonAngle PolygonBox PolygonBoxOptions PolygonCoordinates PolygonDecomposition PolygonHoleScale PolygonIntersections PolygonScale Polyhedron PolyhedronAngle PolyhedronCoordinates PolyhedronData PolyhedronDecomposition PolyhedronGenus PolyLog PolynomialExtendedGCD PolynomialForm PolynomialGCD PolynomialLCM PolynomialMod PolynomialQ PolynomialQuotient PolynomialQuotientRemainder PolynomialReduce PolynomialRemainder Polynomials PoolingLayer PopupMenu PopupMenuBox PopupMenuBoxOptions PopupView PopupWindow Position PositionIndex Positive PositiveDefiniteMatrixQ PositiveIntegers PositiveRationals PositiveReals PositiveSemidefiniteMatrixQ PossibleZeroQ Postfix PostScript Power PowerDistribution PowerExpand PowerMod PowerModList PowerRange PowerSpectralDensity PowersRepresentations PowerSymmetricPolynomial Precedence PrecedenceForm Precedes PrecedesEqual PrecedesSlantEqual PrecedesTilde Precision PrecisionGoal PreDecrement Predict PredictionRoot PredictorFunction PredictorInformation PredictorMeasurements PredictorMeasurementsObject PreemptProtect PreferencesPath Prefix PreIncrement Prepend PrependLayer PrependTo PreprocessingRules PreserveColor PreserveImageOptions Previous PreviousCell PreviousDate PriceGraphDistribution PrimaryPlaceholder Prime PrimeNu PrimeOmega PrimePi PrimePowerQ PrimeQ Primes PrimeZetaP PrimitivePolynomialQ PrimitiveRoot PrimitiveRootList PrincipalComponents PrincipalValue Print PrintableASCIIQ PrintAction PrintForm PrintingCopies PrintingOptions PrintingPageRange PrintingStartingPageNumber PrintingStyleEnvironment Printout3D Printout3DPreviewer PrintPrecision PrintTemporary Prism PrismBox PrismBoxOptions PrivateCellOptions PrivateEvaluationOptions PrivateFontOptions PrivateFrontEndOptions PrivateKey PrivateNotebookOptions PrivatePaths Probability ProbabilityDistribution ProbabilityPlot ProbabilityPr ProbabilityScalePlot ProbitModelFit ProcessConnection ProcessDirectory ProcessEnvironment Processes ProcessEstimator ProcessInformation ProcessObject ProcessParameterAssumptions ProcessParameterQ ProcessStateDomain ProcessStatus ProcessTimeDomain Product ProductDistribution ProductLog ProgressIndicator ProgressIndicatorBox ProgressIndicatorBoxOptions Projection Prolog PromptForm ProofObject Properties Property PropertyList PropertyValue Proportion Proportional Protect Protected ProteinData Pruning PseudoInverse PsychrometricPropertyData PublicKey PublisherID PulsarData PunctuationCharacter Purple Put PutAppend Pyramid PyramidBox PyramidBoxOptionsQBinomial QFactorial QGamma QHypergeometricPFQ QnDispersion QPochhammer QPolyGamma QRDecomposition QuadraticIrrationalQ QuadraticOptimization Quantile QuantilePlot Quantity QuantityArray QuantityDistribution QuantityForm QuantityMagnitude QuantityQ QuantityUnit QuantityVariable QuantityVariableCanonicalUnit QuantityVariableDimensions QuantityVariableIdentifier QuantityVariablePhysicalQuantity Quartics QuartileDeviation Quartiles QuartileSkewness Query QueueingNetworkProcess QueueingProcess QueueProperties Quiet Quit Quotient QuotientRemainderRadialGradientImage RadialityCentrality RadicalBox RadicalBoxOptions RadioButton RadioButtonBar RadioButtonBox RadioButtonBoxOptions Radon RadonTransform RamanujanTau RamanujanTauL RamanujanTauTheta RamanujanTauZ Ramp Random RandomChoice RandomColor RandomComplex RandomEntity RandomFunction RandomGeoPosition RandomGraph RandomImage RandomInstance RandomInteger RandomPermutation RandomPoint RandomPolygon RandomPolyhedron RandomPrime RandomReal RandomSample RandomSeed RandomSeeding RandomVariate RandomWalkProcess RandomWord Range RangeFilter RangeSpecification RankedMax RankedMin RarerProbability Raster Raster3D Raster3DBox Raster3DBoxOptions RasterArray RasterBox RasterBoxOptions Rasterize RasterSize Rational RationalFunctions Rationalize Rationals Ratios RawArray RawBoxes RawData RawMedium RayleighDistribution Re Read ReadByteArray ReadLine ReadList ReadProtected ReadString Real RealAbs RealBlockDiagonalForm RealDigits RealExponent Reals RealSign Reap RecognitionPrior RecognitionThreshold Record RecordLists RecordSeparators Rectangle RectangleBox RectangleBoxOptions RectangleChart RectangleChart3D RectangularRepeatingElement RecurrenceFilter RecurrenceTable RecurringDigitsForm Red Reduce RefBox ReferenceLineStyle ReferenceMarkers ReferenceMarkerStyle Refine ReflectionMatrix ReflectionTransform Refresh RefreshRate Region RegionBinarize RegionBoundary RegionBounds RegionCentroid RegionDifference RegionDimension RegionDisjoint RegionDistance RegionDistanceFunction RegionEmbeddingDimension RegionEqual RegionFunction RegionImage RegionIntersection RegionMeasure RegionMember RegionMemberFunction RegionMoment RegionNearest RegionNearestFunction RegionPlot RegionPlot3D RegionProduct RegionQ RegionResize RegionSize RegionSymmetricDifference RegionUnion RegionWithin RegisterExternalEvaluator RegularExpression Regularization RegularlySampledQ RegularPolygon ReIm ReImLabels ReImPlot ReImStyle Reinstall RelationalDatabase RelationGraph Release ReleaseHold ReliabilityDistribution ReliefImage ReliefPlot RemoteAuthorizationCaching RemoteConnect RemoteConnectionObject RemoteFile RemoteRun RemoteRunProcess Remove RemoveAlphaChannel RemoveAsynchronousTask RemoveAudioStream RemoveBackground RemoveChannelListener RemoveChannelSubscribers Removed RemoveDiacritics RemoveInputStreamMethod RemoveOutputStreamMethod RemoveProperty RemoveScheduledTask RemoveUsers RenameDirectory RenameFile RenderAll RenderingOptions RenewalProcess RenkoChart RepairMesh Repeated RepeatedNull RepeatedString RepeatedTiming RepeatingElement Replace ReplaceAll ReplaceHeldPart ReplaceImageValue ReplaceList ReplacePart ReplacePixelValue ReplaceRepeated ReplicateLayer RequiredPhysicalQuantities Resampling ResamplingAlgorithmData ResamplingMethod Rescale RescalingTransform ResetDirectory ResetMenusPacket ResetScheduledTask ReshapeLayer Residue ResizeLayer Resolve ResourceAcquire ResourceData ResourceFunction ResourceObject ResourceRegister ResourceRemove ResourceSearch ResourceSubmissionObject ResourceSubmit ResourceSystemBase ResourceUpdate ResponseForm Rest RestartInterval Restricted Resultant ResumePacket Return ReturnEntersInput ReturnExpressionPacket ReturnInputFormPacket ReturnPacket ReturnReceiptFunction ReturnTextPacket Reverse ReverseBiorthogonalSplineWavelet ReverseElement ReverseEquilibrium ReverseGraph ReverseSort ReverseSortBy ReverseUpEquilibrium RevolutionAxis RevolutionPlot3D RGBColor RiccatiSolve RiceDistribution RidgeFilter RiemannR RiemannSiegelTheta RiemannSiegelZ RiemannXi Riffle Right RightArrow RightArrowBar RightArrowLeftArrow RightComposition RightCosetRepresentative RightDownTeeVector RightDownVector RightDownVectorBar RightTee RightTeeArrow RightTeeVector RightTriangle RightTriangleBar RightTriangleEqual RightUpDownVector RightUpTeeVector RightUpVector RightUpVectorBar RightVector RightVectorBar RiskAchievementImportance RiskReductionImportance RogersTanimotoDissimilarity RollPitchYawAngles RollPitchYawMatrix RomanNumeral 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 RSolveValue RudinShapiro RudvalisGroupRu Rule RuleCondition RuleDelayed RuleForm RulePlot RulerUnits Run RunProcess RunScheduledTask RunThrough RuntimeAttributes RuntimeOptions RussellRaoDissimilaritySameQ SameTest SampledEntityClass SampleDepth SampledSoundFunction SampledSoundList SampleRate SamplingPeriod SARIMAProcess SARMAProcess SASTriangle SatelliteData SatisfiabilityCount SatisfiabilityInstances SatisfiableQ Saturday Save Saveable SaveAutoDelete SaveConnection SaveDefinitions SavitzkyGolayMatrix SawtoothWave Scale Scaled ScaleDivisions ScaledMousePosition ScaleOrigin ScalePadding ScaleRanges ScaleRangeStyle ScalingFunctions ScalingMatrix ScalingTransform Scan ScheduledTask ScheduledTaskActiveQ ScheduledTaskInformation ScheduledTaskInformationData ScheduledTaskObject ScheduledTasks SchurDecomposition ScientificForm ScientificNotationThreshold ScorerGi ScorerGiPrime ScorerHi ScorerHiPrime ScreenRectangle ScreenStyleEnvironment ScriptBaselineShifts ScriptForm ScriptLevel ScriptMinSize ScriptRules ScriptSizeMultipliers Scrollbars ScrollingOptions ScrollPosition SearchAdjustment SearchIndexObject SearchIndices SearchQueryString SearchResultObject Sec Sech SechDistribution SecondOrderConeOptimization SectionGrouping SectorChart SectorChart3D SectorOrigin SectorSpacing SecuredAuthenticationKey SecuredAuthenticationKeys SeedRandom Select Selectable SelectComponents SelectedCells SelectedNotebook SelectFirst Selection SelectionAnimate SelectionCell SelectionCellCreateCell SelectionCellDefaultStyle SelectionCellParentStyle SelectionCreateCell SelectionDebuggerTag SelectionDuplicateCell SelectionEvaluate SelectionEvaluateCreateCell SelectionMove SelectionPlaceholder SelectionSetStyle SelectWithContents SelfLoops SelfLoopStyle SemanticImport SemanticImportString SemanticInterpretation SemialgebraicComponentInstances SemidefiniteOptimization SendMail SendMessage Sequence SequenceAlignment SequenceAttentionLayer SequenceCases SequenceCount SequenceFold SequenceFoldList SequenceForm SequenceHold SequenceLastLayer SequenceMostLayer SequencePosition SequencePredict SequencePredictorFunction SequenceReplace SequenceRestLayer SequenceReverseLayer SequenceSplit Series SeriesCoefficient SeriesData ServiceConnect ServiceDisconnect ServiceExecute ServiceObject ServiceRequest ServiceResponse ServiceSubmit SessionSubmit SessionTime Set SetAccuracy SetAlphaChannel SetAttributes Setbacks SetBoxFormNamesPacket SetCloudDirectory SetCookies SetDelayed SetDirectory SetEnvironment SetEvaluationNotebook SetFileDate SetFileLoadingContext SetNotebookStatusLine SetOptions SetOptionsPacket SetPermissions SetPrecision SetProperty SetSecuredAuthenticationKey SetSelectedNotebook SetSharedFunction SetSharedVariable SetSpeechParametersPacket SetStreamPosition SetSystemModel SetSystemOptions Setter SetterBar SetterBox SetterBoxOptions Setting SetUsers SetValue Shading Shallow ShannonWavelet ShapiroWilkTest Share SharingList Sharpen ShearingMatrix ShearingTransform ShellRegion ShenCastanMatrix ShiftedGompertzDistribution ShiftRegisterSequence Short ShortDownArrow Shortest ShortestMatch ShortestPathFunction ShortLeftArrow ShortRightArrow ShortTimeFourier ShortTimeFourierData ShortUpArrow Show ShowAutoConvert ShowAutoSpellCheck ShowAutoStyles ShowCellBracket ShowCellLabel ShowCellTags ShowClosedCellArea ShowCodeAssist ShowContents ShowControls ShowCursorTracker ShowGroupOpenCloseIcon ShowGroupOpener ShowInvisibleCharacters ShowPageBreaks ShowPredictiveInterface ShowSelection ShowShortBoxForm ShowSpecialCharacters ShowStringCharacters ShowSyntaxStyles ShrinkingDelay ShrinkWrapBoundingBox SiderealTime SiegelTheta SiegelTukeyTest SierpinskiCurve SierpinskiMesh Sign Signature SignedRankTest SignedRegionDistance SignificanceLevel SignPadding SignTest SimilarityRules SimpleGraph SimpleGraphQ SimplePolygonQ SimplePolyhedronQ Simplex Simplify Sin Sinc SinghMaddalaDistribution SingleEvaluation SingleLetterItalics SingleLetterStyle SingularValueDecomposition SingularValueList SingularValuePlot SingularValues Sinh SinhIntegral SinIntegral SixJSymbol Skeleton SkeletonTransform SkellamDistribution Skewness SkewNormalDistribution SkinStyle Skip SliceContourPlot3D SliceDensityPlot3D SliceDistribution SliceVectorPlot3D Slider Slider2D Slider2DBox Slider2DBoxOptions SliderBox SliderBoxOptions SlideView Slot SlotSequence Small SmallCircle Smaller SmithDecomposition SmithDelayCompensator SmithWatermanSimilarity SmoothDensityHistogram SmoothHistogram SmoothHistogram3D SmoothKernelDistribution SnDispersion Snippet SnubPolyhedron SocialMediaData Socket SocketConnect SocketListen SocketListener SocketObject SocketOpen SocketReadMessage SocketReadyQ Sockets SocketWaitAll SocketWaitNext SoftmaxLayer SokalSneathDissimilarity SolarEclipse SolarSystemFeatureData SolidAngle SolidData SolidRegionQ Solve SolveAlways SolveDelayed Sort SortBy SortedBy SortedEntityClass Sound SoundAndGraphics SoundNote SoundVolume SourceLink Sow Space SpaceCurveData SpaceForm Spacer Spacings Span SpanAdjustments SpanCharacterRounding SpanFromAbove SpanFromBoth SpanFromLeft SpanLineThickness SpanMaxSize SpanMinSize SpanningCharacters SpanSymmetric SparseArray SpatialGraphDistribution SpatialMedian SpatialTransformationLayer Speak SpeakTextPacket SpearmanRankTest SpearmanRho SpeciesData SpecificityGoal SpectralLineData Spectrogram SpectrogramArray Specularity SpeechRecognize SpeechSynthesize SpellingCorrection SpellingCorrectionList SpellingDictionaries SpellingDictionariesPath SpellingOptions SpellingSuggestionsPacket Sphere SphereBox SpherePoints SphericalBesselJ SphericalBesselY SphericalHankelH1 SphericalHankelH2 SphericalHarmonicY SphericalPlot3D SphericalRegion SphericalShell 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 SquareMatrixQ SquareRepeatingElement SquaresR SquareSubset SquareSubsetEqual SquareSuperset SquareSupersetEqual SquareUnion SquareWave SSSTriangle StabilityMargins StabilityMarginsStyle StableDistribution Stack StackBegin StackComplete StackedDateListPlot StackedListPlot StackInhibit StadiumShape StandardAtmosphereData StandardDeviation StandardDeviationFilter StandardForm Standardize Standardized StandardOceanData StandbyDistribution Star StarClusterData StarData StarGraph StartAsynchronousTask StartExternalSession StartingStepSize StartOfLine StartOfString StartProcess StartScheduledTask StartupSound StartWebSession StateDimensions StateFeedbackGains StateOutputEstimator StateResponse StateSpaceModel StateSpaceRealization StateSpaceTransform StateTransformationLinearize StationaryDistribution StationaryWaveletPacketTransform StationaryWaveletTransform StatusArea StatusCentrality StepMonitor StereochemistryElements StieltjesGamma StirlingS1 StirlingS2 StopAsynchronousTask StoppingPowerData StopScheduledTask StrataVariables StratonovichProcess StreamColorFunction StreamColorFunctionScaling StreamDensityPlot StreamMarkers StreamPlot StreamPoints StreamPosition Streams StreamScale StreamStyle String StringBreak StringByteCount StringCases StringContainsQ StringCount StringDelete StringDrop StringEndsQ StringExpression StringExtract StringForm StringFormat StringFreeQ StringInsert StringJoin StringLength StringMatchQ StringPadLeft StringPadRight StringPart StringPartition StringPosition StringQ StringRepeat StringReplace StringReplaceList StringReplacePart StringReverse StringRiffle StringRotateLeft StringRotateRight StringSkeleton StringSplit StringStartsQ StringTake StringTemplate StringToByteArray StringToStream StringTrim StripBoxes StripOnInput StripWrapperBoxes StrokeForm StructuralImportance StructuredArray StructuredSelection StruveH StruveL Stub StudentTDistribution Style StyleBox StyleBoxAutoDelete StyleData StyleDefinitions StyleForm StyleHints StyleKeyMapping StyleMenuListing StyleNameDialogSettings StyleNames StylePrint StyleSheetPath Subdivide Subfactorial Subgraph SubMinus SubPlus SubresultantPolynomialRemainders SubresultantPolynomials Subresultants Subscript SubscriptBox SubscriptBoxOptions Subscripted Subsequences Subset SubsetEqual SubsetMap SubsetQ Subsets SubStar SubstitutionSystem Subsuperscript SubsuperscriptBox SubsuperscriptBoxOptions Subtract SubtractFrom SubtractSides SubValues Succeeds SucceedsEqual SucceedsSlantEqual SucceedsTilde Success SuchThat Sum SumConvergence SummationLayer Sunday SunPosition Sunrise Sunset SuperDagger SuperMinus SupernovaData SuperPlus Superscript SuperscriptBox SuperscriptBoxOptions Superset SupersetEqual SuperStar Surd SurdForm SurfaceArea SurfaceColor SurfaceData SurfaceGraphics SurvivalDistribution SurvivalFunction SurvivalModel SurvivalModelFit SuspendPacket SuzukiDistribution SuzukiGroupSuz SwatchLegend Switch Symbol SymbolName SymletWavelet Symmetric SymmetricGroup SymmetricKey SymmetricMatrixQ SymmetricPolynomial SymmetricReduction Symmetrize SymmetrizedArray SymmetrizedArrayRules SymmetrizedDependentComponents SymmetrizedIndependentComponents SymmetrizedReplacePart SynchronousInitialization SynchronousUpdating Synonyms Syntax SyntaxForm SyntaxInformation SyntaxLength SyntaxPacket SyntaxQ SynthesizeMissingValues SystemDialogInput SystemException SystemGet SystemHelpPath SystemInformation SystemInformationData SystemInstall SystemModel SystemModeler SystemModelExamples SystemModelLinearize SystemModelParametricSimulate SystemModelPlot SystemModelProgressReporting SystemModelReliability SystemModels SystemModelSimulate SystemModelSimulateSensitivity SystemModelSimulationData SystemOpen SystemOptions SystemProcessData SystemProcesses SystemsConnectionsModel SystemsModelDelay SystemsModelDelayApproximate SystemsModelDelete SystemsModelDimensions SystemsModelExtract SystemsModelFeedbackConnect SystemsModelLabels SystemsModelLinearity SystemsModelMerge SystemsModelOrder SystemsModelParallelConnect SystemsModelSeriesConnect SystemsModelStateFeedbackConnect SystemsModelVectorRelativeOrders SystemStub SystemTestTab TabFilling Table TableAlignments TableDepth TableDirections TableForm TableHeadings TableSpacing TableView TableViewBox TableViewBoxBackground TableViewBoxOptions TabSpacings TabView TabViewBox TabViewBoxOptions TagBox TagBoxNote TagBoxOptions TaggingRules TagSet TagSetDelayed TagStyle TagUnset Take TakeDrop TakeLargest TakeLargestBy TakeList TakeSmallest TakeSmallestBy TakeWhile Tally Tan Tanh TargetDevice TargetFunctions TargetSystem TargetUnits TaskAbort TaskExecute TaskObject TaskRemove TaskResume Tasks TaskSuspend TaskWait TautologyQ TelegraphProcess TemplateApply TemplateArgBox TemplateBox TemplateBoxOptions TemplateEvaluate TemplateExpression TemplateIf TemplateObject TemplateSequence TemplateSlot TemplateSlotSequence TemplateUnevaluated TemplateVerbatim TemplateWith TemporalData TemporalRegularity Temporary TemporaryVariable TensorContract TensorDimensions TensorExpand TensorProduct TensorQ TensorRank TensorReduce TensorSymmetry TensorTranspose TensorWedge TestID TestReport TestReportObject TestResultObject Tetrahedron TetrahedronBox TetrahedronBoxOptions TeXForm TeXSave Text Text3DBox Text3DBoxOptions TextAlignment TextBand TextBoundingBox TextBox TextCases TextCell TextClipboardType TextContents TextData TextElement TextForm TextGrid TextJustification TextLine TextPacket TextParagraph TextPosition TextRecognize TextSearch TextSearchReport TextSentences TextString TextStructure TextStyle TextTranslation Texture TextureCoordinateFunction TextureCoordinateScaling TextWords Therefore ThermodynamicData ThermometerGauge Thick Thickness Thin Thinning ThisLink ThompsonGroupTh Thread ThreadingLayer ThreeJSymbol Threshold Through Throw ThueMorse Thumbnail Thursday Ticks TicksStyle TideData Tilde TildeEqual TildeFullEqual TildeTilde TimeConstrained TimeConstraint TimeDirection TimeFormat TimeGoal TimelinePlot TimeObject TimeObjectQ Times TimesBy TimeSeries TimeSeriesAggregate TimeSeriesForecast TimeSeriesInsert TimeSeriesInvertibility TimeSeriesMap TimeSeriesMapThread TimeSeriesModel TimeSeriesModelFit TimeSeriesResample TimeSeriesRescale TimeSeriesShift TimeSeriesThread TimeSeriesWindow TimeUsed TimeValue TimeWarpingCorrespondence TimeWarpingDistance TimeZone TimeZoneConvert TimeZoneOffset Timing Tiny TitleGrouping TitsGroupT ToBoxes ToCharacterCode ToColor ToContinuousTimeModel ToDate Today ToDiscreteTimeModel ToEntity ToeplitzMatrix ToExpression ToFileName Together Toggle ToggleFalse Toggler TogglerBar TogglerBox TogglerBoxOptions ToHeldExpression ToInvertibleTimeSeries TokenWords Tolerance ToLowerCase Tomorrow ToNumberField TooBig Tooltip TooltipBox TooltipBoxOptions TooltipDelay TooltipStyle Top TopHatTransform ToPolarCoordinates TopologicalSort ToRadicals ToRules ToSphericalCoordinates ToString Total TotalHeight TotalLayer TotalVariationFilter TotalWidth TouchPosition TouchscreenAutoZoom TouchscreenControlPlacement ToUpperCase Tr Trace TraceAbove TraceAction TraceBackward TraceDepth TraceDialog TraceForward TraceInternal TraceLevel TraceOff TraceOn TraceOriginal TracePrint TraceScan TrackedSymbols TrackingFunction TracyWidomDistribution TradingChart TraditionalForm TraditionalFunctionNotation TraditionalNotation TraditionalOrder TrainingProgressCheckpointing TrainingProgressFunction TrainingProgressMeasurements TrainingProgressReporting TrainingStoppingCriterion TransferFunctionCancel TransferFunctionExpand TransferFunctionFactor TransferFunctionModel TransferFunctionPoles TransferFunctionTransform TransferFunctionZeros TransformationClass TransformationFunction TransformationFunctions TransformationMatrix TransformedDistribution TransformedField TransformedProcess TransformedRegion TransitionDirection TransitionDuration TransitionEffect TransitiveClosureGraph TransitiveReductionGraph Translate TranslationOptions TranslationTransform Transliterate Transparent TransparentColor Transpose TransposeLayer TrapSelection TravelDirections TravelDirectionsData TravelDistance TravelDistanceList TravelMethod TravelTime TreeForm TreeGraph TreeGraphQ TreePlot TrendStyle Triangle TriangleCenter TriangleConstruct TriangleMeasurement TriangleWave TriangularDistribution TriangulateMesh Trig TrigExpand TrigFactor TrigFactorList Trigger TrigReduce TrigToExp TrimmedMean TrimmedVariance TropicalStormData True TrueQ TruncatedDistribution TruncatedPolyhedron TsallisQExponentialDistribution TsallisQGaussianDistribution TTest Tube TubeBezierCurveBox TubeBezierCurveBoxOptions TubeBox TubeBoxOptions TubeBSplineCurveBox TubeBSplineCurveBoxOptions Tuesday TukeyLambdaDistribution TukeyWindow TunnelData Tuples TuranGraph TuringMachine TuttePolynomial TwoWayRule Typed TypeSpecifierUnateQ Uncompress UnconstrainedParameters Undefined UnderBar Underflow Underlined Underoverscript UnderoverscriptBox UnderoverscriptBoxOptions Underscript UnderscriptBox UnderscriptBoxOptions UnderseaFeatureData UndirectedEdge UndirectedGraph UndirectedGraphQ UndoOptions UndoTrackedVariables Unequal UnequalTo Unevaluated UniformDistribution UniformGraphDistribution UniformPolyhedron UniformSumDistribution Uninstall Union UnionPlus Unique UnitaryMatrixQ UnitBox UnitConvert UnitDimensions Unitize UnitRootTest UnitSimplify UnitStep UnitSystem UnitTriangle UnitVector UnitVectorLayer UnityDimensions UniverseModelData UniversityData UnixTime Unprotect UnregisterExternalEvaluator UnsameQ UnsavedVariables Unset UnsetShared UntrackedVariables Up UpArrow UpArrowBar UpArrowDownArrow Update UpdateDynamicObjects UpdateDynamicObjectsSynchronous UpdateInterval UpdateSearchIndex UpDownArrow UpEquilibrium UpperCaseQ UpperLeftArrow UpperRightArrow UpperTriangularize UpperTriangularMatrixQ Upsample UpSet UpSetDelayed UpTee UpTeeArrow UpTo UpValues URL URLBuild URLDecode URLDispatcher URLDownload URLDownloadSubmit URLEncode URLExecute URLExpand URLFetch URLFetchAsynchronous URLParse URLQueryDecode URLQueryEncode URLRead URLResponseTime URLSave URLSaveAsynchronous URLShorten URLSubmit UseGraphicsRange UserDefinedWavelet Using UsingFrontEnd UtilityFunctionV2Get ValenceErrorHandling ValidationLength ValidationSet Value ValueBox ValueBoxOptions ValueDimensions ValueForm ValuePreprocessingFunction ValueQ Values ValuesData Variables Variance VarianceEquivalenceTest VarianceEstimatorFunction VarianceGammaDistribution VarianceTest VectorAngle VectorAround VectorColorFunction VectorColorFunctionScaling VectorDensityPlot VectorGlyphData VectorGreater VectorGreaterEqual VectorLess VectorLessEqual VectorMarkers VectorPlot VectorPlot3D VectorPoints VectorQ Vectors VectorScale VectorStyle Vee Verbatim Verbose VerboseConvertToPostScriptPacket VerificationTest VerifyConvergence VerifyDerivedKey VerifyDigitalSignature VerifyInterpretation VerifySecurityCertificates VerifySolutions VerifyTestAssumptions Version VersionNumber VertexAdd VertexCapacity VertexColors VertexComponent VertexConnectivity VertexContract 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 VertexWeightedGraphQ Vertical VerticalBar VerticalForm VerticalGauge VerticalSeparator VerticalSlider VerticalTilde ViewAngle ViewCenter ViewMatrix ViewPoint ViewPointSelectorSettings ViewPort ViewProjection ViewRange ViewVector ViewVertical VirtualGroupData Visible VisibleCell VoiceStyleData VoigtDistribution VolcanoData Volume VonMisesDistribution VoronoiMeshWaitAll WaitAsynchronousTask WaitNext WaitUntil WakebyDistribution WalleniusHypergeometricDistribution WaringYuleDistribution WarpingCorrespondence WarpingDistance WatershedComponents WatsonUSquareTest WattsStrogatzGraphDistribution WaveletBestBasis WaveletFilterCoefficients WaveletImagePlot WaveletListPlot WaveletMapIndexed WaveletMatrixPlot WaveletPhi WaveletPsi WaveletScale WaveletScalogram WaveletThreshold WeaklyConnectedComponents WeaklyConnectedGraphComponents WeaklyConnectedGraphQ WeakStationarity WeatherData WeatherForecastData WebAudioSearch WebElementObject WeberE WebExecute WebImage WebImageSearch WebSearch WebSessionObject WebSessions WebWindowObject Wedge Wednesday WeibullDistribution WeierstrassE1 WeierstrassE2 WeierstrassE3 WeierstrassEta1 WeierstrassEta2 WeierstrassEta3 WeierstrassHalfPeriods WeierstrassHalfPeriodW1 WeierstrassHalfPeriodW2 WeierstrassHalfPeriodW3 WeierstrassInvariantG2 WeierstrassInvariantG3 WeierstrassInvariants WeierstrassP WeierstrassPPrime WeierstrassSigma WeierstrassZeta WeightedAdjacencyGraph WeightedAdjacencyMatrix WeightedData WeightedGraphQ Weights WelchWindow WheelGraph WhenEvent Which While White WhiteNoiseProcess WhitePoint Whitespace WhitespaceCharacter WhittakerM WhittakerW WienerFilter WienerProcess WignerD WignerSemicircleDistribution WikipediaData WikipediaSearch WilksW WilksWTest WindDirectionData WindingCount WindingPolygon WindowClickSelect WindowElements WindowFloating WindowFrame WindowFrameElements WindowMargins WindowMovable WindowOpacity WindowPersistentStyles WindowSelected WindowSize WindowStatusArea WindowTitle WindowToolbars WindowWidth WindSpeedData WindVectorData WinsorizedMean WinsorizedVariance WishartMatrixDistribution With WolframAlpha WolframAlphaDate WolframAlphaQuantity WolframAlphaResult WolframLanguageData Word WordBoundary WordCharacter WordCloud WordCount WordCounts WordData WordDefinition WordFrequency WordFrequencyData WordList WordOrientation WordSearch WordSelectionFunction WordSeparators WordSpacings WordStem WordTranslation WorkingPrecision WrapAround Write WriteLine WriteString WronskianXMLElement XMLObject XMLTemplate Xnor Xor XYZColorYellow Yesterday YuleDissimilarityZernikeR ZeroSymmetric ZeroTest ZeroWidthTimes Zeta ZetaZero ZIPCodeData ZipfDistribution ZoomCenter ZoomFactor ZTest ZTransform$Aborted $ActivationGroupID $ActivationKey $ActivationUserRegistered $AddOnsDirectory $AllowExternalChannelFunctions $AssertFunction $Assumptions $AsynchronousTask $AudioInputDevices $AudioOutputDevices $BaseDirectory $BatchInput $BatchOutput $BlockchainBase $BoxForms $ByteOrdering $CacheBaseDirectory $Canceled $ChannelBase $CharacterEncoding $CharacterEncodings $CloudBase $CloudConnected $CloudCreditsAvailable $CloudEvaluation $CloudExpressionBase $CloudObjectNameFormat $CloudObjectURLType $CloudRootDirectory $CloudSymbolBase $CloudUserID $CloudUserUUID $CloudVersion $CloudVersionNumber $CloudWolframEngineVersionNumber $CommandLine $CompilationTarget $ConditionHold $ConfiguredKernels $Context $ContextPath $ControlActiveSetting $Cookies $CookieStore $CreationDate $CurrentLink $CurrentTask $CurrentWebSession $DateStringFormat $DefaultAudioInputDevice $DefaultAudioOutputDevice $DefaultFont $DefaultFrontEnd $DefaultImagingDevice $DefaultLocalBase $DefaultMailbox $DefaultNetworkInterface $DefaultPath $Display $DisplayFunction $DistributedContexts $DynamicEvaluation $Echo $EmbedCodeEnvironments $EmbeddableServices $EntityStores $Epilog $EvaluationCloudBase $EvaluationCloudObject $EvaluationEnvironment $ExportFormats $Failed $FinancialDataSource $FontFamilies $FormatType $FrontEnd $FrontEndSession $GeoEntityTypes $GeoLocation $GeoLocationCity $GeoLocationCountry $GeoLocationPrecision $GeoLocationSource $HistoryLength $HomeDirectory $HTMLExportRules $HTTPCookies $HTTPRequest $IgnoreEOF $ImageFormattingWidth $ImagingDevice $ImagingDevices $ImportFormats $IncomingMailSettings $InitialDirectory $Initialization $InitializationContexts $Input $InputFileName $InputStreamMethods $Inspector $InstallationDate $InstallationDirectory $InterfaceEnvironment $InterpreterTypes $IterationLimit $KernelCount $KernelID $Language $LaunchDirectory $LibraryPath $LicenseExpirationDate $LicenseID $LicenseProcesses $LicenseServer $LicenseSubprocesses $LicenseType $Line $Linked $LinkSupported $LoadedFiles $LocalBase $LocalSymbolBase $MachineAddresses $MachineDomain $MachineDomains $MachineEpsilon $MachineID $MachineName $MachinePrecision $MachineType $MaxExtraPrecision $MaxLicenseProcesses $MaxLicenseSubprocesses $MaxMachineNumber $MaxNumber $MaxPiecewiseCases $MaxPrecision $MaxRootDegree $MessageGroups $MessageList $MessagePrePrint $Messages $MinMachineNumber $MinNumber $MinorReleaseNumber $MinPrecision $MobilePhone $ModuleNumber $NetworkConnected $NetworkInterfaces $NetworkLicense $NewMessage $NewSymbol $Notebooks $NoValue $NumberMarks $Off $OperatingSystem $Output $OutputForms $OutputSizeLimit $OutputStreamMethods $Packages $ParentLink $ParentProcessID $PasswordFile $PatchLevelID $Path $PathnameSeparator $PerformanceGoal $Permissions $PermissionsGroupBase $PersistenceBase $PersistencePath $PipeSupported $PlotTheme $Post $Pre $PreferencesDirectory $PreInitialization $PrePrint $PreRead $PrintForms $PrintLiteral $Printout3DPreviewer $ProcessID $ProcessorCount $ProcessorType $ProductInformation $ProgramName $PublisherID $RandomState $RecursionLimit $RegisteredDeviceClasses $RegisteredUserName $ReleaseNumber $RequesterAddress $RequesterWolframID $RequesterWolframUUID $ResourceSystemBase $RootDirectory $ScheduledTask $ScriptCommandLine $ScriptInputString $SecuredAuthenticationKeyTokens $ServiceCreditsAvailable $Services $SessionID $SetParentLink $SharedFunctions $SharedVariables $SoundDisplay $SoundDisplayFunction $SourceLink $SSHAuthentication $SummaryBoxDataSizeLimit $SuppressInputFormHeads $SynchronousEvaluation $SyntaxHandler $System $SystemCharacterEncoding $SystemID $SystemMemory $SystemShell $SystemTimeZone $SystemWordLength $TemplatePath $TemporaryDirectory $TemporaryPrefix $TestFileName $TextStyle $TimedOut $TimeUnit $TimeZone $TimeZoneEntity $TopDirectory $TraceOff $TraceOn $TracePattern $TracePostAction $TracePreAction $UnitSystem $Urgent $UserAddOnsDirectory $UserAgentLanguages $UserAgentMachine $UserAgentName $UserAgentOperatingSystem $UserAgentString $UserAgentVersion $UserBaseDirectory $UserDocumentsDirectory $Username $UserName $UserURLBase $Version $VersionNumber $VoiceStyles $WolframID $WolframUUID",
+contains:[a.COMMENT("\\(\\*","\\*\\)",{contains:["self"]}),a.QUOTE_STRING_MODE,a.C_NUMBER_MODE]}});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){return{keywords:{keyword:"actor addressof and as be break class compile_error compile_intrinsic consume continue delegate digestof do else elseif embed end error for fun if ifdef in interface is isnt lambda let match new not object or 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:"type",begin:"\\b_?[A-Z][\\w]*",relevance:0},{className:"string",begin:'"""',end:'"""',relevance:10},{className:"string",begin:'"',end:'"',contains:[a.BACKSLASH_ESCAPE]},{className:"string",begin:"'",end:"'",contains:[a.BACKSLASH_ESCAPE],relevance:0},{begin:a.IDENT_RE+"'",relevance:0},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 catchValidateNoCircleInNodeResources ValidateNodeExclusiveResources ValidateNodeManager ValidateNodeResources ValidateNodeResourceSource ValidateNoNameNodeResources ThrowError IsHiddenResourceIsPatternMatched ",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 Add-VamtProductKey Export-VamtData Find-VamtManagedMachine Get-VamtConfirmationId Get-VamtProduct Get-VamtProductKey Import-VamtData Initialize-VamtData Install-VamtConfirmationId Install-VamtProductActivation Install-VamtProductKey Update-VamtProduct Add-CIDatastore Add-KeyManagementServer Add-NodeKeys Add-NsxDynamicCriteria Add-NsxDynamicMemberSet Add-NsxEdgeInterfaceAddress Add-NsxFirewallExclusionListMember Add-NsxFirewallRuleMember Add-NsxIpSetMember Add-NsxLicense Add-NsxLoadBalancerPoolMember Add-NsxLoadBalancerVip Add-NsxSecondaryManager Add-NsxSecurityGroupMember Add-NsxSecurityPolicyRule Add-NsxSecurityPolicyRuleGroup Add-NsxSecurityPolicyRuleService Add-NsxServiceGroupMember Add-NsxTransportZoneMember Add-PassthroughDevice Add-VDSwitchPhysicalNetworkAdapter Add-VDSwitchVMHost Add-VMHost Add-VMHostNtpServer Add-VirtualSwitchPhysicalNetworkAdapter Add-XmlElement Add-vRACustomForm Add-vRAPrincipalToTenantRole Add-vRAReservationNetwork Add-vRAReservationStorage Clear-NsxEdgeInterface Clear-NsxManagerTimeSettings Compress-Archive Connect-CIServer Connect-CisServer Connect-HCXServer Connect-NIServer Connect-NsxLogicalSwitch Connect-NsxServer Connect-NsxtServer Connect-SrmServer Connect-VIServer Connect-Vmc Connect-vRAServer Connect-vRNIServer ConvertFrom-Markdown ConvertTo-MOFInstance Copy-DatastoreItem Copy-HardDisk Copy-NsxEdge Copy-VDisk Copy-VMGuestFile Debug-Runspace Disable-NsxEdgeSsh Disable-RunspaceDebug Disable-vRNIDataSource Disconnect-CIServer Disconnect-CisServer Disconnect-HCXServer Disconnect-NsxLogicalSwitch Disconnect-NsxServer Disconnect-NsxtServer Disconnect-SrmServer Disconnect-VIServer Disconnect-Vmc Disconnect-vRAServer Disconnect-vRNIServer Dismount-Tools Enable-NsxEdgeSsh Enable-RunspaceDebug Enable-vRNIDataSource Expand-Archive Export-NsxObject Export-SpbmStoragePolicy Export-VApp Export-VDPortGroup Export-VDSwitch Export-VMHostProfile Export-vRAIcon Export-vRAPackage Find-Command Find-DscResource Find-Module Find-NsxWhereVMUsed Find-Package Find-PackageProvider Find-RoleCapability Find-Script Format-Hex Format-VMHostDiskPartition Format-XML Generate-VersionInfo Get-AdvancedSetting Get-AlarmAction Get-AlarmActionTrigger Get-AlarmDefinition Get-Annotation Get-CDDrive Get-CIAccessControlRule Get-CIDatastore Get-CINetworkAdapter Get-CIRole Get-CIUser Get-CIVApp Get-CIVAppNetwork Get-CIVAppStartRule Get-CIVAppTemplate Get-CIVM Get-CIVMTemplate Get-CIView Get-Catalog Get-CisCommand Get-CisService Get-CloudCommand Get-Cluster Get-CompatibleVersionAddtionaPropertiesStr Get-ComplexResourceQualifier Get-ConfigurationErrorCount Get-ContentLibraryItem Get-CustomAttribute Get-DSCResourceModules Get-Datacenter Get-Datastore Get-DatastoreCluster Get-DrsClusterGroup Get-DrsRecommendation Get-DrsRule Get-DrsVMHostRule Get-DscResource Get-EdgeGateway Get-EncryptedPassword Get-ErrorReport Get-EsxCli Get-EsxTop Get-ExternalNetwork Get-FileHash Get-FloppyDrive Get-Folder Get-HAPrimaryVMHost Get-HCXAppliance Get-HCXApplianceCompute Get-HCXApplianceDVS Get-HCXApplianceDatastore Get-HCXApplianceNetwork Get-HCXContainer Get-HCXDatastore Get-HCXGateway Get-HCXInterconnectStatus Get-HCXJob Get-HCXMigration Get-HCXNetwork Get-HCXNetworkExtension Get-HCXReplication Get-HCXReplicationSnapshot Get-HCXService Get-HCXSite Get-HCXSitePairing Get-HCXVM Get-HardDisk Get-IScsiHbaTarget Get-InnerMostErrorRecord Get-InstallPath Get-InstalledModule Get-InstalledScript Get-Inventory Get-ItemPropertyValue Get-KeyManagementServer Get-KmipClientCertificate Get-KmsCluster Get-Log Get-LogType Get-MarkdownOption Get-Media Get-MofInstanceName Get-MofInstanceText Get-NetworkAdapter Get-NetworkPool Get-NfsUser Get-NicTeamingPolicy Get-NsxApplicableMember Get-NsxApplicableSecurityAction Get-NsxBackingDVSwitch Get-NsxBackingPortGroup Get-NsxCliDfwAddrSet Get-NsxCliDfwFilter Get-NsxCliDfwRule Get-NsxClusterStatus Get-NsxController Get-NsxDynamicCriteria Get-NsxDynamicMemberSet Get-NsxEdge Get-NsxEdgeBgp Get-NsxEdgeBgpNeighbour Get-NsxEdgeCertificate Get-NsxEdgeCsr Get-NsxEdgeFirewall Get-NsxEdgeFirewallRule Get-NsxEdgeInterface Get-NsxEdgeInterfaceAddress Get-NsxEdgeNat Get-NsxEdgeNatRule Get-NsxEdgeOspf Get-NsxEdgeOspfArea Get-NsxEdgeOspfInterface Get-NsxEdgePrefix Get-NsxEdgeRedistributionRule Get-NsxEdgeRouting Get-NsxEdgeStaticRoute Get-NsxEdgeSubInterface Get-NsxFirewallExclusionListMember Get-NsxFirewallGlobalConfiguration Get-NsxFirewallPublishStatus Get-NsxFirewallRule Get-NsxFirewallRuleMember Get-NsxFirewallSavedConfiguration Get-NsxFirewallSection Get-NsxFirewallThreshold Get-NsxIpPool Get-NsxIpSet Get-NsxLicense Get-NsxLoadBalancer Get-NsxLoadBalancerApplicationProfile Get-NsxLoadBalancerApplicationRule Get-NsxLoadBalancerMonitor Get-NsxLoadBalancerPool Get-NsxLoadBalancerPoolMember Get-NsxLoadBalancerStats Get-NsxLoadBalancerVip Get-NsxLogicalRouter Get-NsxLogicalRouterBgp Get-NsxLogicalRouterBgpNeighbour Get-NsxLogicalRouterBridge Get-NsxLogicalRouterBridging Get-NsxLogicalRouterInterface Get-NsxLogicalRouterOspf Get-NsxLogicalRouterOspfArea Get-NsxLogicalRouterOspfInterface Get-NsxLogicalRouterPrefix Get-NsxLogicalRouterRedistributionRule Get-NsxLogicalRouterRouting Get-NsxLogicalRouterStaticRoute Get-NsxLogicalSwitch Get-NsxMacSet Get-NsxManagerBackup Get-NsxManagerCertificate Get-NsxManagerComponentSummary Get-NsxManagerNetwork Get-NsxManagerRole Get-NsxManagerSsoConfig Get-NsxManagerSyncStatus Get-NsxManagerSyslogServer Get-NsxManagerSystemSummary Get-NsxManagerTimeSettings Get-NsxManagerVcenterConfig Get-NsxSecondaryManager Get-NsxSecurityGroup Get-NsxSecurityGroupEffectiveIpAddress Get-NsxSecurityGroupEffectiveMacAddress Get-NsxSecurityGroupEffectiveMember Get-NsxSecurityGroupEffectiveVirtualMachine Get-NsxSecurityGroupEffectiveVnic Get-NsxSecurityGroupMemberTypes Get-NsxSecurityPolicy Get-NsxSecurityPolicyHighestUsedPrecedence Get-NsxSecurityPolicyRule Get-NsxSecurityTag Get-NsxSecurityTagAssignment Get-NsxSegmentIdRange Get-NsxService Get-NsxServiceDefinition Get-NsxServiceGroup Get-NsxServiceGroupMember Get-NsxServiceProfile Get-NsxSpoofguardNic Get-NsxSpoofguardPolicy Get-NsxSslVpn Get-NsxSslVpnAuthServer Get-NsxSslVpnClientInstallationPackage Get-NsxSslVpnIpPool Get-NsxSslVpnPrivateNetwork Get-NsxSslVpnUser Get-NsxTransportZone Get-NsxUserRole Get-NsxVdsContext Get-NsxtPolicyService Get-NsxtService Get-OSCustomizationNicMapping Get-OSCustomizationSpec Get-Org Get-OrgNetwork Get-OrgVdc Get-OrgVdcNetwork Get-OvfConfiguration Get-PSCurrentConfigurationNode Get-PSDefaultConfigurationDocument Get-PSMetaConfigDocumentInstVersionInfo Get-PSMetaConfigurationProcessed Get-PSReadLineKeyHandler Get-PSReadLineOption Get-PSRepository Get-PSTopConfigurationName Get-PSVersion Get-Package Get-PackageProvider Get-PackageSource Get-PassthroughDevice Get-PositionInfo Get-PowerCLICommunity Get-PowerCLIConfiguration Get-PowerCLIHelp Get-PowerCLIVersion Get-PowerNsxVersion Get-ProviderVdc Get-PublicKeyFromFile Get-PublicKeyFromStore Get-ResourcePool Get-Runspace Get-RunspaceDebug Get-ScsiController Get-ScsiLun Get-ScsiLunPath Get-SecurityInfo Get-SecurityPolicy Get-Snapshot Get-SpbmCapability Get-SpbmCompatibleStorage Get-SpbmEntityConfiguration Get-SpbmFaultDomain Get-SpbmPointInTimeReplica Get-SpbmReplicationGroup Get-SpbmReplicationPair Get-SpbmStoragePolicy Get-Stat Get-StatInterval Get-StatType Get-Tag Get-TagAssignment Get-TagCategory Get-Task Get-Template Get-TimeZone Get-Uptime Get-UsbDevice Get-VAIOFilter Get-VApp Get-VDBlockedPolicy Get-VDPort Get-VDPortgroup Get-VDPortgroupOverridePolicy Get-VDSecurityPolicy Get-VDSwitch Get-VDSwitchPrivateVlan Get-VDTrafficShapingPolicy Get-VDUplinkLacpPolicy Get-VDUplinkTeamingPolicy Get-VDisk Get-VIAccount Get-VICommand Get-VICredentialStoreItem Get-VIEvent Get-VIObjectByVIView Get-VIPermission Get-VIPrivilege Get-VIProperty Get-VIRole Get-VM Get-VMGuest Get-VMHost Get-VMHostAccount Get-VMHostAdvancedConfiguration Get-VMHostAuthentication Get-VMHostAvailableTimeZone Get-VMHostDiagnosticPartition Get-VMHostDisk Get-VMHostDiskPartition Get-VMHostFirewallDefaultPolicy Get-VMHostFirewallException Get-VMHostFirmware Get-VMHostHardware Get-VMHostHba Get-VMHostModule Get-VMHostNetwork Get-VMHostNetworkAdapter Get-VMHostNtpServer Get-VMHostPatch Get-VMHostPciDevice Get-VMHostProfile Get-VMHostProfileImageCacheConfiguration Get-VMHostProfileRequiredInput Get-VMHostProfileStorageDeviceConfiguration Get-VMHostProfileUserConfiguration Get-VMHostProfileVmPortGroupConfiguration Get-VMHostRoute Get-VMHostService Get-VMHostSnmp Get-VMHostStartPolicy Get-VMHostStorage Get-VMHostSysLogServer Get-VMQuestion Get-VMResourceConfiguration Get-VMStartPolicy Get-VTpm Get-VTpmCSR Get-VTpmCertificate Get-VasaProvider Get-VasaStorageArray Get-View Get-VirtualPortGroup Get-VirtualSwitch Get-VmcSddcNetworkService Get-VmcService Get-VsanClusterConfiguration Get-VsanComponent Get-VsanDisk Get-VsanDiskGroup Get-VsanEvacuationPlan Get-VsanFaultDomain Get-VsanIscsiInitiatorGroup Get-VsanIscsiInitiatorGroupTargetAssociation Get-VsanIscsiLun Get-VsanIscsiTarget Get-VsanObject Get-VsanResyncingComponent Get-VsanRuntimeInfo Get-VsanSpaceUsage Get-VsanStat Get-VsanView Get-vRAApplianceServiceStatus Get-vRAAuthorizationRole Get-vRABlueprint Get-vRABusinessGroup Get-vRACatalogItem Get-vRACatalogItemRequestTemplate Get-vRACatalogPrincipal Get-vRAComponentRegistryService Get-vRAComponentRegistryServiceEndpoint Get-vRAComponentRegistryServiceStatus Get-vRAContent Get-vRAContentData Get-vRAContentType Get-vRACustomForm Get-vRAEntitledCatalogItem Get-vRAEntitledService Get-vRAEntitlement Get-vRAExternalNetworkProfile Get-vRAGroupPrincipal Get-vRAIcon Get-vRANATNetworkProfile Get-vRANetworkProfileIPAddressList Get-vRANetworkProfileIPRangeSummary Get-vRAPackage Get-vRAPackageContent Get-vRAPropertyDefinition Get-vRAPropertyGroup Get-vRARequest Get-vRARequestDetail Get-vRAReservation Get-vRAReservationComputeResource Get-vRAReservationComputeResourceMemory Get-vRAReservationComputeResourceNetwork Get-vRAReservationComputeResourceResourcePool Get-vRAReservationComputeResourceStorage Get-vRAReservationPolicy Get-vRAReservationTemplate Get-vRAReservationType Get-vRAResource Get-vRAResourceAction Get-vRAResourceActionRequestTemplate Get-vRAResourceMetric Get-vRAResourceOperation Get-vRAResourceType Get-vRARoutedNetworkProfile Get-vRAService Get-vRAServiceBlueprint Get-vRASourceMachine Get-vRAStorageReservationPolicy Get-vRATenant Get-vRATenantDirectory Get-vRATenantDirectoryStatus Get-vRATenantRole Get-vRAUserPrincipal Get-vRAUserPrincipalGroupMembership Get-vRAVersion Get-vRNIAPIVersion Get-vRNIApplication Get-vRNIApplicationTier Get-vRNIDataSource Get-vRNIDataSourceSNMPConfig Get-vRNIDatastore Get-vRNIDistributedSwitch Get-vRNIDistributedSwitchPortGroup Get-vRNIEntity Get-vRNIEntityName Get-vRNIFirewallRule Get-vRNIFlow Get-vRNIHost Get-vRNIHostVMKNic Get-vRNIIPSet Get-vRNIL2Network Get-vRNINSXManager Get-vRNINodes Get-vRNIProblem Get-vRNIRecommendedRules Get-vRNIRecommendedRulesNsxBundle Get-vRNISecurityGroup Get-vRNISecurityTag Get-vRNIService Get-vRNIServiceGroup Get-vRNIVM Get-vRNIVMvNIC Get-vRNIvCenter Get-vRNIvCenterCluster Get-vRNIvCenterDatacenter Get-vRNIvCenterFolder Grant-NsxSpoofguardNicApproval Import-CIVApp Import-CIVAppTemplate Import-NsxObject Import-PackageProvider Import-PowerShellDataFile Import-SpbmStoragePolicy Import-VApp Import-VMHostProfile Import-vRAContentData Import-vRAIcon Import-vRAPackage Initialize-ConfigurationRuntimeState Install-Module Install-NsxCluster Install-Package Install-PackageProvider Install-Script Install-VMHostPatch Invoke-DrsRecommendation Invoke-NsxCli Invoke-NsxClusterResolveAll Invoke-NsxManagerSync Invoke-NsxRestMethod Invoke-NsxWebRequest Invoke-VMHostProfile Invoke-VMScript Invoke-XpathQuery Invoke-vRADataCollection Invoke-vRARestMethod Invoke-vRATenantDirectorySync Invoke-vRNIRestMethod Join-String Mount-Tools Move-Cluster Move-Datacenter Move-Datastore Move-Folder Move-HardDisk Move-Inventory Move-NsxSecurityPolicyRule Move-ResourcePool Move-Template Move-VApp Move-VDisk Move-VM Move-VMHost New-AdvancedSetting New-AlarmAction New-AlarmActionTrigger New-CDDrive New-CIAccessControlRule New-CIVApp New-CIVAppNetwork New-CIVAppTemplate New-CIVM New-Cluster New-CustomAttribute New-Datacenter New-Datastore New-DatastoreCluster New-DatastoreDrive New-DrsClusterGroup New-DrsRule New-DrsVMHostRule New-DscChecksum New-FloppyDrive New-Folder New-Guid New-HCXAppliance New-HCXMigration New-HCXNetworkExtension New-HCXNetworkMapping New-HCXReplication New-HCXSitePairing New-HCXStaticRoute New-HardDisk New-IScsiHbaTarget New-KmipClientCertificate New-NetworkAdapter New-NfsUser New-NsxAddressSpec New-NsxClusterVxlanConfig New-NsxController New-NsxDynamicCriteriaSpec New-NsxEdge New-NsxEdgeBgpNeighbour New-NsxEdgeCsr New-NsxEdgeFirewallRule New-NsxEdgeInterfaceSpec New-NsxEdgeNatRule New-NsxEdgeOspfArea New-NsxEdgeOspfInterface New-NsxEdgePrefix New-NsxEdgeRedistributionRule New-NsxEdgeSelfSignedCertificate New-NsxEdgeStaticRoute New-NsxEdgeSubInterface New-NsxEdgeSubInterfaceSpec New-NsxFirewallRule New-NsxFirewallSavedConfiguration New-NsxFirewallSection New-NsxIpPool New-NsxIpSet New-NsxLoadBalancerApplicationProfile New-NsxLoadBalancerApplicationRule New-NsxLoadBalancerMemberSpec New-NsxLoadBalancerMonitor New-NsxLoadBalancerPool New-NsxLogicalRouter New-NsxLogicalRouterBgpNeighbour New-NsxLogicalRouterBridge New-NsxLogicalRouterInterface New-NsxLogicalRouterInterfaceSpec New-NsxLogicalRouterOspfArea New-NsxLogicalRouterOspfInterface New-NsxLogicalRouterPrefix New-NsxLogicalRouterRedistributionRule New-NsxLogicalRouterStaticRoute New-NsxLogicalSwitch New-NsxMacSet New-NsxManager New-NsxSecurityGroup New-NsxSecurityPolicy New-NsxSecurityPolicyAssignment New-NsxSecurityPolicyFirewallRuleSpec New-NsxSecurityPolicyGuestIntrospectionSpec New-NsxSecurityPolicyNetworkIntrospectionSpec New-NsxSecurityTag New-NsxSecurityTagAssignment New-NsxSegmentIdRange New-NsxService New-NsxServiceGroup New-NsxSpoofguardPolicy New-NsxSslVpnAuthServer New-NsxSslVpnClientInstallationPackage New-NsxSslVpnIpPool New-NsxSslVpnPrivateNetwork New-NsxSslVpnUser New-NsxTransportZone New-NsxVdsContext New-OSCustomizationNicMapping New-OSCustomizationSpec New-Org New-OrgNetwork New-OrgVdc New-OrgVdcNetwork New-ResourcePool New-ScriptFileInfo New-ScsiController New-Snapshot New-SpbmRule New-SpbmRuleSet New-SpbmStoragePolicy New-StatInterval New-Tag New-TagAssignment New-TagCategory New-Template New-TemporaryFile New-VAIOFilter New-VApp New-VDPortgroup New-VDSwitch New-VDSwitchPrivateVlan New-VDisk New-VICredentialStoreItem New-VIInventoryDrive New-VIPermission New-VIProperty New-VIRole New-VISamlSecurityContext New-VM New-VMHostAccount New-VMHostNetworkAdapter New-VMHostProfile New-VMHostProfileVmPortGroupConfiguration New-VMHostRoute New-VTpm New-VasaProvider New-VcsOAuthSecurityContext New-VirtualPortGroup New-VirtualSwitch New-VsanDisk New-VsanDiskGroup New-VsanFaultDomain New-VsanIscsiInitiatorGroup New-VsanIscsiInitiatorGroupTargetAssociation New-VsanIscsiLun New-VsanIscsiTarget New-vRABusinessGroup New-vRAEntitlement New-vRAExternalNetworkProfile New-vRAGroupPrincipal New-vRANATNetworkProfile New-vRANetworkProfileIPRangeDefinition New-vRAPackage New-vRAPropertyDefinition New-vRAPropertyGroup New-vRAReservation New-vRAReservationNetworkDefinition New-vRAReservationPolicy New-vRAReservationStorageDefinition New-vRARoutedNetworkProfile New-vRAService New-vRAStorageReservationPolicy New-vRATenant New-vRATenantDirectory New-vRAUserPrincipal New-vRNIApplication New-vRNIApplicationTier New-vRNIDataSource Open-VMConsoleWindow Publish-Module Publish-NsxSpoofguardPolicy Publish-Script Register-PSRepository Register-PackageSource Remove-AdvancedSetting Remove-AlarmAction Remove-AlarmActionTrigger Remove-Alias Remove-CDDrive Remove-CIAccessControlRule Remove-CIVApp Remove-CIVAppNetwork Remove-CIVAppTemplate Remove-Cluster Remove-CustomAttribute Remove-Datacenter Remove-Datastore Remove-DatastoreCluster Remove-DrsClusterGroup Remove-DrsRule Remove-DrsVMHostRule Remove-FloppyDrive Remove-Folder Remove-HCXAppliance Remove-HCXNetworkExtension Remove-HCXReplication Remove-HCXSitePairing Remove-HardDisk Remove-IScsiHbaTarget Remove-Inventory Remove-KeyManagementServer Remove-NetworkAdapter Remove-NfsUser Remove-NsxCluster Remove-NsxClusterVxlanConfig Remove-NsxController Remove-NsxDynamicCriteria Remove-NsxDynamicMemberSet Remove-NsxEdge Remove-NsxEdgeBgpNeighbour Remove-NsxEdgeCertificate Remove-NsxEdgeCsr Remove-NsxEdgeFirewallRule Remove-NsxEdgeInterfaceAddress Remove-NsxEdgeNatRule Remove-NsxEdgeOspfArea Remove-NsxEdgeOspfInterface Remove-NsxEdgePrefix Remove-NsxEdgeRedistributionRule Remove-NsxEdgeStaticRoute Remove-NsxEdgeSubInterface Remove-NsxFirewallExclusionListMember Remove-NsxFirewallRule Remove-NsxFirewallRuleMember Remove-NsxFirewallSavedConfiguration Remove-NsxFirewallSection Remove-NsxIpPool Remove-NsxIpSet Remove-NsxIpSetMember Remove-NsxLoadBalancerApplicationProfile Remove-NsxLoadBalancerMonitor Remove-NsxLoadBalancerPool Remove-NsxLoadBalancerPoolMember Remove-NsxLoadBalancerVip Remove-NsxLogicalRouter Remove-NsxLogicalRouterBgpNeighbour Remove-NsxLogicalRouterBridge Remove-NsxLogicalRouterInterface Remove-NsxLogicalRouterOspfArea Remove-NsxLogicalRouterOspfInterface Remove-NsxLogicalRouterPrefix Remove-NsxLogicalRouterRedistributionRule Remove-NsxLogicalRouterStaticRoute Remove-NsxLogicalSwitch Remove-NsxMacSet Remove-NsxSecondaryManager Remove-NsxSecurityGroup Remove-NsxSecurityGroupMember Remove-NsxSecurityPolicy Remove-NsxSecurityPolicyAssignment Remove-NsxSecurityPolicyRule Remove-NsxSecurityPolicyRuleGroup Remove-NsxSecurityPolicyRuleService Remove-NsxSecurityTag Remove-NsxSecurityTagAssignment Remove-NsxSegmentIdRange Remove-NsxService Remove-NsxServiceGroup Remove-NsxSpoofguardPolicy Remove-NsxSslVpnClientInstallationPackage Remove-NsxSslVpnIpPool Remove-NsxSslVpnPrivateNetwork Remove-NsxSslVpnUser Remove-NsxTransportZone Remove-NsxTransportZoneMember Remove-NsxVdsContext Remove-OSCustomizationNicMapping Remove-OSCustomizationSpec Remove-Org Remove-OrgNetwork Remove-OrgVdc Remove-OrgVdcNetwork Remove-PSReadLineKeyHandler Remove-PassthroughDevice Remove-ResourcePool Remove-Snapshot Remove-SpbmStoragePolicy Remove-StatInterval Remove-Tag Remove-TagAssignment Remove-TagCategory Remove-Template Remove-UsbDevice Remove-VAIOFilter Remove-VApp Remove-VDPortGroup Remove-VDSwitch Remove-VDSwitchPhysicalNetworkAdapter Remove-VDSwitchPrivateVlan Remove-VDSwitchVMHost Remove-VDisk Remove-VICredentialStoreItem Remove-VIPermission Remove-VIProperty Remove-VIRole Remove-VM Remove-VMHost Remove-VMHostAccount Remove-VMHostNetworkAdapter Remove-VMHostNtpServer Remove-VMHostProfile Remove-VMHostProfileVmPortGroupConfiguration Remove-VMHostRoute Remove-VTpm Remove-VasaProvider Remove-VirtualPortGroup Remove-VirtualSwitch Remove-VirtualSwitchPhysicalNetworkAdapter Remove-VsanDisk Remove-VsanDiskGroup Remove-VsanFaultDomain Remove-VsanIscsiInitiatorGroup Remove-VsanIscsiInitiatorGroupTargetAssociation Remove-VsanIscsiLun Remove-VsanIscsiTarget Remove-vRABusinessGroup Remove-vRACustomForm Remove-vRAExternalNetworkProfile Remove-vRAGroupPrincipal Remove-vRAIcon Remove-vRANATNetworkProfile Remove-vRAPackage Remove-vRAPrincipalFromTenantRole Remove-vRAPropertyDefinition Remove-vRAPropertyGroup Remove-vRAReservation Remove-vRAReservationNetwork Remove-vRAReservationPolicy Remove-vRAReservationStorage Remove-vRARoutedNetworkProfile Remove-vRAService Remove-vRAStorageReservationPolicy Remove-vRATenant Remove-vRATenantDirectory Remove-vRAUserPrincipal Remove-vRNIApplication Remove-vRNIApplicationTier Remove-vRNIDataSource Repair-NsxEdge Repair-VsanObject Request-vRACatalogItem Request-vRAResourceAction Restart-CIVApp Restart-CIVAppGuest Restart-CIVM Restart-CIVMGuest Restart-VM Restart-VMGuest Restart-VMHost Restart-VMHostService Resume-HCXReplication Revoke-NsxSpoofguardNicApproval Save-Module Save-Package Save-Script Search-Cloud Set-AdvancedSetting Set-AlarmDefinition Set-Annotation Set-CDDrive Set-CIAccessControlRule Set-CINetworkAdapter Set-CIVApp Set-CIVAppNetwork Set-CIVAppStartRule Set-CIVAppTemplate Set-Cluster Set-CustomAttribute Set-Datacenter Set-Datastore Set-DatastoreCluster Set-DrsClusterGroup Set-DrsRule Set-DrsVMHostRule Set-FloppyDrive Set-Folder Set-HCXAppliance Set-HCXMigration Set-HCXReplication Set-HardDisk Set-IScsiHbaTarget Set-KeyManagementServer Set-KmsCluster Set-MarkdownOption Set-NetworkAdapter Set-NfsUser Set-NicTeamingPolicy Set-NodeExclusiveResources Set-NodeManager Set-NodeResourceSource Set-NodeResources Set-NsxEdge Set-NsxEdgeBgp Set-NsxEdgeFirewall Set-NsxEdgeInterface Set-NsxEdgeNat Set-NsxEdgeOspf Set-NsxEdgeRouting Set-NsxFirewallGlobalConfiguration Set-NsxFirewallRule Set-NsxFirewallSavedConfiguration Set-NsxFirewallThreshold Set-NsxLoadBalancer Set-NsxLoadBalancerPoolMember Set-NsxLogicalRouter Set-NsxLogicalRouterBgp Set-NsxLogicalRouterBridging Set-NsxLogicalRouterInterface Set-NsxLogicalRouterOspf Set-NsxLogicalRouterRouting Set-NsxManager Set-NsxManagerRole Set-NsxManagerTimeSettings Set-NsxSecurityPolicy Set-NsxSecurityPolicyFirewallRule Set-NsxSslVpn Set-OSCustomizationNicMapping Set-OSCustomizationSpec Set-Org Set-OrgNetwork Set-OrgVdc Set-OrgVdcNetwork Set-PSCurrentConfigurationNode Set-PSDefaultConfigurationDocument Set-PSMetaConfigDocInsProcessedBeforeMeta Set-PSMetaConfigVersionInfoV2 Set-PSReadLineKeyHandler Set-PSReadLineOption Set-PSRepository Set-PSTopConfigurationName Set-PackageSource Set-PowerCLIConfiguration Set-ResourcePool Set-ScsiController Set-ScsiLun Set-ScsiLunPath Set-SecurityPolicy Set-Snapshot Set-SpbmEntityConfiguration Set-SpbmStoragePolicy Set-StatInterval Set-Tag Set-TagCategory Set-Template Set-VAIOFilter Set-VApp Set-VDBlockedPolicy Set-VDPort Set-VDPortgroup Set-VDPortgroupOverridePolicy Set-VDSecurityPolicy Set-VDSwitch Set-VDTrafficShapingPolicy Set-VDUplinkLacpPolicy Set-VDUplinkTeamingPolicy Set-VDVlanConfiguration Set-VDisk Set-VIPermission Set-VIRole Set-VM Set-VMHost Set-VMHostAccount Set-VMHostAdvancedConfiguration Set-VMHostAuthentication Set-VMHostDiagnosticPartition Set-VMHostFirewallDefaultPolicy Set-VMHostFirewallException Set-VMHostFirmware Set-VMHostHba Set-VMHostModule Set-VMHostNetwork Set-VMHostNetworkAdapter Set-VMHostProfile Set-VMHostProfileImageCacheConfiguration Set-VMHostProfileStorageDeviceConfiguration Set-VMHostProfileUserConfiguration Set-VMHostProfileVmPortGroupConfiguration Set-VMHostRoute Set-VMHostService Set-VMHostSnmp Set-VMHostStartPolicy Set-VMHostStorage Set-VMHostSysLogServer Set-VMQuestion Set-VMResourceConfiguration Set-VMStartPolicy Set-VTpm Set-VirtualPortGroup Set-VirtualSwitch Set-VsanClusterConfiguration Set-VsanFaultDomain Set-VsanIscsiInitiatorGroup Set-VsanIscsiLun Set-VsanIscsiTarget Set-vRABusinessGroup Set-vRACatalogItem Set-vRACustomForm Set-vRAEntitlement Set-vRAExternalNetworkProfile Set-vRANATNetworkProfile Set-vRAReservation Set-vRAReservationNetwork Set-vRAReservationPolicy Set-vRAReservationStorage Set-vRARoutedNetworkProfile Set-vRAService Set-vRAStorageReservationPolicy Set-vRATenant Set-vRATenantDirectory Set-vRAUserPrincipal Set-vRNIDataSourceSNMPConfig Show-Markdown Start-CIVApp Start-CIVM Start-HCXMigration Start-HCXReplication Start-SpbmReplicationFailover Start-SpbmReplicationPrepareFailover Start-SpbmReplicationPromote Start-SpbmReplicationReverse Start-SpbmReplicationTestFailover Start-ThreadJob Start-VApp Start-VM Start-VMHost Start-VMHostService Start-VsanClusterDiskUpdate Start-VsanClusterRebalance Start-VsanEncryptionConfiguration Stop-CIVApp Stop-CIVAppGuest Stop-CIVM Stop-CIVMGuest Stop-SpbmReplicationTestFailover Stop-Task Stop-VApp Stop-VM Stop-VMGuest Stop-VMHost Stop-VMHostService Stop-VsanClusterRebalance Suspend-CIVApp Suspend-CIVM Suspend-HCXReplication Suspend-VM Suspend-VMGuest Suspend-VMHost Sync-SpbmReplicationGroup Test-ConflictingResources Test-HCXMigration Test-HCXReplication Test-Json Test-ModuleReloadRequired Test-MofInstanceText Test-NodeManager Test-NodeResourceSource Test-NodeResources Test-ScriptFileInfo Test-VMHostProfileCompliance Test-VMHostSnmp Test-VsanClusterHealth Test-VsanNetworkPerformance Test-VsanStoragePerformance Test-VsanVMCreation Test-vRAPackage Uninstall-Module Uninstall-Package Uninstall-Script Unlock-VM Unregister-PSRepository Unregister-PackageSource Update-ConfigurationDocumentRef Update-ConfigurationErrorCount Update-DependsOn Update-LocalConfigManager Update-Module Update-ModuleManifest Update-ModuleVersion Update-PowerNsx Update-Script Update-ScriptFileInfo Update-Tools Update-VsanHclDatabase ValidateUpdate-ConfigurationData Wait-Debugger Wait-NsxControllerJob Wait-NsxGenericJob Wait-NsxJob Wait-Task Wait-Tools Write-Information Write-Log Write-MetaConfigFile Write-NodeMOFFile",
+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:"Align And Array As Break CallDebugger Case CompilerCase CompilerDefault CompilerElse CompilerElseIf CompilerEndIf CompilerEndSelect CompilerError CompilerIf CompilerSelect CompilerWarning Continue Data DataSection Debug DebugLevel Declare DeclareC DeclareCDLL DeclareDLL DeclareModule Default Define Dim DisableASM DisableDebugger DisableExplicit Else ElseIf EnableASM EnableDebugger EnableExplicit End EndDataSection EndDeclareModule EndEnumeration EndIf EndImport EndInterface EndMacro EndModule EndProcedure EndSelect EndStructure EndStructureUnion EndWith Enumeration EnumerationBinary Extends FakeReturn For ForEach ForEver Global Gosub Goto If Import ImportC IncludeBinary IncludeFile IncludePath Interface List Macro MacroExpandedCount Map Module NewList NewMap Next Not Or Procedure ProcedureC ProcedureCDLL ProcedureDLL ProcedureReturn Protected Prototype PrototypeC ReDim Read Repeat Restore Return Runtime Select Shared Static Step Structure StructureUnion Swap Threaded To UndefineMacro Until Until  UnuseModule UseModule Wend While With XIncludeFile XOr",
+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",
+built_in:"Ellipsis NotImplemented",literal:"False None True"},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]?"}]},h={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,h,{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 h=[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}]}],k=[{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}]}],m={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:k}]}]}]},
+{begin:"\\(\\.\\s~?[a-z$_][0-9a-zA-Z$_]*\\)\\s*=>"}]};h.push(m);var p={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:[p,g,{relevance:0,className:"constructor",begin:"`?[A-Z$_][0-9a-zA-Z$_]*"}]};var l={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:[m,{begin:"\\(",end:"\\)",skip:!0}].concat(h)},{begin:"\\b(`?[A-Z$_][0-9a-zA-Z$_]*\\.)+{",end:"}"}],contains:h};k.push(l);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},p,{className:"operator",begin:d,illegal:"\\-\\->",relevance:0},f,a.C_LINE_COMMENT_MODE,g,m,{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(h)},l]}});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:"abstract as async await become box break const continue crate do dyn else enum extern false final fn for if impl in let loop macro match mod move mut override priv pub ref return self Self static struct super trait true try type typeof unsafe unsized use virtual where while yield",
 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]+"},h={endsWithParent:!0,relevance:0},k={variants:[{begin:/'/},{begin:"`"}],contains:[{begin:"\\(",
+end:"\\)",contains:["self",b,e,d,f,g]}]},m={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?"}};
+m={variants:[{begin:"\\(",end:"\\)"},{begin:"\\[",end:"\\]"}],contains:[{begin:/lambda/,endsWithParent:!0,returnBegin:!0,contains:[m,{begin:/\(/,end:/\)/,endsParent:!0,contains:[f]}]},m,h]};h.contains=[b,d,e,f,g,k,m].concat(a);return{illegal:/\S/,contains:[{className:"meta",begin:"^#!",end:"$"},d,e,g,k,m].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 bias 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 bubble bubbleplot 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 esize 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 forest forestplot 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 funnel funnelplot 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 labbe labbeplot 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 menl meqparse mer merg merge meta 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 trimfill 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.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]},g={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:a.C_NUMBER_RE}],relevance:0},h={className:"subst",begin:"\\$\\{",end:"\\}",keywords:b,contains:[]},k={begin:"html`",
+end:"",starts:{end:"`",returnEnd:!1,contains:[a.BACKSLASH_ESCAPE,h],subLanguage:"xml"}},m={begin:"css`",end:"",starts:{end:"`",returnEnd:!1,contains:[a.BACKSLASH_ESCAPE,h],subLanguage:"css"}},p={className:"string",begin:"`",end:"`",contains:[a.BACKSLASH_ESCAPE,h]};h.contains=[a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,k,m,p,g,a.REGEXP_MODE];return{aliases:["ts"],keywords:b,contains:[{className:"meta",begin:/^\s*['"]use strict['"]/},a.APOS_STRING_MODE,a.QUOTE_STRING_MODE,k,m,p,a.C_LINE_COMMENT_MODE,a.C_BLOCK_COMMENT_MODE,
+g,{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 56f1337..8fe8b14 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.11.8.201904181247-r"
+_JGIT_VERS = "5.1.7.201904200442-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 = "d7bc31008c827e63d33b14c68eb149dd2087e41b",
-        src_sha1 = "111ac9eb58c42673f560fa242ea31aec3d0eb7d3",
+        sha1 = "ef1f744a1117e3d8916f3770486502a56d241b16",
+        src_sha1 = "7bf5b5298f8936e959a92f62b5151d58feb9c00a",
         unsign = True,
     )
     maven_jar(
         name = "jgit-servlet",
         artifact = "org.eclipse.jgit:org.eclipse.jgit.http.server:" + _JGIT_VERS,
         repository = _JGIT_REPO,
-        sha1 = "ceefadfc63548bce8d3eedf8656759cc1c41b1ee",
+        sha1 = "8306e221fb50985247138adb8ffb0f4cd74c5e9a",
         unsign = True,
     )
     maven_jar(
         name = "jgit-archive",
         artifact = "org.eclipse.jgit:org.eclipse.jgit.archive:" + _JGIT_VERS,
         repository = _JGIT_REPO,
-        sha1 = "10565873a029aad92b18908786a0e097df975175",
+        sha1 = "fefb13ab8331cc8b13a15b653b1e057de7d3e514",
     )
     maven_jar(
         name = "jgit-junit",
         artifact = "org.eclipse.jgit:org.eclipse.jgit.junit:" + _JGIT_VERS,
         repository = _JGIT_REPO,
-        sha1 = "b8c33396d6083f357cc5ac820814a55aac17f862",
+        sha1 = "f73f1eacc38f8329d9453f1d0353e82404379a89",
         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 a9e200b..8a9e1ee 100644
--- a/lib/js/npm.bzl
+++ b/lib/js/npm.bzl
@@ -1,11 +1,11 @@
 NPM_VERSIONS = {
     "bower": "1.8.8",
     "crisper": "2.0.2",
-    "vulcanize": "1.14.8",
+    "polymer-bundler": "4.0.2",
 }
 
 NPM_SHA1S = {
     "bower": "82544be34a33aeae7efb8bdf9905247b2cffa985",
     "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/nongoogle_test.sh b/lib/nongoogle_test.sh
new file mode 100755
index 0000000..23b40ad
--- /dev/null
+++ b/lib/nongoogle_test.sh
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# This test ensures that new dependencies in nongoogle.bzl go through LC review.
+
+set -eux
+
+bzl=$(pwd)/tools/nongoogle.bzl
+
+TMP=$(mktemp -d || mktemp -d -t /tmp/tmp.XXXXXX)
+
+grep 'name = "[^"]*"' ${bzl} | sed 's|^[^"]*"||g;s|".*$||g' | sort > $TMP/names
+
+cat << EOF > $TMP/want
+tukaani-xz
+EOF
+
+diff -u $TMP/names $TMP/want
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..1efffdc 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,128 @@
           "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/cache/serialize",
+    "//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:jsr305",
+    "//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..2d3f265
--- /dev/null
+++ b/plugins/codemirror-editor
@@ -0,0 +1 @@
+Subproject commit 2d3f265ab1797d4179cbd6855c937989175d5ce5
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 6285071..d2632b5 160000
--- a/plugins/hooks
+++ b/plugins/hooks
@@ -1 +1 @@
-Subproject commit 628507151abf6b41e6469082765c55781dbd2615
+Subproject commit d2632b5727d481ab72abdb0aa34f25baa340285d
diff --git a/plugins/replication b/plugins/replication
index 9b4b786..bfc9e0f 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit 9b4b786ffdbbe855fe44f8f371e5660b64d94f3e
+Subproject commit bfc9e0f05d1da46118723d846e9e450455d89b74
diff --git a/plugins/reviewnotes b/plugins/reviewnotes
index 951d84b..848e2d9 160000
--- a/plugins/reviewnotes
+++ b/plugins/reviewnotes
@@ -1 +1 @@
-Subproject commit 951d84b32e4f2393dbcf7c319e0d3f617838948c
+Subproject commit 848e2d91a5f9257bf6a92a133f2baf0d563b7462
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 746c9ff..5d0d22f 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..3e99d44 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,200 @@
 (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_USER_DASHBOARD: 'GO_TO_USER_DASHBOARD',
+    GO_TO_OPENED_CHANGES: 'GO_TO_OPENED_CHANGES',
+    GO_TO_MERGED_CHANGES: 'GO_TO_MERGED_CHANGES',
+    GO_TO_ABANDONED_CHANGES: 'GO_TO_ABANDONED_CHANGES',
+    GO_TO_WATCHED_CHANGES: 'GO_TO_WATCHED_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_USER_DASHBOARD, ShortcutSection.EVERYWHERE,
+      'Go to User Dashboard');
+  _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.GO_TO_WATCHED_CHANGES, ShortcutSection.EVERYWHERE,
+      'Go to Watched 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 +304,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/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 267e445..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="initialCommit"
-                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 fa2e388..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.$.initialCommit.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.$.initialCommit.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..b38fab5
--- /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="initialCommit"
+                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..79079f5
--- /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.$.initialCommit.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.$.initialCommit.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..b10c98a 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>
@@ -35,24 +43,34 @@
       <tr id="loading" class$="loadingMsg [[computeLoadingClass(_loading)]]">
         <td>Loading...</td>
       </tr>
-      <template is="dom-repeat" items="[[_auditLog]]"
-          class$="[[computeLoadingClass(_loading)]]">
-        <tr class="table">
-          <td class="date">
-            <gr-date-formatter
-                has-tooltip
-                date-str="[[item.date]]">
-            </gr-date-formatter>
-          </td>
-          <td class="type">[[itemType(item.type)]]</td>
-          <td class="member">
-            <a href$="[[_computeGroupUrl(item.member.group_id)]]">
-              [[_getNameForMember(item.member)]]
-            </a>
-          </td>
-          <td class="by-user">[[_getNameForUser(item.user)]]</td>
-        </tr>
-      </template>
+      <tbody class$="[[computeLoadingClass(_loading)]]">
+        <template is="dom-repeat" items="[[_auditLog]]">
+          <tr class="table">
+            <td class="date">
+              <gr-date-formatter
+                  has-tooltip
+                  date-str="[[item.date]]">
+              </gr-date-formatter>
+            </td>
+            <td class="type">[[itemType(item.type)]]</td>
+            <td class="member">
+              <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">
+              <gr-account-link account="[[item.user]]"></gr-account-link>
+              [[_getIdForUser(item.user)]]
+            </td>
+          </tr>
+        </template>
+      </tbody>
     </table>
     <gr-rest-api-interface id="restAPI"></gr-rest-api-interface>
   </template>
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 a1a5e4e..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,
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 1ef3585..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';
 
@@ -76,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;
 
@@ -192,7 +199,7 @@
 
     _handleSavingIncludedGroups() {
       return this.$.restAPI.saveIncludedGroup(this._groupName,
-          this._includedGroupSearchId, err => {
+          this._includedGroupSearchId.replace(/\+/g, ' '), err => {
             if (err.status === 404) {
               this.dispatchEvent(new CustomEvent('show-alert', {
                 detail: {message: SAVING_ERROR_TEXT},
@@ -216,7 +223,7 @@
     },
 
     _handleDeleteIncludedGroup(e) {
-      const id = decodeURIComponent(e.model.get('item.id'));
+      const id = decodeURIComponent(e.model.get('item.id')).replace(/\+/g, ' ');
       const name = e.model.get('item.name');
       const item = name || id;
       if (!item) { return ''; }
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 170390b..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',
@@ -132,9 +135,6 @@
         getConfig() {
           return Promise.resolve();
         },
-        getGroupConfig() {
-          return Promise.resolve(groups);
-        },
         getGroupMembers() {
           return Promise.resolve(groupMembers);
         },
@@ -151,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();
     });
 
@@ -321,6 +324,12 @@
       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));
 
@@ -335,5 +344,23 @@
           '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..460a9d9 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) {
@@ -113,10 +196,11 @@
       });
 
       for (const key of keys) {
-        if (!values[key]) { return; }
+        let text = values[key];
+        if (!text) { text = ''; }
         // The value from the server being used to choose which item is
         // selected is in integer form, so this must be converted.
-        valuesArr.push({value: parseInt(key, 10), text: values[key]});
+        valuesArr.push({value: parseInt(key, 10), text});
       }
       return valuesArr;
     },
@@ -164,21 +248,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..5bc700b
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
@@ -0,0 +1,470 @@
+/**
+ * @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 = 50;
+
+  /**
+   * 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]);
+            /**
+             * As add / delete both can happen in the new section,
+             * so here to make sure it will remove the deleted ones.
+             * @see Issue 11339
+             */
+            this._recursivelyRemoveDeleted(addRemoveObj.add[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..6fa36a5
--- /dev/null
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
@@ -0,0 +1,1167 @@
+<!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('_recursivelyUpdateAddRemoveObj on new added section', () => {
+        const obj = {
+          'refs/for/*': {
+            permissions: {
+              'label-Code-Review': {
+                rules: {
+                  e798fed07afbc9173a587f876ef8760c78d240c1: {
+                    min: -2,
+                    max: 2,
+                    action: 'ALLOW',
+                    added: true,
+                  },
+                },
+                added: true,
+                label: 'Code-Review',
+              },
+              'labelAs-Code-Review': {
+                rules: {
+                  'ldap:gerritcodereview-eng': {
+                    min: -2,
+                    max: 2,
+                    action: 'ALLOW',
+                    added: true,
+                    deleted: true,
+                  },
+                },
+                added: true,
+                label: 'Code-Review',
+              },
+            },
+            added: true,
+          },
+        };
+
+        const expectedResult = {
+          add: {
+            'refs/for/*': {
+              permissions: {
+                'label-Code-Review': {
+                  rules: {
+                    e798fed07afbc9173a587f876ef8760c78d240c1: {
+                      min: -2,
+                      max: 2,
+                      action: 'ALLOW',
+                      added: true,
+                    },
+                  },
+                  added: true,
+                  label: 'Code-Review',
+                },
+                'labelAs-Code-Review': {
+                  rules: {},
+                  added: true,
+                  label: 'Code-Review',
+                },
+              },
+              added: true,
+            },
+          },
+          remove: {},
+        };
+        const updateObj = {add: {}, remove: {}};
+        element._recursivelyUpdateAddRemoveObj(obj, updateObj);
+        assert.deepEqual(updateObj, 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 568578c..6accdfc 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");
@@ -22,34 +23,12 @@
 <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">
 
 <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..bf3ac4a 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,49 @@
 
     _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));
 
       const title = change.subject + ' (' + change.change_id.substr(0, 9) + ')';
       this.fire('title-change', {title});
     },
 
+    /**
+     * Gets base patch number, if it is a parent try and decide from
+     * preference weather to default to `auto merge`, `Parent 1` or `PARENT`.
+     * @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';
+
+      if (parentCount > 1 && preferFirst && !patchRange.patchNum) {
+        return -1;
+      }
+
+      return 'PARENT';
+    },
+
     _computeChangeUrl(change) {
       return Gerrit.Nav.getUrlForChange(change);
     },
@@ -769,7 +939,7 @@
       return label;
     },
 
-    _handleAKey(e) {
+    _handleOpenReplyDialog(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) {
         return;
@@ -781,11 +951,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 +963,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 +985,7 @@
       this.$.changeStar.toggleStar();
     },
 
-    _handleUKey(e) {
+    _handleUpToDashboard(e) {
       if (this.shouldSuppressKeyboardShortcut(e) ||
           this.modifierPressed(e)) { return; }
 
@@ -815,23 +993,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 +1018,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 +1055,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 +1077,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 +1092,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 +1149,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 +1172,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 +1193,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 +1248,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 +1390,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 +1422,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 +1525,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 +1563,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 +1616,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..d364ee0 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,78 @@
       });
     });
 
+    test('_getBasePatchNum', () => {
+      const _change = {
+        _number: 42,
+        revisions: {
+          '98da160735fb81604b4c40e93c368f380539dd0e': {
+            _number: 1,
+            commit: {
+              parents: [],
+            },
+          },
+        },
+      };
+      const _patchRange = {
+        basePatchNum: 'PARENT',
+      };
+      assert.equal(element._getBasePatchNum(_change, _patchRange), 'PARENT');
+
+      element._prefs = {
+        default_base_for_merges: 'FIRST_PARENT',
+      };
+
+      const _change2 = {
+        _number: 42,
+        revisions: {
+          '98da160735fb81604b4c40e93c368f380539dd0e': {
+            _number: 1,
+            commit: {
+              parents: [
+                {
+                  commit: '6e12bdf1176eb4ab24d8491ba3b6d0704409cde8',
+                  subject: 'test',
+                },
+                {
+                  commit: '22f7db4754b5d9816fc581f3d9a6c0ef8429c841',
+                  subject: 'test3',
+                },
+              ],
+            },
+          },
+        },
+      };
+      assert.equal(element._getBasePatchNum(_change2, _patchRange), -1);
+
+      _patchRange.patchNum = 1;
+      assert.equal(element._getBasePatchNum(_change2, _patchRange), 'PARENT');
+    });
+
+    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 +1100,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 +1139,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 +1200,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 +1216,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 +1249,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', () => {
@@ -946,7 +1289,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 +1304,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 +1334,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 +1350,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 +1367,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 +1376,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 +1386,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 +1402,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 +1480,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 +1509,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 +1560,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..85f316c 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 initialized.
+      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 initialized.
+      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..be03b23 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,55 @@
         overflow: hidden;
         text-overflow: ellipsis;
       }
-      .collapsed .date {
+      .collapsed .dateContainer {
         position: static;
       }
       .collapsed .author {
-        color: var(--default-text-color);
+        overflow: hidden;
+        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 +179,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 +192,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 +201,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 +218,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..b75b93a 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 initialized.
+      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 initialized.
+      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..bd340f0 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,37 @@
           </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-endpoint-decorator
+            class="hideOnMobile"
+            name="header-small-banner"></gr-endpoint-decorator>
+        <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..65757c7 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,26 @@
           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).filter(link => {
+          // Ignore GWT project links
+          return !link.url.includes('${projectName}');
+        });
+        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 +240,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 +277,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,11 +309,6 @@
       // 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
-      // whether they correspond to any client routes. Mark all such links as
-      // external.
-      linkObj.external = true;
-
       return linkObj;
     },
 
@@ -232,5 +316,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..5df5444 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,13 +53,41 @@
       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), [
-        {url: 'https://awesometown.com/#hashyhash', external: true},
-        {url: 'url', external: true},
+      ].map(element._fixCustomMenuItem), [
+        {url: 'https://awesometown.com/#hashyhash'},
+        {url: 'url'},
       ]);
     });
 
@@ -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,200 @@
         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',
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }],
+      }]);
+    });
+
+    test('ignore top project menus', () => {
+      const adminLinks = [{
+        name: 'Repos',
+        url: '/repos',
+      }];
+      const topMenus = [{
+        name: 'Projects',
+        items: [{
+          name: 'Project Settings',
+          target: '_blank',
+          url: '/plugins/myplugin/${projectName}',
+        }, {
+          name: 'Project List',
+          target: '_blank',
+          url: '/plugins/myplugin/index.html',
+        }],
+      }];
+      assert.deepEqual(element._computeLinks([], [], adminLinks, topMenus), [{
+        title: 'Browse',
+        links: adminLinks,
+      },
+      {
+        title: 'Projects',
+        links: [{
+          name: 'Project List',
+          url: '/plugins/myplugin/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',
+          url: 'https://gerrit/plugins/plugin-manager/static/index.html',
+        }, {
+          name: 'Create',
+          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',
+          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',
+          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',
+          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..c0ef3ac 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,41 @@
       },
 
       /**
+       * 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));
+      },
+
+      /**
+       * Navigate to the user's dashboard
+       */
+      navigateToUserDashboard() {
+        return this._navigate(this.getUrlForUserDashboard('self'));
+      },
+
+      /**
        * @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 +374,8 @@
           project: change.project,
           patchNum: opt_patchNum,
           basePatchNum: opt_basePatchNum,
+          edit: opt_isEdit,
+          host: change.internalHost || undefined,
         });
       },
 
@@ -207,10 +399,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 +412,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 +453,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 +514,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 +547,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..1e6efa1 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,13 @@
         type: Object,
         value: app,
       },
+      _isRedirecting: Boolean,
+      // This variable is to differentiate between internal navigation (false)
+      // and for first navigation in app after loaded from server (true).
+      _isInitialLoad: {
+        type: Boolean,
+        value: true,
+      },
     },
 
     behaviors: [
@@ -194,74 +235,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 +271,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 +542,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 +571,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 +669,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 +682,34 @@
         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;
+        this._isInitialLoad = 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 +717,6 @@
             hash: window.location.hash,
             pathname: window.location.pathname,
           });
-          reporting.locationChanged();
         }, 1);
         next();
       });
@@ -470,6 +725,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 +750,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 +786,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 +813,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 +822,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 +834,9 @@
 
       this._mapRoute(RoutePattern.AGREEMENTS, '_handleAgreementsRoute', true);
 
+      this._mapRoute(RoutePattern.NEW_AGREEMENTS, '_handleNewAgreementsRoute',
+          true);
+
       this._mapRoute(RoutePattern.SETTINGS_LEGACY,
           '_handleSettingsLegacyRoute', true);
 
@@ -578,6 +849,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 +910,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 +977,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 +1091,48 @@
       });
     },
 
-    _handleGroupRoute(data) {
+    _handleProjectsOldRoute(data) {
+      let params = '';
+      if (data.params[1]) {
+        params = encodeURIComponent(data.params[1]);
+        if (data.params[1].includes(',')) {
+          params =
+              encodeURIComponent(data.params[1]).replace('%2C', ',');
+        }
+      }
+
+      this._redirect(`/admin/repos/${params}`);
+    },
+
+    _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 +1140,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 +1150,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 +1169,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 +1179,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,
       });
     },
@@ -818,7 +1216,7 @@
     _handleCreateProjectRoute(data) {
       // Redirects the legacy route to the new route, which displays the project
       // list with a hash 'create'.
-      this._redirect('/admin/projects#create');
+      this._redirect('/admin/repos#create');
     },
 
     _handleCreateGroupRoute(data) {
@@ -827,11 +1225,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 +1265,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 +1281,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 +1302,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 +1321,7 @@
         basePatchNum: ctx.params[3],
         patchNum: ctx.params[5],
         view: Gerrit.Nav.View.CHANGE,
+        querystring: ctx.querystring,
       };
 
       this._normalizeLegacyRouteParams(params);
@@ -954,11 +1355,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,20 +1382,28 @@
         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);
     },
 
     _handleSettingsLegacyRoute(data) {
+      // email tokens may contain '+' but no space.
+      // The parameter parsing replaces all '+' with a space,
+      // undo that to have valid tokens.
+      const token = data.params[0].replace(/ /g, '+');
       this._setParams({
         view: Gerrit.Nav.View.SETTINGS,
-        emailToken: data.params[0],
+        emailToken: token,
       });
     },
 
@@ -1020,10 +1441,48 @@
       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() {
+      if (this._isInitialLoad) {
+        // Server recognized this route as polygerrit, so we show 404.
+        this._show404();
+      } else {
+        // Route can be recognized by server, so we pass it to server.
+        this._handlePassThroughRoute();
+      }
+    },
+
+    _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..a907db2 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,22 +622,13 @@
           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);
-        });
       });
     });
 
     suite('route handlers', () => {
       let redirectStub;
       let setParamsStub;
+      let handlePassThroughRoute;
 
       // Simple route handlers are direct mappings from parsed route data to a
       // new set of app.params. This test helper asserts that passing `data`
@@ -423,17 +641,18 @@
       setup(() => {
         redirectStub = sandbox.stub(element, '_redirect');
         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);
+        handlePassThroughRoute = sandbox.stub(element, '_handlePassThroughRoute');
       });
 
       test('_handleAgreementsRoute', () => {
-        element._handleAgreementsRoute({params: {}});
+        const data = {params: {}};
+        element._handleAgreementsRoute(data);
+        assert.isTrue(redirectStub.calledOnce);
+        assert.equal(redirectStub.lastCall.args[0], '/settings/#Agreements');
+      });
+
+      test('_handleNewAgreementsRoute', () => {
+        element._handleNewAgreementsRoute({params: {}});
         assert.isTrue(setParamsStub.calledOnce);
         assert.equal(setParamsStub.lastCall.args[0].view,
             Gerrit.Nav.View.AGREEMENTS);
@@ -447,6 +666,14 @@
         });
       });
 
+      test('_handleSettingsLegacyRoute with +', () => {
+        const data = {params: {0: 'my-token test'}};
+        assertDataToParams(data, '_handleSettingsLegacyRoute', {
+          view: Gerrit.Nav.View.SETTINGS,
+          emailToken: 'my-token+test',
+        });
+      });
+
       test('_handleSettingsRoute', () => {
         const data = {};
         assertDataToParams(data, '_handleSettingsRoute', {
@@ -454,7 +681,7 @@
         });
       });
 
-      test('_handleDefaultRoute', () => {
+      test('_handleDefaultRoute on first load', () => {
         element._app = {dispatchEvent: sinon.stub()};
         element._handleDefaultRoute();
         assert.isTrue(element._app.dispatchEvent.calledOnce);
@@ -463,6 +690,27 @@
             404);
       });
 
+      test('_handleDefaultRoute after internal navigation', () => {
+        let onExit = null;
+        const onRegisteringExit = (match, _onExit) => {
+          onExit = _onExit;
+        };
+        sandbox.stub(window.page, 'exit', onRegisteringExit);
+        sandbox.stub(Gerrit.Nav, 'setup');
+        sandbox.stub(window.page, 'start');
+        sandbox.stub(window.page, 'base');
+        sandbox.stub(window, 'page');
+        element._startRouter();
+
+        element._app = {dispatchEvent: sinon.stub()};
+        element._handleDefaultRoute();
+
+        onExit('', () => {}); // we left page;
+
+        element._handleDefaultRoute();
+        assert.isTrue(handlePassThroughRoute.calledOnce);
+      });
+
       test('_handleImproperlyEncodedPlusRoute', () => {
         // Regression test for Issue 7100.
         element._handleImproperlyEncodedPlusRoute(
@@ -480,6 +728,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 +802,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 +912,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 +935,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 +951,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 +1035,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 +1044,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 +1101,58 @@
         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('_handleProjectsOldRoute', () => {
+          const data = {params: {}};
+          element._handleProjectsOldRoute(data);
+          assert.isTrue(redirectStub.calledOnce);
+          assert.equal(redirectStub.lastCall.args[0], '/admin/repos/');
+        });
+
+        test('_handleProjectsOldRoute test', () => {
+          const data = {params: {1: 'test'}};
+          element._handleProjectsOldRoute(data);
+          assert.isTrue(redirectStub.calledOnce);
+          assert.equal(redirectStub.lastCall.args[0], '/admin/repos/test');
+        });
+
+        test('_handleProjectsOldRoute test,branches', () => {
+          const data = {params: {1: 'test,branches'}};
+          element._handleProjectsOldRoute(data);
+          assert.isTrue(redirectStub.calledOnce);
+          assert.equal(
+              redirectStub.lastCall.args[0], '/admin/repos/test,branches');
+        });
+
+        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 +1160,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 +1203,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 +1373,7 @@
               null, // 4 Unused
               9, // 5 Patch number
             ],
+            querystring: '',
           };
           element._handleChangeLegacyRoute(ctx);
           assert.isTrue(normalizeRouteStub.calledOnce);
@@ -1052,6 +1382,7 @@
             basePatchNum: 6,
             patchNum: 9,
             view: Gerrit.Nav.View.CHANGE,
+            querystring: '',
           });
         });
 
@@ -1100,7 +1431,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 +1511,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 +1545,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 +1554,7 @@
             changeNum: 1234,
             view: Gerrit.Nav.View.EDIT,
             path: 'foo/bar/baz',
+            patchNum: 3,
           };
 
           element._handleDiffEditRoute(ctx);
@@ -1197,6 +1564,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 05e5dd4..0ed2db2 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 7f77ad0..9613df8 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,36 +176,47 @@
         display: inline-block;
       }
       .tab-indicator:before {
-        color: #C62828;
+        color: var(--diff-tab-indicator-color);
         /* >> character */
         content: '\00BB';
         position: absolute;
       }
-      .trailing-whitespace {
+      /* Is defined after other background-colors, such that this
+         rule wins in case of same specificity. */
+      .trailing-whitespace,
+      .content .trailing-whitespace,
+      .trailing-whitespace .intraline,
+      .content .trailing-whitespace .intraline {
         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;
@@ -222,7 +224,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;
       }
@@ -245,8 +247,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"
@@ -254,24 +276,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]]"
@@ -280,10 +307,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
@@ -292,7 +325,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..f66fea4 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,14 +63,30 @@
      * @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,
+      path: {
+        type: String,
+        observer: '_pathObserver',
+      },
       prefs: {
         type: Object,
         observer: '_prefsObserver',
@@ -69,20 +102,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 +123,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 +176,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 +217,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 +246,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 +297,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 +321,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 +340,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 +377,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 +385,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 +408,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 +485,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 +504,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 +520,7 @@
       const side = e.detail.comment.__commentSide;
       const idx = this._findDraftIndex(comment, side);
       this.set(['comments', side, idx], comment);
+      this._handleCommentSaveOrDiscard();
     },
 
     /**
@@ -535,10 +589,26 @@
       }
     },
 
+    _pathObserver() {
+      // Call _prefsChanged(), because line-limit style value depends on path.
+      this._prefsChanged(this.prefs);
+    },
+
     _viewModeObserver() {
       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 +616,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 +639,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 +678,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 +692,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 +707,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 +721,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..99d22c6 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 initialized.
+      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 0c3dabb..d4975ca 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,8 +19,17 @@
   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">
@@ -35,9 +45,10 @@
 
 <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">
@@ -48,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>
 
@@ -61,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 {
         /**
@@ -76,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);
@@ -111,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-endpoint-decorator name="banner"></gr-endpoint-decorator>
@@ -139,8 +158,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
@@ -154,11 +173,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]]"
@@ -169,8 +192,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>
@@ -187,8 +220,10 @@
       </div>
       <div>
         <a class="feedback"
-            href="https://bugs.chromium.org/p/gerrit/issues/entry?template=PolyGerrit%20Issue"
-            rel="noopener" target="_blank">Send feedback</a>
+            href$="[[_feedbackUrl]]"
+            rel="noopener"
+            target="_blank"
+            hidden$="[[!_showFeedbackUrl(_feedbackUrl)]]">Send feedback</a>
         <template is="dom-if" if="[[_computeShowGwtUiLink(_serverConfig)]]">
           |
           <a id="gwtLink" href$="[[computeGwtUrl(_path)]]" rel="external">Switch to Old UI</a>
@@ -202,8 +237,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>
@@ -216,6 +253,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..6865b87 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,24 @@
       _lastSearchPage: String,
       _path: String,
       _isShadowDom: Boolean,
+      _pluginScreenName: {
+        type: String,
+        computed: '_computePluginScreenName(params)',
+      },
+      _settingsUrl: String,
+      _feedbackUrl: String,
     },
 
     listeners: {
       'page-error': '_handlePageError',
       'title-change': '_handleTitleChange',
       'location-change': '_handleLocationChange',
+      'rpc-log': '_handleRpcLog',
     },
 
     observers: [
       '_viewChanged(params.view)',
+      '_paramsChanged(params.*)',
     ],
 
     behaviors: [
@@ -80,8 +105,19 @@
       Gerrit.KeyboardShortcutBehavior,
     ],
 
-    keyBindings: {
-      '?': '_showKeyboardShortcuts',
+    keyboardShortcuts() {
+      return {
+        [this.Shortcut.OPEN_SHORTCUT_HELP_DIALOG]: '_showKeyboardShortcuts',
+        [this.Shortcut.GO_TO_USER_DASHBOARD]: '_goToUserDashboard',
+        [this.Shortcut.GO_TO_OPENED_CHANGES]: '_goToOpenedChanges',
+        [this.Shortcut.GO_TO_MERGED_CHANGES]: '_goToMergedChanges',
+        [this.Shortcut.GO_TO_ABANDONED_CHANGES]: '_goToAbandonedChanges',
+        [this.Shortcut.GO_TO_WATCHED_CHANGES]: '_goToWatchedChanges',
+      };
+    },
+
+    created() {
+      this._bindKeyboardShortcuts();
     },
 
     ready() {
@@ -93,12 +129,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 +172,133 @@
       };
     },
 
+    _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_USER_DASHBOARD, this.GO_KEY, 'i');
+      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.GO_TO_WATCHED_CHANGES, this.GO_KEY, 'w');
+
+      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 +310,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 +345,7 @@
         '_showChangeView',
         '_showDiffView',
         '_showSettingsView',
+        '_showAdminView',
       ];
       for (const showProp of props) {
         this.set(showProp, false);
@@ -188,15 +373,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 +409,67 @@
 
     _handleRegistrationDialogClose(e) {
       this.params.justRegistered = false;
-      this.$.registration.close();
+      this.$.registrationOverlay.close();
     },
 
     _computeShadowClass(isShadowDom) {
       return isShadowDom ? 'shadow' : '';
     },
+
+    _goToUserDashboard() {
+      Gerrit.Nav.navigateToUserDashboard();
+    },
+
+    _goToOpenedChanges() {
+      Gerrit.Nav.navigateToStatusSearch('open');
+    },
+
+    _goToMergedChanges() {
+      Gerrit.Nav.navigateToStatusSearch('merged');
+    },
+
+    _goToAbandonedChanges() {
+      Gerrit.Nav.navigateToStatusSearch('abandoned');
+    },
+
+    _goToWatchedChanges() {
+      // The query is hardcoded, and doesn't respect custom menu entries
+      Gerrit.Nav.navigateToSearchQuery('is:watched is:open');
+    },
+
+    _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);
+    },
+
+    _showFeedbackUrl(feedbackUrl) {
+      if (feedbackUrl) {
+        return feedbackUrl;
+      }
+
+      return false;
+    },
   });
 })();
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..82f8f37 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;
+      const name = plugin.getPluginName() + '.' + moduleName;
+      if (this._initializedPlugins.get(name)) {
+        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 ' + name);
       }
-      this._domHooks.set(el, domHook);
+      this._initializedPlugins.set(name, 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..2e9b266 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,115 @@
       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('two modules', done => {
+      plugin.registerCustomComponent('banana', 'mod-one');
+      plugin.registerCustomComponent('banana', 'mod-two');
+      flush(() => {
+        const element =
+            container.querySelector('gr-endpoint-decorator[name="banana"]');
+        const module1 = Polymer.dom(element.root).children.find(
+            element => element.nodeName === 'MOD-ONE');
+        assert.isOk(module1);
+        const module2 = Polymer.dom(element.root).children.find(
+            element => element.nodeName === 'MOD-TWO');
+        assert.isOk(module2);
+        done();
+      });
+    });
+
+    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 abb5cc0..003e471 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,17 +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..73aa65f
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.html
@@ -0,0 +1,106 @@
+<!--
+@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="../../../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">
+      tr th.emailAddressHeader,
+      tr th.identityHeader {
+        width: 15em;
+        padding: 0 10px;
+      }
+      tr td.statusColumn,
+      tr td.emailAddressColumn,
+      tr td.identityColumn {
+        word-break: break-word;
+      }
+      tr td.emailAddressColumn,
+      tr td.identityColumn {
+        padding: 4px 10px;
+        width: 15em;
+      }
+      .deleteButton {
+        float: right;
+      }
+      .deleteButton:not(.show) {
+        display: none;
+      }
+      .space {
+        margin-bottom: 1em;
+      }
+    </style>
+    <div class="gr-form-styles">
+      <fieldset class="space">
+        <table>
+          <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 class="emailAddressColumn">[[item.email_address]]</td>
+                <td class="identityColumn">[[_computeIdentity(item.identity)]]</td>
+                <td class="deleteColumn">
+                  <gr-button
+                      class$="deleteButton [[_computeHideDeleteClass(item.can_delete)]]"
+                      on-tap="_handleDeleteItem">
+                    Delete
+                  </gr-button>
+                </td>
+              </tr>
+            </template>
+          </tbody>
+        </table>
+      </fieldset>
+      <dom-if if="[[_showLinkAnotherIdentity]]">
+        <fieldset>
+          <a href$="[[_computeLinkAnotherIdentity()]]">
+            <gr-button id="linkAnotherIdentity" link>Link Another Identity</gr-button>
+          </a>
+        </fieldset>
+      </dom-if>
+    </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..c927f1e
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities.js
@@ -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.
+ */
+(function() {
+  'use strict';
+
+  const AUTH = [
+    'OPENID',
+    'OAUTH',
+  ];
+
+  Polymer({
+    is: 'gr-identities',
+
+    properties: {
+      _identities: Object,
+      _idName: String,
+      serverConfig: Object,
+      _showLinkAnotherIdentity: {
+        type: Boolean,
+        computed: '_computeShowLinkAnotherIdentity(serverConfig)',
+      },
+    },
+
+    behaviors: [
+      Gerrit.BaseUrlBehavior,
+    ],
+
+    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:');
+    },
+
+    _computeShowLinkAnotherIdentity(config) {
+      if (config && config.auth &&
+          config.auth.git_basic_auth_policy) {
+        return AUTH.includes(
+            config.auth.git_basic_auth_policy.toUpperCase());
+      }
+
+      return false;
+    },
+
+    _computeLinkAnotherIdentity() {
+      const baseUrl = this.getBaseUrl() || '';
+      let pathname = window.location.pathname;
+      if (baseUrl) {
+        pathname = '/' + pathname.substring(baseUrl.length);
+      }
+      return baseUrl + '/login/' + encodeURIComponent(pathname) + '?link';
+    },
+  });
+})();
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..5468d27
--- /dev/null
+++ b/polygerrit-ui/app/elements/settings/gr-identities/gr-identities_test.html
@@ -0,0 +1,186 @@
+<!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);
+    });
+
+    test('_computeShowLinkAnotherIdentity', () => {
+      let serverConfig;
+
+      serverConfig = {
+        auth: {
+          git_basic_auth_policy: 'OAUTH',
+        },
+      };
+      assert.isTrue(element._computeShowLinkAnotherIdentity(serverConfig));
+
+      serverConfig = {
+        auth: {
+          git_basic_auth_policy: 'OpenID',
+        },
+      };
+      assert.isTrue(element._computeShowLinkAnotherIdentity(serverConfig));
+
+      serverConfig = {
+        auth: {
+          git_basic_auth_policy: 'HTTP_LDAP',
+        },
+      };
+      assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));
+
+      serverConfig = {
+        auth: {
+          git_basic_auth_policy: 'LDAP',
+        },
+      };
+      assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));
+
+      serverConfig = {
+        auth: {
+          git_basic_auth_policy: 'HTTP',
+        },
+      };
+      assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));
+
+      serverConfig = {};
+      assert.isFalse(element._computeShowLinkAnotherIdentity(serverConfig));
+    });
+
+    test('_showLinkAnotherIdentity', () => {
+      element.serverConfig = {
+        auth: {
+          git_basic_auth_policy: 'OAUTH',
+        },
+      };
+
+      assert.isTrue(element._showLinkAnotherIdentity);
+
+      element.serverConfig = {
+        auth: {
+          git_basic_auth_policy: 'LDAP',
+        },
+      };
+
+      assert.isFalse(element._showLinkAnotherIdentity);
+    });
+  });
+</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 20fe151..3330bd2 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>
@@ -414,10 +400,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" server-config="[[_serverConfig]]"></gr-identities>
+        </fieldset>
         <template is="dom-if" if="[[_serverConfig.auth.use_contributor_agreements]]">
           <h2 id="Agreements">Agreements</h2>
           <fieldset>
@@ -494,6 +492,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 fdc071b..23808ff 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...';
+
   const HTTP_AUTH = [
     'HTTP',
     'HTTP_LDAP',
@@ -48,7 +55,7 @@
      */
 
     /**
-     * Fired with email confirmation text.
+     * Fired with email confirmation text, or when the page reloads.
      *
      * @event show-alert
      */
@@ -64,8 +71,6 @@
       },
       _accountNameMutable: Boolean,
       _accountInfoChanged: Boolean,
-      /** @type {?} */
-      _diffPrefs: Object,
       _changeTableColumnsNotDisplayed: Array,
       /** @type {?} */
       _localPrefs: {
@@ -92,10 +97,10 @@
         type: Boolean,
         value: false,
       },
-      _diffPrefsChanged: {
-        type: Boolean,
-        value: false,
-      },
+      /** @type {?} */
+      _diffPrefsChanged: Boolean,
+      /** @type {?} */
+      _editPrefsChanged: Boolean,
       _menuChanged: {
         type: Boolean,
         value: false,
@@ -108,6 +113,10 @@
         type: Boolean,
         value: false,
       },
+      _gpgKeysChanged: {
+        type: Boolean,
+        value: false,
+      },
       _newEmail: String,
       _addingEmail: {
         type: Boolean,
@@ -129,6 +138,11 @@
       _loadingPromise: Object,
 
       _showNumber: Boolean,
+
+      _isDark: {
+        type: Boolean,
+        value: false,
+      },
     },
 
     behaviors: [
@@ -138,7 +152,6 @@
 
     observers: [
       '_handlePrefsChanged(_localPrefs.*)',
-      '_handleDiffPrefsChanged(_diffPrefs.*)',
       '_handleMenuChanged(_localMenu.splices)',
       '_handleChangeTableChanged(_localChangeTableColumns, _showNumber)',
     ],
@@ -149,10 +162,15 @@
       this.listen(window, 'location-change', '_handleLocationChange');
       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.$.identities.loadData(),
+        this.$.editPrefs.loadData(),
+        this.$.diffPrefs.loadData(),
       ];
 
       promises.push(this.$.restAPI.getPreferences().then(prefs => {
@@ -163,18 +181,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; }));
@@ -249,7 +269,7 @@
     },
 
     _cloneChangeTableColumns() {
-      let columns = this.prefs.change_table;
+      let columns = this.getVisibleColumns(this.prefs.change_table);
 
       if (columns.length === 0) {
         columns = this.columnNames;
@@ -277,14 +297,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() {
@@ -318,24 +338,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);
@@ -346,10 +348,11 @@
     },
 
     _handleSaveDiffPreferences() {
-      return this.$.restAPI.saveDiffPreferences(this._diffPrefs)
-          .then(() => {
-            this._diffPrefsChanged = false;
-          });
+      this.$.diffPrefs.save();
+    },
+
+    _handleSaveEditPreferences() {
+      this.$.editPrefs.save();
     },
 
     _handleSaveMenu() {
@@ -422,6 +425,21 @@
       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);
+    },
+
     _showHttpAuth(config) {
       if (config && config.auth &&
           config.auth.git_basic_auth_policy) {
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 1160774..506c6af 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..85fe368 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,9 @@
                   id="newProject"
                   query="[[_query]]"
                   threshold="1"
-                  placeholder="Project"></gr-autocomplete>
+                  allow-non-suggested-values
+                  tab-complete
+                  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..e751ea3 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';
 
@@ -107,8 +110,11 @@
       this.hasUnsavedChanges = true;
     },
 
-    _canAddProject(project, filter) {
-      if (!project || !project.id) { return false; }
+    _canAddProject(project, text, filter) {
+      if ((!project || !project.id) && !text) { return false; }
+
+      // This will only be used if not using the auto complete
+      if (!project && text) { return true; }
 
       // Check if the project with filter is already in the list. Compare
       // filters using == to coalesce null and undefined.
@@ -139,7 +145,7 @@
       const newProjectName = this.$.newProject.text;
       const filter = this.$.newFilter.value || null;
 
-      if (!this._canAddProject(newProject, filter)) { return; }
+      if (!this._canAddProject(newProject, newProjectName, filter)) { return; }
 
       const insertIndex = this._getNewProjectIndex(newProjectName, filter);
 
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..9022bcc 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");
@@ -131,25 +132,28 @@
     });
 
     test('_canAddProject', () => {
-      assert.isFalse(element._canAddProject(null, null));
-      assert.isFalse(element._canAddProject({}, null));
+      assert.isFalse(element._canAddProject(null, null, null));
+      assert.isFalse(element._canAddProject({}, null, null));
 
       // Can add a project that is not in the list.
-      assert.isTrue(element._canAddProject({id: 'project d'}, null));
-      assert.isTrue(element._canAddProject({id: 'project d'}, 'filter 3'));
+      assert.isTrue(element._canAddProject({id: 'project d'}, null, null));
+      assert.isTrue(element._canAddProject({id: 'project d'}, null, 'filter 3'));
 
       // Cannot add a project that is in the list with no filter.
-      assert.isFalse(element._canAddProject({id: 'project a'}, null));
+      assert.isFalse(element._canAddProject({id: 'project a'}, null, null));
 
       // Can add a project that is in the list if the filter differs.
-      assert.isTrue(element._canAddProject({id: 'project a'}, 'filter 4'));
+      assert.isTrue(element._canAddProject({id: 'project a'}, null, 'filter 4'));
 
       // Cannot add a project that is in the list with the same filter.
-      assert.isFalse(element._canAddProject({id: 'project b'}, 'filter 1'));
-      assert.isFalse(element._canAddProject({id: 'project b'}, 'filter 2'));
+      assert.isFalse(element._canAddProject({id: 'project b'}, null, 'filter 1'));
+      assert.isFalse(element._canAddProject({id: 'project b'}, null, 'filter 2'));
 
       // Can add a project that is in the list using a new filter.
-      assert.isTrue(element._canAddProject({id: 'project b'}, 'filter 3'));
+      assert.isTrue(element._canAddProject({id: 'project b'}, null, 'filter 3'));
+
+      // Can add a project that is not added by the auto complete
+      assert.isTrue(element._canAddProject(null, 'test', null));
     });
 
     test('_getNewProjectIndex', () => {
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..1c9f469
--- /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..36fdf5b
--- /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..5bd72c4
--- /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 0bd6e6d..af70e37 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");
@@ -19,7 +20,7 @@
 <link rel="import" href="../../../styles/shared-styles.html">
 <link rel="import" href="../../core/gr-navigation/gr-navigation.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 f9b663c..e644806 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: {
@@ -77,27 +79,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');
@@ -110,23 +112,23 @@
       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('Change-Id pattern was parsed and linked with base url', function() {
+    test('Change-Id pattern was parsed and linked with base url', () => {
       window.CANONICAL_PATH = '/r';
 
       // "Change-Id:" pattern.
@@ -144,10 +146,10 @@
       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,
@@ -160,22 +162,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);
 
@@ -188,22 +190,22 @@
       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('html with base url', function() {
+    test('html with base url', () => {
       window.CANONICAL_PATH = '/r';
 
       element.content = 'test foo';
@@ -212,7 +214,7 @@
       assert.equal(linkEl.textContent, 'foo');
     });
 
-    test('hash html with base url', function() {
+    test('hash html with base url', () => {
       window.CANONICAL_PATH = '/r';
 
       element.content = 'hash:foo';
@@ -221,26 +223,51 @@
       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+)',
@@ -252,7 +279,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');
@@ -264,31 +291,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 1afcc30..42011b2 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,217 +1,337 @@
-// Copyright (C) 2015 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT 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;
-  this.baseUrl = Gerrit.BaseUrlBehavior.getBaseUrl();
-  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;
+    this.baseUrl = Gerrit.BaseUrlBehavior.getBaseUrl();
+    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)) {
-    if (!!this.baseUrl && href.startsWith('/') &&
-          !href.startsWith(this.baseUrl)) {
-      href = this.baseUrl + href;
-    }
-    this.addItem(text, href, null, position, length, outputArray);
-  }
-};
-
-GrLinkTextParser.prototype.addHTML =
-    function(html, position, length, outputArray) {
-  if (!this.hasOverlap(position, length, outputArray)) {
-    if (!!this.baseUrl && html.match(/<a href=\"\//g) &&
-         !new RegExp(`^<a href="${this.baseUrl}`, 'g').test(html)) {
-      html = html.replace(/<a href=\"\//g, `<a href=\"${this.baseUrl}\/`);
-    }
-    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; }
+        if (!!this.baseUrl && href.startsWith('/') &&
+             !href.startsWith(this.baseUrl)) {
+          href = this.baseUrl + href;
+        }
+        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; }
+        if (!!this.baseUrl && html.match(/<a href=\"\//g) &&
+             !new RegExp(`^<a href="${this.baseUrl}`, 'g').test(html)) {
+          html = html.replace(/<a href=\"\//g, `<a href=\"${this.baseUrl}\/`);
+        }
+        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..3861a84 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(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 d03f964..3012f7f 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",
         ],
@@ -42,7 +42,7 @@
         ],
     )
 
-    vulcanize(
+    bundle_assets(
         name = appName,
         srcs = srcs,
         app = app,
@@ -63,10 +63,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",
         ],
     )
 
@@ -75,6 +83,7 @@
         srcs = [
             name + "_app_sources",
             name + "_css_sources",
+            name + "_theme_sources",
             name + "_top_sources",
             "//lib/fonts:robotofonts",
             "//lib/js:highlightjs_files",
@@ -84,11 +93,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..ccc17b0
--- /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;
+        min-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..489dede
--- /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: var(--primary-text-color);
+  --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..1620e49
--- /dev/null
+++ b/polygerrit-ui/app/styles/themes/dark-theme.html
@@ -0,0 +1,102 @@
+<!--
+@license
+Copyright (C) 2019 The Android Open Source Project
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+<dom-module id="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 b25a809..e0299da 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");
@@ -36,7 +37,7 @@
   });
 </script>
 <script>
-  // eslint-disable-next-line no-unused-vars
+  /* eslint-disable no-unused-vars */
   const mockPromise = () => {
     let res;
     const promise = new Promise(resolve => {
@@ -45,19 +46,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 e82cfd5..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,20 +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..d92ec51
--- /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 ax -o pid | grep -w $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.8 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
+
+    PID=`cat "$GERRIT_PID"`
+    if test $UID = 0; then
+        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..d797be3
--- /dev/null
+++ b/resources/com/google/gerrit/server/commit-msg_test.sh
@@ -0,0 +1,189 @@
+#!/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 prereq_modern_git {
+  # "git interpret-trailers --where" was introduced in Git 2.15.0.
+  git interpret-trailers -h 2>&1 | grep -e --where > /dev/null
+}
+
+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
+}
+
+function test_empty_with_comments {
+  rm -f input
+  cat << EOF > input
+# comment
+
+# comment2
+EOF
+  if ${hook} input ; then
+    fail "must fail on empty message"
+  fi
+}
+
+function test_keep_cutoff_line {
+  if ! prereq_modern_git ; then
+    echo "old version of Git detected; skipping scissors test."
+    return 0
+  fi
+  rm -f input
+  cat << EOF > input
+Do something nice
+
+# Please enter the commit message for your changes.
+# ------------------------ >8 ------------------------
+# Do not modify or remove the line above.
+# Everything below it will be ignored.
+diff --git a/file.txt b/file.txt
+index 625fd613d9..03aeba3b21 100755
+--- a/file.txt
++++ b/file.txt
+@@ -38,6 +38,7 @@
+ context
+ line
+ 
++hello, world
+ 
+ context
+ line
+EOF
+  ${hook} input || fail "failed hook execution"
+  grep '>8' input || fail "lost cut-off line"
+  sed -n -e '1,/>8/ p' input >top
+  grep '^Change-Id' top || fail "missing Change-Id above cut-off line"
+}
+
+# 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.
+git init
+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/DeleteKey.soy b/resources/com/google/gerrit/server/mail/DeleteKey.soy
new file mode 100644
index 0000000..7a2cdf4
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/DeleteKey.soy
@@ -0,0 +1,72 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .DeleteKey template will determine the contents of the email related to
+ * deleting a SSH or GPG key.
+ * @param email
+ */
+{template .DeleteKey kind="text"}
+  One or more {$email.keyType} keys have been deleted on Gerrit Code Review at
+  {sp}{$email.gerritHost}:
+
+  {\n}
+  {\n}
+
+  {if $email.sshKey}
+    {$email.sshKey}
+  {elseif $email.gpgKeyFingerprints}
+    {$email.gpgKeyFingerprints}
+  {/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.gpgKey}
+    {$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}
diff --git a/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy b/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy
new file mode 100644
index 0000000..25c1bd8
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/DeleteKeyHtml.soy
@@ -0,0 +1,66 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param email
+ */
+{template .DeleteKeyHtml}
+  <p>
+    One or more {$email.keyType} keys have been deleted on 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.gpgKeyFingerprints}
+    <pre style="{$keyStyle}">{$email.gpgKeyFingerprints}</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.gpgKeyFingerprints}
+      <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/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..d493e09
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/DeleteVote.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}
+
+/**
+ * The .DeleteVote template will determine the contents of the email related
+ * to removing votes on changes.
+ * @param change
+ * @param coverLetter
+ * @param email
+ * @param fromName
+ */
+{template .DeleteVote kind="text"}
+  {$fromName} has removed a vote from this change.{if $email.changeUrl} ( {$email.changeUrl} ){/if}{\n}{\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/HttpPasswordUpdate.soy b/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy
new file mode 100644
index 0000000..b40e5e3
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/HttpPasswordUpdate.soy
@@ -0,0 +1,55 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * The .HttpPasswordUpdate template will determine the contents of the email related to
+ * adding, changing or deleting the HTTP password.
+ * @param email
+ */
+{template .HttpPasswordUpdate kind="text"}
+  The HTTP password was {$email.operation} on Gerrit Code Review at
+  {sp}{$email.gerritHost}.
+
+  If this is not expected, please contact your Gerrit Administrators
+  immediately.
+
+  {\n}
+  {\n}
+
+  You can also manage your HTTP password by visiting
+  {\n}
+  {$email.gerritUrl}#/settings/http-password
+  {\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}
diff --git a/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy b/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy
new file mode 100644
index 0000000..b229f3a
--- /dev/null
+++ b/resources/com/google/gerrit/server/mail/HttpPasswordUpdateHtml.soy
@@ -0,0 +1,48 @@
+/**
+ * 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.
+ */
+
+{namespace com.google.gerrit.server.mail.template}
+
+/**
+ * @param email
+ */
+{template .HttpPasswordUpdateHtml}
+  <p>
+    The HTTP password was {$email.operation} on Gerrit Code Review
+    at {$email.gerritHost}.
+  </p>
+
+  <p>
+    If this is not expected, please contact your Gerrit Administrators
+    immediately.
+  </p>
+
+  <p>
+    You can also manage your HTTP password by following{sp}
+    <a href="{$email.gerritUrl}#/settings/http-password">this link</a>
+    {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/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..47bfaf2
--- /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.
+  {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..c51be96
--- /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>submitted</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..8413894
--- /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..6fbd341
--- /dev/null
+++ b/resources/com/google/gerrit/server/mime/mime-types.properties
@@ -0,0 +1,265 @@
+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/javascript
+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
+star = text/x-python
+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..2901232
--- /dev/null
+++ b/resources/com/google/gerrit/server/tools/root/hooks/commit-msg
@@ -0,0 +1,62 @@
+#!/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
+
+# 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}"
+
+trap 'rm -f "${dest}"' EXIT
+
+if ! git stripspace --strip-comments < "$1" > "${dest}" ; then
+   echo "cannot strip comments from $1"
+   exit 1
+fi
+
+if test ! -s "${dest}" ; then
+  echo "file is empty: $1"
+  exit 1
+fi
+
+# Avoid the --in-place option which only appeared in Git 2.8
+# Avoid the --if-exists option which only appeared in Git 2.15
+if ! git -c trailer.ifexists=doNothing interpret-trailers \
+      --trailer "Change-Id: I${random}" < "$1" > "${dest}" ; then
+  echo "cannot insert change-id line in $1"
+  exit 1
+fi
+
+if ! mv "${dest}" "$1" ; then
+  echo "cannot mv ${dest} to $1"
+  exit 1
+fi
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 292bf0c..b22dba1 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -4,6 +4,8 @@
     "default_java_toolchain",
 )
 
+exports_files(["nongoogle.bzl"])
+
 py_binary(
     name = "merge_jars",
     srcs = ["merge_jars.py"],
@@ -95,34 +97,9 @@
 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/...",
+        "//plugins/codemirror-editor/...",
         "//plugins/commit-message-length-validator/...",
         "//plugins/download-commands/...",
         "//plugins/hooks/...",
diff --git a/tools/bzl/asciidoc.bzl b/tools/bzl/asciidoc.bzl
index 9310864..f3c4646 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,
@@ -136,7 +121,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,
@@ -224,8 +209,8 @@
     args.extend(_generate_asciidoc_args(ctx))
     ctx.actions.run(
         inputs = ctx.files.srcs + [ctx.file.version],
-        tools = [ctx.executable._exe],
         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 e5dc4b6..ea7004e 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",
@@ -290,7 +288,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 307ef24..2726f41 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"
@@ -289,33 +290,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[ComponentInfo].transitive_zipfiles.to_list()]
 
     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,
     ])
 
@@ -340,49 +343,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",
@@ -396,7 +407,12 @@
             allow_single_file = True,
         ),
         "pkg": attr.string(mandatory = True),
+        "split": attr.bool(default = True),
         "deps": attr.label_list(providers = [ComponentInfo]),
+        "_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,
@@ -405,17 +421,112 @@
             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 = [], deps = [], 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,
+            deps = deps,
+            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 = "WHITESPACE_ONLY",
+        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 f56dd65..6892365 100644
--- a/tools/bzl/junit.bzl
+++ b/tools/bzl/junit.bzl
@@ -64,6 +64,13 @@
     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-opens=jdk.management/com.sun.management.internal=ALL-UNNAMED",
+]
+
 def junit_tests(name, srcs, **kwargs):
     s_name = name.replace("-", "_") + "TestSuite"
     _GenSuite(
@@ -71,9 +78,15 @@
         srcs = srcs,
         outname = s_name,
     )
+    jvm_flags = kwargs.get("jvm_flags", [])
+    jvm_flags = jvm_flags + select({
+        "//:java_next": 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 64970fa..dd60079 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 eb25007..4697bb7 100644
--- a/tools/bzl/plugin.bzl
+++ b/tools/bzl/plugin.bzl
@@ -10,11 +10,13 @@
 )
 
 GWT_PLUGIN_DEPS = _gwt_plugin_deps
-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 d707946..979f328 100755
--- a/tools/eclipse/project.py
+++ b/tools/eclipse/project.py
@@ -25,82 +25,114 @@
 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 = os.path.abspath(__file__)
 while not os.path.exists(os.path.join(ROOT, 'WORKSPACE')):
-  ROOT = os.path.dirname(ROOT)
+    ROOT = os.path.dirname(ROOT)
 
 opts = argparse.ArgumentParser("Create Eclipse Project")
 opts.add_argument('--plugins', help='create eclipse projects for plugins',
                   action='store_true')
 opts.add_argument('--name', help='name of the generated project',
                   action='store', default='gerrit', dest='project_name')
+opts.add_argument('-b', '--batch', action='store_true',
+                  dest='batch', help='Bazel batch option')
+opts.add_argument('-j', '--java', action='store',
+                  dest='java', help='Post Java 8 support (9)')
+opts.add_argument('-e', '--edge_java', action='store',
+                  dest='edge_java', help='Post Java 9 support (10|11|...)')
 opts.add_argument('--bazel',
                   help=('name of the bazel executable. Defaults to using'
                         ' bazelisk if found, or bazel if bazelisk is not'
                         ' found.'),
                   action='store', default=None, dest='bazel_exe')
 
-def find_bazel():
-  if args.bazel_exe:
-    try:
-      return subprocess.check_output(
-        ['which', args.bazel_exe]).strip().decode('UTF-8')
-    except subprocess.CalledProcessError:
-      print('Bazel command: %s not found' % args.bazel_exe, file=sys.stderr)
-      sys.exit(1)
-  try:
-    return subprocess.check_output(
-      ['which', 'bazelisk']).strip().decode('UTF-8')
-  except subprocess.CalledProcessError:
-    try:
-      return subprocess.check_output(
-        ['which', 'bazel']).strip().decode('UTF-8')
-    except subprocess.CalledProcessError:
-      print("Neither bazelisk nor bazel found. Please see"
-            " Documentation/dev-bazel for instructions on installing"
-            " one of them.")
-      sys.exit(1)
-
 args = opts.parse_args()
+
+
+def find_bazel():
+    if args.bazel_exe:
+        try:
+            return subprocess.check_output(
+                ['which', args.bazel_exe]).strip().decode('UTF-8')
+        except subprocess.CalledProcessError:
+            print('Bazel command: %s not found' % args.bazel_exe, file=sys.stderr)
+            sys.exit(1)
+    try:
+        return subprocess.check_output(
+            ['which', 'bazelisk']).strip().decode('UTF-8')
+    except subprocess.CalledProcessError:
+        try:
+            return subprocess.check_output(
+                ['which', 'bazel']).strip().decode('UTF-8')
+        except subprocess.CalledProcessError:
+            print("Neither bazelisk nor bazel found. Please see"
+                  " Documentation/dev-bazel for instructions on installing"
+                  " one of them.")
+            sys.exit(1)
+
+
+batch_option = '--batch' if args.batch else None
+custom_java = args.java
+edge_java = args.edge_java
 bazel_exe = find_bazel()
 
-def retrieve_ext_location():
-  return subprocess.check_output(
-      [bazel_exe, 'info', 'output_base']).strip()
 
-def gen_bazel_path():
-  bazel = subprocess.check_output(
-      ['which', bazel_exe]).strip().decode('UTF-8')
-  with open(os.path.join(ROOT, ".bazel_path"), 'w') as fd:
-    fd.write("bazel=%s\n" % bazel)
-    fd.write("PATH=%s\n" % os.environ["PATH"])
+def _build_bazel_cmd(*args):
+    build = False
+    cmd = [bazel_exe]
+    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 subprocess.check_output(_build_bazel_cmd('info', 'output_base')).strip()
+
+
+def gen_bazel_path(ext_location):
+    bazel = subprocess.check_output(['which', bazel_exe]).strip().decode('UTF-8')
+    with open(os.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" % os.environ["PATH"])
+
 
 def _query_classpath(target):
-  deps = []
-  t = cp_targets[target]
-  try:
-    subprocess.check_call([bazel_exe, 'build', t])
-  except subprocess.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:
+        subprocess.check_call(_build_bazel_cmd('build', t))
+    except subprocess.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 = os.path.join(root, '.project')
-  with open(p, 'w') as fd:
-    print("""\
+    p = os.path.join(root, '.project')
+    with open(p, 'w') as fd:
+        print("""\
 <?xml version="1.0" encoding="UTF-8"?>
 <projectDescription>
   <name>%(name)s</name>
@@ -115,16 +147,19 @@
 </projectDescription>\
     """ % {"name": name}, file=fd)
 
+
 def gen_plugin_classpath(root):
-  p = os.path.join(root, '.classpath')
-  with open(p, 'w') as fd:
-    if os.path.exists(os.path.join(root, 'src', 'test', 'java')):
-      testpath = """
+    p = os.path.join(root, '.classpath')
+    with open(p, 'w') as fd:
+        if os.path.exists(os.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
@@ -133,179 +168,202 @@
   <classpathentry kind="output" path="eclipse-out/classes"/>
 </classpath>""" % {"testpath": testpath}, file=fd)
 
+
 def gen_classpath(ext):
-  def make_classpath():
-    impl = xml.dom.minidom.getDOMImplementation()
-    return impl.createDocument(None, 'classpath', None)
+    def make_classpath():
+        impl = xml.dom.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 = os.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') or \
-         p.endswith('com_google_protobuf/libprotobuf_java.jar') or \
-         p.endswith('lucene-core-and-backward-codecs__merged.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 = os.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 = os.path.join(s, 'java')
-    if os.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 = os.path.join(s, 'src', env, srctype)
-        if os.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 = os.path.join(prefix, "jar", "%s-src.jar" % suffix)
-        if os.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 = os.path.join(ext, p)
+            gwt_lib.add(p)
             continue
-        classpathentry('lib', j, s)
 
-  for s in sorted(gwt_src):
-    p = os.path.join(ROOT, s, 'src', 'main', 'java')
-    if os.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') or \
+         p.endswith('com_google_protobuf/libprotobuf_java.jar') or \
+               p.endswith('lucene-core-and-backward-codecs__merged.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 = os.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 = os.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 = os.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 = os.path.join(s, 'java')
+        if os.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 = os.path.join(s, 'src', env, srctype)
+                if os.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 = os.path.join(prefix, "jar", "%s-src.jar" % suffix)
+                if os.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 = os.path.join(ROOT, s, 'src', 'main', 'java')
+        if os.path.exists(p):
+            classpathentry('lib', p, out='eclipse-out/gwtsrc')
+
+    classpathentry('con', JRE)
+    classpathentry('output', 'eclipse-out/classes')
+
+    p = os.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 = os.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 = xml.dom.minidom.getDOMImplementation().createDocument(
-      None, 'factorypath', None)
-  for jar in _query_classpath(AUTO):
-    e = doc.createElement('factorypathentry')
-    e.setAttribute('kind', 'EXTJAR')
-    e.setAttribute('id', os.path.join(ext, jar))
-    e.setAttribute('enabled', 'true')
-    e.setAttribute('runInBatchMode', 'false')
-    doc.documentElement.appendChild(e)
+    doc = xml.dom.minidom.getDOMImplementation().createDocument(
+        None, 'factorypath', None)
+    for jar in _query_classpath(AUTO):
+        e = doc.createElement('factorypathentry')
+        e.setAttribute('kind', 'EXTJAR')
+        e.setAttribute('id', os.path.join(ext, jar))
+        e.setAttribute('enabled', 'true')
+        e.setAttribute('runInBatchMode', 'false')
+        doc.documentElement.appendChild(e)
 
-  p = os.path.join(ROOT, '.factorypath')
-  with open(p, 'w') as fd:
-    doc.writexml(fd, addindent='\t', newl='\n', encoding='UTF-8')
+    p = os.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 os.path.isdir(gwt_working_dir):
-    os.makedirs(os.path.join(ROOT, gwt_working_dir))
+    # TODO(davido): Remove this when GWT gone
+    gwt_working_dir = ".gwt_work_dir"
+    if not os.path.isdir(gwt_working_dir):
+        os.makedirs(os.path.join(ROOT, gwt_working_dir))
 
-  try:
-    subprocess.check_call([
-        bazel_exe, 'build', MAIN, GWT,
-        '//gerrit-patch-jgit:libEdit-src.jar'])
-  except subprocess.CalledProcessError:
-    exit(1)
+    try:
+        subprocess.check_call(_build_bazel_cmd('build', MAIN, GWT,
+                              '//java/org/eclipse/jgit:libEdit-src.jar'))
+    except subprocess.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 f611eaf..57f3166 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 = 'https://registry.npmjs.org/%s/-/%s' % (name, filename)
+    name, version = args
+    filename = '%s-%s.tgz' % (name, version)
+    url = 'https://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..986de81
--- /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.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/tools/maven/gerrit-extension-api_pom.xml b/tools/maven/gerrit-extension-api_pom.xml
new file mode 100644
index 0000000..490ca15
--- /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.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/tools/maven/gerrit-plugin-api_pom.xml b/tools/maven/gerrit-plugin-api_pom.xml
new file mode 100644
index 0000000..47556c0
--- /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.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/tools/maven/gerrit-plugin-gwtui_pom.xml b/tools/maven/gerrit-plugin-gwtui_pom.xml
new file mode 100644
index 0000000..5c495b8
--- /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.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/tools/maven/gerrit-war_pom.xml b/tools/maven/gerrit-war_pom.xml
new file mode 100644
index 0000000..b4409a7
--- /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.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/tools/maven/mvn.py b/tools/maven/mvn.py
index f5aeb44..59a5efb 100755
--- a/tools/maven/mvn.py
+++ b/tools/maven/mvn.py
@@ -29,57 +29,58 @@
 
 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',
-    '-Dversion=%s' % args.v,
-    '-DrepositoryId=%s' % args.repository,
-    '-Durl=%s' % args.url,
-  ]
+    cmd = [
+        'mvn',
+        'gpg:sign-and-deploy-file',
+        '-Dversion=%s' % args.v,
+        '-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/nongoogle.bzl b/tools/nongoogle.bzl
new file mode 100644
index 0000000..2e84717
--- /dev/null
+++ b/tools/nongoogle.bzl
@@ -0,0 +1,16 @@
+load("//tools/bzl:maven_jar.bzl", "maven_jar")
+
+def declare_nongoogle_deps():
+    """loads dependencies that are not used at Google.
+
+    Changes to versions are exempt from library compliance review. New
+    dependencies must pass through library compliance review. This is
+    enforced by //lib:nongoogle_test.
+    """
+
+    # Transitive dependency of commons-compress
+    maven_jar(
+        name = "tukaani-xz",
+        artifact = "org.tukaani:xz:1.6",
+        sha1 = "05b6f921f1810bdf90e25471968f741f87168b64",
+    )
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 5b9d455..947e2c0 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 7c0689f..1a389f5 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, 'https://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': 'https://my.company.mirror/maven2'})
-    self.assertEqual(url, 'https://my.company.mirror/maven2/foo.jar')
+    def testKnownRedirect(self):
+        url = resolve_url('MAVEN_CENTRAL:foo.jar',
+                          {'MAVEN_CENTRAL': 'https://my.company.mirror/maven2'})
+        self.assertEqual(url, 'https://my.company.mirror/maven2/foo.jar')
 
-  def testCustom(self):
-    url = resolve_url('https://maven.example.com/release/foo.jar', {})
-    self.assertEqual(url, 'https://maven.example.com/release/foo.jar')
+    def testCustom(self):
+        url = resolve_url('https://maven.example.com/release/foo.jar', {})
+        self.assertEqual(url, 'https://maven.example.com/release/foo.jar')
 
-  def testCustomRedirect(self):
-    url = resolve_url('MAVEN_EXAMPLE:foo.jar',
-                      {'MAVEN_EXAMPLE': 'https://maven.example.com/release'})
-    self.assertEqual(url, 'https://maven.example.com/release/foo.jar')
+    def testCustomRedirect(self):
+        url = resolve_url('MAVEN_EXAMPLE:foo.jar',
+                          {'MAVEN_EXAMPLE':
+                           'https://maven.example.com/release'})
+        self.assertEqual(url, 'https://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 0ffe2ea..ee7ce47 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.17-SNAPSHOT"
+GERRIT_VERSION = "2.16.12-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>
