Merge changes I2695c6df,I51828250,I9d97c84e,I93589a40,Id5a9b5c7

* changes:
  Add support for Oracle database
  Support installation of proprietary libraries in $site/lib
  ScriptRunner: strip SQL delimiter if SqlDialect doesn't support it
  Migrate schema to meet 30 char length of database id limitation
  Fix preUpdateSchema to support multiple version steps
diff --git a/.gitmodules b/.gitmodules
index e45868b..2ac959c 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -10,6 +10,6 @@
 	path = plugins/commit-message-length-validator
 	url = https://gerrit.googlesource.com/plugins/commit-message-length-validator
 
-[submodule "plugins/helloworld"]
-	path = plugins/helloworld
-	url = https://gerrit.googlesource.com/plugins/helloworld
+[submodule "plugins/cookbook-plugin"]
+	path = plugins/cookbook-plugin
+	url = https://gerrit.googlesource.com/plugins/cookbook-plugin
diff --git a/BUCK b/BUCK
index e454d37..b1a0c75 100644
--- a/BUCK
+++ b/BUCK
@@ -61,7 +61,7 @@
 
 java_library(
   name = 'plugin-lib',
-  deps = PLUGIN_API,
+  deps = PLUGIN_API + ['//lib:servlet-api-3_0'],
   export_deps = True,
   visibility = ['PUBLIC'],
 )
diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt
index 8e85b6d..3360cdf 100644
--- a/Documentation/config-gerrit.txt
+++ b/Documentation/config-gerrit.txt
@@ -1975,8 +1975,8 @@
 from the user's account object matched under `ldap.accountBase`.
 Attributes such as `${dn}` or `${uidNumber}` may be useful.
 +
-Default is `(memberUid=${username})` for RFC 2307,
-and unset (disabled) for Active Directory.
+Default is `(|(memberUid=${username})(gidNumber=${gidNumber}))` for
+RFC 2307, and unset (disabled) for Active Directory.
 
 [[ldap.groupName]]ldap.groupName::
 +
diff --git a/Documentation/dev-plugins.txt b/Documentation/dev-plugins.txt
index f8a56b5..7765246 100644
--- a/Documentation/dev-plugins.txt
+++ b/Documentation/dev-plugins.txt
@@ -357,7 +357,7 @@
 
 ====
   @RequiresCapability("printHello")
-  @CommandMetaData(name="print", descr="Print greeting in different languages")
+  @CommandMetaData(name="print", description="Print greeting in different languages")
   public final class PrintHelloWorldCommand extends SshCommand {
   ...
 ====
@@ -533,6 +533,12 @@
 If a discovered file name beings with `cmd-` it will be clustered
 into a 'Commands' section of the generated index page.
 
+If a discovered file name beings with `servlet-` it will be clustered
+into a 'Servlets' section of the generated index page.
+
+If a discovered file name beings with `rest-api-` it will be clustered
+into a 'REST APIs' section of the generated index page.
+
 All other files are clustered under a 'Documentation' section.
 
 Some optional information from the manifest is extracted and
diff --git a/ReleaseNotes/ReleaseNotes-2.6.2.txt b/ReleaseNotes/ReleaseNotes-2.6.2.txt
index cf963c2..2b78cb4 100644
--- a/ReleaseNotes/ReleaseNotes-2.6.2.txt
+++ b/ReleaseNotes/ReleaseNotes-2.6.2.txt
@@ -38,6 +38,12 @@
 
 * 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`.
+
 
 No other changes since 2.6.1.
 
diff --git a/ReleaseNotes/ReleaseNotes-2.8.txt b/ReleaseNotes/ReleaseNotes-2.8.txt
index 0cd8b5d..77c4396 100644
--- a/ReleaseNotes/ReleaseNotes-2.8.txt
+++ b/ReleaseNotes/ReleaseNotes-2.8.txt
@@ -95,6 +95,12 @@
 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.
+
 
 REST API
 ~~~~~~~~
@@ -280,6 +286,13 @@
 link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config-validation.html#pre-merge-validation[
 pre-merge validation steps].
 
+* Plugins may now provide
+link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/dev-plugins.html#capabilities[
+Global capabilities].
+
+* The "hello world" plugin is replaced with the "cookbook plugin" which has more
+examples of the plugin API's usage.
+
 
 Commit Message Length Checker
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -293,13 +306,21 @@
 * The `{$name}` placeholder is optional when replicating a single project,
 allowing a single project to be replicated under a different name.
 
-* Projects can be matched with wildcard or regex patterns in `replication.config`.
+* 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.
+
 ssh
 ~~~
 
@@ -321,6 +342,9 @@
 link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-stream-events.html[
 `stream-events` command].
 
+* The link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-show-queue.html[
+`show-queue` command] now shows the time that a task was added to the queue.
+
 
 Daemon
 ~~~~~~
@@ -359,6 +383,9 @@
 The link:http://gerrit-documentation.googlecode.com/svn/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.
+
 Web UI
 ~~~~~~
 
@@ -437,6 +464,8 @@
 The link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/cmd-review.html[
 `review` command].
 
+* The `@CommandMetaData(descr)` annotation is deprecated in favor of `@CommandMetaData(description)`.
+
 
 Emails
 ~~~~~~
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 2f5f87d..d28c4d9 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
@@ -470,7 +470,9 @@
 
     if (rest.isEmpty()) {
       Gerrit.display(token, panel== null
-          ? (useChangeScreen2 ? new ChangeScreen2(id, null) : new ChangeScreen(id))
+          ? (useChangeScreen2
+              ? new ChangeScreen2(id, null, false)
+              : new ChangeScreen(id))
           : new NotFoundScreen());
       return;
     }
@@ -502,7 +504,7 @@
     } else {
       if (panel == null) {
         Gerrit.display(token, useChangeScreen2
-            ? new ChangeScreen2(id, String.valueOf(ps.get()))
+            ? new ChangeScreen2(id, String.valueOf(ps.get()), false)
             : new ChangeScreen(id));
       } else if ("publish".equals(panel)) {
         publish(ps);
@@ -524,7 +526,7 @@
       rest = "";
     }
     useChangeScreen2 = true;
-    Gerrit.display(token, new ChangeScreen2(id, rest));
+    Gerrit.display(token, new ChangeScreen2(id, rest, false));
   }
 
   private static void publish(final PatchSet.Id ps) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
index aff37f8..43f9b6d 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/ChangeScreen2.java
@@ -115,6 +115,7 @@
   private UpdateCheckTimer updateCheck;
   private Timestamp lastDisplayedUpdate;
   private UpdateAvailableBar updateAvailable;
+  private boolean openReplyBox;
 
   @UiField Style style;
   @UiField ToggleButton star;
@@ -150,9 +151,10 @@
   @UiField QuickApprove quickApprove;
   private ReplyAction replyAction;
 
-  public ChangeScreen2(Change.Id changeId, String revision) {
+  public ChangeScreen2(Change.Id changeId, String revision, boolean openReplyBox) {
     this.changeId = changeId;
     this.revision = revision != null && !revision.isEmpty() ? revision : null;
+    this.openReplyBox = openReplyBox;
     add(uiBinder.createAndBindUi(this));
   }
 
@@ -256,10 +258,15 @@
         .getParentElement()
         .getOffsetHeight());
 
-    String prior = Gerrit.getPriorView();
-    if (prior != null && prior.startsWith("/c/")) {
-      scrollToPath(prior.substring(3));
+    if (openReplyBox) {
+      onReply();
+    } else {
+      String prior = Gerrit.getPriorView();
+      if (prior != null && prior.startsWith("/c/")) {
+        scrollToPath(prior.substring(3));
+      }
     }
+
     startPoller();
   }
 
@@ -301,14 +308,16 @@
     if (0 <= idx) {
       String n = revisionList.getValue(idx);
       revisionList.setEnabled(false);
-      Gerrit.display(
-          PageLinks.toChange2(changeId, n),
-          new ChangeScreen2(changeId, n));
+      Gerrit.display(PageLinks.toChange2(changeId, n));
     }
   }
 
   @UiHandler("reply")
   void onReply(ClickEvent e) {
+    onReply();
+  }
+
+  private void onReply() {
     if (Gerrit.isSignedIn()) {
       replyAction.onReply();
     } else {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.java
index e7b5d47..ce2fe7b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.java
@@ -18,4 +18,5 @@
   String previousChange();
   String nextChange();
   String openChange();
+  String reviewedFileTitle();
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.properties
index f5971b6..95f378c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/Constants.properties
@@ -1,3 +1,4 @@
 previousChange = Previous related change
 nextChange = Next related change
 openChange = Open related change
+reviewedFileTitle = Mark file as reviewed (Shortcut: r)
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java
index 10c2bc6..d081348 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/FileTable.java
@@ -228,7 +228,7 @@
       keysNavigation.add(new OpenKeyCommand(0, KeyCodes.KEY_ENTER,
           Util.C.patchTableOpenDiff()));
 
-      keysNavigation.add(new KeyCommand(0, 'r', PatchUtil.C.toggleReviewed()) {
+      keysAction.add(new KeyCommand(0, 'r', PatchUtil.C.toggleReviewed()) {
         @Override
         public void onKeyPress(KeyPressEvent event) {
           int row = getCurrentRow();
@@ -438,6 +438,7 @@
       sb.openTd().setStyleName(R.css().reviewed());
       if (hasUser) {
         sb.openElement("input")
+          .setAttribute("title", Resources.C.reviewedFileTitle())
           .setAttribute("type", "checkbox")
           .setAttribute("onclick", REVIEWED + "(event," + info._row() + ")")
           .closeSelf();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java
index e5c8dcf..6b13ba0a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeDescriptionBlock.java
@@ -16,8 +16,8 @@
 
 import com.google.gerrit.client.ui.CommentLinkProcessor;
 import com.google.gerrit.common.data.AccountInfoCache;
+import com.google.gerrit.common.data.ChangeDetail;
 import com.google.gerrit.common.data.SubmitTypeRecord;
-import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSetInfo;
 import com.google.gwt.user.client.ui.Composite;
 import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -37,12 +37,12 @@
     initWidget(hp);
   }
 
-  public void display(Change chg, Boolean starred, Boolean canEditCommitMessage,
+  public void display(ChangeDetail changeDetail, Boolean starred, Boolean canEditCommitMessage,
       PatchSetInfo info, AccountInfoCache acc,
       SubmitTypeRecord submitTypeRecord,
       CommentLinkProcessor commentLinkProcessor) {
-    infoBlock.display(chg, acc, submitTypeRecord);
-    messageBlock.display(chg.currentPatchSetId(), starred,
+    infoBlock.display(changeDetail, acc, submitTypeRecord);
+    messageBlock.display(changeDetail.getChange().currentPatchSetId(), starred,
         canEditCommitMessage, info.getMessage(), commentLinkProcessor);
   }
 }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
index b942824..b4ae2f3 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeInfoBlock.java
@@ -95,8 +95,9 @@
     table.getCellFormatter().addStyleName(row, 0, Gerrit.RESOURCES.css().header());
   }
 
-  public void display(final Change chg, final AccountInfoCache acc,
-      SubmitTypeRecord submitTypeRecord) {
+  public void display(final ChangeDetail changeDetail,
+      final AccountInfoCache acc, SubmitTypeRecord submitTypeRecord) {
+    final Change chg = changeDetail.getChange();
     final Branch.NameKey dst = chg.getDest();
 
     CopyableLabel changeIdLabel =
@@ -114,7 +115,7 @@
 
     table.setWidget(R_BRANCH, 1, new BranchLink(dst.getShortName(), chg
         .getProject(), chg.getStatus(), dst.get(), null));
-    table.setWidget(R_TOPIC, 1, topic(chg));
+    table.setWidget(R_TOPIC, 1, topic(changeDetail));
     table.setText(R_UPLOADED, 1, mediumFormat(chg.getCreatedOn()));
     table.setText(R_UPDATED, 1, mediumFormat(chg.getLastUpdatedOn()));
     table.setText(R_STATUS, 1, Util.toLongString(chg.getStatus()));
@@ -146,7 +147,8 @@
     }
   }
 
-  public Widget topic(final Change chg) {
+  public Widget topic(final ChangeDetail changeDetail) {
+    final Change chg = changeDetail.getChange();
     final Branch.NameKey dst = chg.getDest();
 
     FlowPanel fp = new FlowPanel();
@@ -154,9 +156,6 @@
     fp.add(new BranchLink(chg.getTopic(), chg.getProject(), chg.getStatus(),
            dst.get(), chg.getTopic()));
 
-    ChangeDetailCache detailCache = ChangeCache.get(chg.getId()).getChangeDetailCache();
-    ChangeDetail changeDetail = detailCache.get();
-
     if (changeDetail.canEditTopicName()) {
       final Image edit = new Image(Gerrit.RESOURCES.edit());
       edit.addStyleName(Gerrit.RESOURCES.css().link());
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
index 0a53b6d..0ec34a9 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/ChangeScreen.java
@@ -322,7 +322,7 @@
 
     dependencies.setAccountInfoCache(detail.getAccounts());
 
-    descriptionBlock.display(detail.getChange(),
+    descriptionBlock.display(detail,
         detail.isStarred(),
         detail.canEditCommitMessage(),
         detail.getCurrentPatchSetDetail().getInfo(),
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
index 608a2c7..58a7042 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/changes/PublishCommentScreen.java
@@ -31,6 +31,7 @@
 import com.google.gerrit.client.ui.PatchLink;
 import com.google.gerrit.client.ui.SmallHeading;
 import com.google.gerrit.common.PageLinks;
+import com.google.gerrit.common.data.ChangeDetail;
 import com.google.gerrit.common.data.PatchSetPublishDetail;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.Patch;
@@ -317,9 +318,12 @@
   }
 
   private void display(final PatchSetPublishDetail r) {
+    ChangeDetail changeDetail = new ChangeDetail();
+    changeDetail.setChange(r.getChange());
+
     setPageTitle(Util.M.publishComments(r.getChange().getKey().abbreviate(),
         patchSetId.get()));
-    descBlock.display(r.getChange(), null, false, r.getPatchSetInfo(), r.getAccounts(),
+    descBlock.display(changeDetail, null, false, r.getPatchSetInfo(), r.getAccounts(),
        r.getSubmitTypeRecord(), commentLinkProcessor);
 
     if (r.getChange().getStatus().isOpen()) {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
index 3ad82f8..695814a 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/SideBySide2.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.client.diff;
 
 import com.google.gerrit.client.Gerrit;
+import com.google.gerrit.client.change.ChangeScreen2;
 import com.google.gerrit.client.changes.CommentApi;
 import com.google.gerrit.client.changes.CommentInfo;
 import com.google.gerrit.client.diff.DiffInfo.Region;
@@ -34,6 +35,7 @@
 import com.google.gerrit.common.PageLinks;
 import com.google.gerrit.common.changes.Side;
 import com.google.gerrit.reviewdb.client.AccountDiffPreference;
+import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.core.client.JavaScriptObject;
@@ -264,6 +266,7 @@
     cm.addKeyMap(KeyMap.create()
         .on("'j'", moveCursorDown(cm, 1))
         .on("'k'", moveCursorDown(cm, -1))
+        .on("'a'", openReplyBox())
         .on("'u'", upToChange())
         .on("'r'", toggleReviewed())
         .on("'o'", toggleOpenBox(cm))
@@ -287,6 +290,12 @@
         toggleReviewed().run();
       }
     });
+    keysAction.add(new KeyCommand(0, 'a', PatchUtil.C.openReply()) {
+      @Override
+      public void onKeyPress(KeyPressEvent event) {
+        openReplyBox().run();
+      }
+    });
 
     keysOpenByEnter = new KeyCommandSet(Gerrit.C.sectionNavigation());
     keysOpenByEnter.add(new NoOpKeyCommand(0, KeyCodes.KEY_ENTER,
@@ -956,6 +965,18 @@
     };
   }
 
+  private Runnable openReplyBox() {
+    return new Runnable() {
+      public void run() {
+        Change.Id id = revision.getParentKey();
+        String rev = String.valueOf(revision.get());
+        Gerrit.display(
+          PageLinks.toChange2(id, rev),
+          new ChangeScreen2(id, rev, true));
+      }
+    };
+  }
+
   private Runnable upToChange() {
     return new Runnable() {
       public void run() {
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java
index 8c9c56b..c6793d6 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.java
@@ -40,6 +40,7 @@
   String illegalNumberOfColumns();
 
   String upToChange();
+  String openReply();
   String linePrev();
   String lineNext();
   String chunkPrev();
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
index 5acdb5f..5259a4c 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/PatchConstants.properties
@@ -22,6 +22,7 @@
 illegalNumberOfColumns = The number of columns cannot be zero or negative
 
 upToChange = Up to change
+openReply = Reply and score
 linePrev = Previous line
 lineNext = Next line
 chunkPrev = Previous diff chunk or comment
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
index 4b3084a..53abc4c 100644
--- 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
@@ -331,6 +331,8 @@
       String prefix, String pluginName,
       ResourceKey cacheKey, HttpServletResponse res) throws IOException {
     List<JarEntry> cmds = Lists.newArrayList();
+    List<JarEntry> servlets = Lists.newArrayList();
+    List<JarEntry> restApis = Lists.newArrayList();
     List<JarEntry> docs = Lists.newArrayList();
     JarEntry about = null;
     Enumeration<JarEntry> entries = jar.entries();
@@ -345,6 +347,10 @@
         name = name.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;
@@ -395,6 +401,8 @@
     }
 
     appendEntriesSection(jar, docs, "Documentation", md, prefix, 0);
+    appendEntriesSection(jar, servlets, "Servlets", md, prefix, "servlet-".length());
+    appendEntriesSection(jar, restApis, "REST APIs", md, prefix, "rest-api-".length());
     appendEntriesSection(jar, cmds, "Commands", md, prefix, "cmd-".length());
 
     sendMarkdownAsHtml(md.toString(), pluginName, cacheKey, res);
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
index 0151dde..7d0ad24 100644
--- 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
@@ -197,13 +197,11 @@
     if (!schema.groupMemberQueryList.isEmpty()) {
       final HashMap<String, String> params = new HashMap<String, String>();
 
-      if (schema.groupNeedsAccount) {
-        if (account == null) {
-          account = findAccount(schema, ctx, username);
-        }
-        for (String name : schema.groupMemberQueryList.get(0).getParameters()) {
-          params.put(name, account.get(name));
-        }
+      if (account == null) {
+        account = findAccount(schema, ctx, username);
+      }
+      for (String name : schema.groupMemberQueryList.get(0).getParameters()) {
+        params.put(name, account.get(name));
       }
 
       params.put(LdapRealm.USERNAME, username);
@@ -286,7 +284,6 @@
     final String accountMemberField;
     final List<LdapQuery> accountQueryList;
 
-    boolean groupNeedsAccount;
     final List<String> groupBases;
     final SearchScope groupScope;
     final ParameterizedString groupPattern;
@@ -321,10 +318,7 @@
           }
 
           for (final String name : groupMemberQuery.getParameters()) {
-            if (!LdapRealm.USERNAME.equals(name)) {
-              groupNeedsAccount = true;
-              accountAtts.add(name);
-            }
+            accountAtts.add(name);
           }
 
           groupMemberQueryList.add(groupMemberQuery);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java
index db5baeb..3c1b0d2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/auth/ldap/LdapType.java
@@ -57,7 +57,7 @@
 
     @Override
     String groupMemberPattern() {
-      return "(memberUid=${username})";
+      return "(|(memberUid=${username})(gidNumber=${gidNumber}))";
     }
 
     @Override
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
index ee1fd4f..3b86fe7 100644
--- 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
@@ -15,6 +15,7 @@
 package com.google.gerrit.server.change;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -25,28 +26,46 @@
 import com.google.gerrit.extensions.restapi.Response;
 import com.google.gerrit.extensions.restapi.RestReadView;
 import com.google.gerrit.extensions.restapi.RestView;
+import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.AccountPatchReview;
+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.IdentifiedUser;
 import com.google.gerrit.server.change.FileInfoJson.FileInfo;
+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.PatchListEntry;
 import com.google.gerrit.server.patch.PatchListNotAvailableException;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
+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;
 import org.kohsuke.args4j.Option;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.SortedSet;
 import java.util.concurrent.TimeUnit;
 
 class Files implements ChildCollection<RevisionResource, FileResource> {
   private final DynamicMap<RestView<FileResource>> views;
-  private final Provider<List> list;
+  private final Provider<ListFiles> list;
 
   @Inject
-  Files(DynamicMap<RestView<FileResource>> views, Provider<List> list) {
+  Files(DynamicMap<RestView<FileResource>> views, Provider<ListFiles> list) {
     this.views = views;
     this.list = list;
   }
@@ -67,7 +86,9 @@
     return new FileResource(rev, id.get());
   }
 
-  private static final class List implements RestReadView<RevisionResource> {
+  private static final class ListFiles implements RestReadView<RevisionResource> {
+    private static final Logger log = LoggerFactory.getLogger(ListFiles.class);
+
     @Option(name = "--base", metaVar = "revision-id")
     String base;
 
@@ -78,16 +99,22 @@
     private final Provider<CurrentUser> self;
     private final FileInfoJson fileInfoJson;
     private final Provider<Revisions> revisions;
+    private final GitRepositoryManager gitManager;
+    private final PatchListCache patchListCache;
 
     @Inject
-    List(Provider<ReviewDb> db,
+    ListFiles(Provider<ReviewDb> db,
         Provider<CurrentUser> self,
         FileInfoJson fileInfoJson,
-        Provider<Revisions> revisions) {
+        Provider<Revisions> revisions,
+        GitRepositoryManager gitManager,
+        PatchListCache patchListCache) {
       this.db = db;
       this.self = self;
       this.fileInfoJson = fileInfoJson;
       this.revisions = revisions;
+      this.gitManager = gitManager;
+      this.patchListCache = patchListCache;
     }
 
     @Override
@@ -123,14 +150,102 @@
         throw new AuthException("Authentication required");
       }
 
-      java.util.List<String> r = Lists.newArrayList();
+      Account.Id userId = ((IdentifiedUser) user).getAccountId();
+      List<String> r = scan(userId, resource.getPatchSet().getId());
+
+      if (r.isEmpty() && 1 < resource.getPatchSet().getPatchSetId()) {
+        for (Integer id : reverseSortPatchSets(resource)) {
+          PatchSet.Id old = new PatchSet.Id(resource.getChange().getId(), id);
+          List<String> o = scan(userId, old);
+          if (!o.isEmpty()) {
+            try {
+              r = copy(Sets.newHashSet(o), old, resource, userId);
+            } catch (IOException e) {
+              log.warn("Cannot copy patch review flags", e);
+            } catch (PatchListNotAvailableException e) {
+              log.warn("Cannot copy patch review flags", e);
+            }
+            break;
+          }
+        }
+      }
+
+      return r;
+    }
+
+    private List<String> scan(Account.Id userId, PatchSet.Id psId)
+        throws OrmException {
+      List<String> r = Lists.newArrayList();
       for (AccountPatchReview w : db.get().accountPatchReviews()
-          .byReviewer(
-              ((IdentifiedUser) user).getAccountId(),
-              resource.getPatchSet().getId())) {
+          .byReviewer(userId, psId)) {
         r.add(w.getKey().getPatchKey().getFileName());
       }
       return r;
     }
+
+    private List<Integer> reverseSortPatchSets(
+        RevisionResource resource) throws OrmException {
+      SortedSet<Integer> ids = Sets.newTreeSet();
+      for (PatchSet p : db.get().patchSets()
+          .byChange(resource.getChange().getId())) {
+        if (p.getPatchSetId() < resource.getPatchSet().getPatchSetId()) {
+          ids.add(p.getPatchSetId());
+        }
+      }
+
+      List<Integer> r = Lists.newArrayList(ids);
+      Collections.reverse(r);
+      return r;
+    }
+
+    private List<String> copy(Set<String> paths, PatchSet.Id old,
+        RevisionResource resource, Account.Id userId) throws IOException,
+        PatchListNotAvailableException, OrmException {
+      Repository git =
+          gitManager.openRepository(resource.getChange().getProject());
+      try {
+        ObjectReader reader = git.newObjectReader();
+        try {
+          PatchList oldList = patchListCache.get(
+              resource.getChange(),
+              db.get().patchSets().get(old));
+
+          PatchList curList = patchListCache.get(
+              resource.getChange(),
+              resource.getPatchSet());
+
+          int sz = paths.size();
+          List<AccountPatchReview> inserts = Lists.newArrayListWithCapacity(sz);
+          List<String> pathList = Lists.newArrayListWithCapacity(sz);
+
+          RevWalk rw = new RevWalk(reader);
+          RevTree o = rw.parseCommit(oldList.getNewId()).getTree();
+          RevTree c = rw.parseCommit(curList.getNewId()).getTree();
+          for (PatchListEntry p : curList.getPatches()) {
+            String path = p.getNewName();
+            if (!Patch.COMMIT_MSG.equals(path) && paths.contains(path)) {
+              TreeWalk tw = TreeWalk.forPath(reader, path, o, c);
+              if (tw != null
+                  && tw.getRawMode(0) != 0
+                  && tw.getRawMode(1) != 0
+                  && tw.idEqual(0, 1)) {
+                inserts.add(new AccountPatchReview(
+                    new Patch.Key(
+                        resource.getPatchSet().getId(),
+                        path),
+                      userId));
+                pathList.add(path);
+              }
+            }
+          }
+          db.get().accountPatchReviews().insert(inserts);
+          return pathList;
+        } finally {
+          reader.release();
+        }
+      } finally {
+        git.close();
+      }
+    }
   }
 }
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
index d929a89..5e2c797 100644
--- 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
@@ -151,6 +151,11 @@
     return this;
   }
 
+  public PatchSet.Id getPatchSetId() {
+    init();
+    return patchSet.getId();
+  }
+
   public PatchSetInserter setMessage(String message) throws OrmException {
     changeMessage = new ChangeMessage(new ChangeMessage.Key(change.getId(),
         ChangeUtil.messageUUID(db)), user.getAccountId(), patchSet.getId());
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java
index 40deb0c..dceecbe 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/changedetail/RebaseChange.java
@@ -293,7 +293,7 @@
     final ChangeControl changeControl =
         changeControlFactory.validateFor(change.getId(), uploader);
 
-    PatchSetInserter patchSetinserter = patchSetInserterFactory
+    PatchSetInserter patchSetInserter = patchSetInserterFactory
         .create(git, revWalk, changeControl.getRefControl(), uploader, change, rebasedCommit)
         .setCopyLabels(true)
         .setValidatePolicy(validate)
@@ -301,13 +301,15 @@
         .setSendMail(sendMail)
         .setRunHooks(runHooks);
 
+    final PatchSet.Id newPatchSetId = patchSetInserter.getPatchSetId();
     final ChangeMessage cmsg =
         new ChangeMessage(new ChangeMessage.Key(change.getId(),
             ChangeUtil.messageUUID(db)), uploader.getAccountId(), patchSetId);
-    cmsg.setMessage("Patch Set " + change.currentPatchSetId().get()
+
+    cmsg.setMessage("Patch Set " + newPatchSetId.get()
         + ": Patch Set " + patchSetId.get() + " was rebased");
 
-    Change newChange = patchSetinserter
+    Change newChange = patchSetInserter
         .setMessage(cmsg)
         .insert();
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriteImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriteImpl.java
index 5014396..a782d34 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriteImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexRewriteImpl.java
@@ -126,25 +126,31 @@
   private final IndexCollection indexes;
   private final Provider<ReviewDb> db;
   private final BasicRewritesImpl basicRewrites;
+  private final SqlRewriterImpl sqlRewriter;
 
   @Inject
   IndexRewriteImpl(IndexCollection indexes,
       Provider<ReviewDb> db,
-      BasicRewritesImpl basicRewrites) {
+      BasicRewritesImpl basicRewrites,
+      SqlRewriterImpl sqlRewriter) {
     this.indexes = indexes;
     this.db = db;
     this.basicRewrites = basicRewrites;
+    this.sqlRewriter = sqlRewriter;
   }
 
   @Override
   public Predicate<ChangeData> rewrite(Predicate<ChangeData> in) {
+    ChangeIndex index = indexes.getSearchIndex();
+    if (index == null) {
+      return sqlRewriter.rewrite(in);
+    }
     in = basicRewrites.rewrite(in);
     // Add 1 to specified limit to match behavior of QueryProcessor.
     int limit = ChangeQueryBuilder.hasLimit(in)
         ? ChangeQueryBuilder.getLimit(in) + 1
         : MAX_LIMIT;
 
-    ChangeIndex index = indexes.getSearchIndex();
     Predicate<ChangeData> out = rewriteImpl(in, index, limit);
     if (in == out || out instanceof IndexPredicate) {
       return query(out, index, limit);
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
index 716a22b..4439755 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/mail/CommentSender.java
@@ -28,6 +28,8 @@
 import com.google.inject.assistedinject.Assisted;
 
 import org.eclipse.jgit.lib.Repository;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.Collections;
@@ -37,6 +39,9 @@
 
 /** 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 static interface Factory {
     public CommentSender create(NotifyHandling notify, Change change);
   }
@@ -97,8 +102,7 @@
   }
 
   public String getInlineComments(int lines) {
-    StringBuilder  cmts = new StringBuilder();
-
+    StringBuilder cmts = new StringBuilder();
     final Repository repo = getRepository();
     try {
       PatchList patchList = null;
@@ -114,55 +118,34 @@
       PatchFile currentFileData = null;
       for (final PatchLineComment c : inlineComments) {
         final Patch.Key pk = c.getKey().getParentKey();
-        final int lineNbr = c.getLine();
-        final short side = c.getSide();
 
         if (!pk.equals(currentFileKey)) {
           cmts.append("....................................................\n");
           if (Patch.COMMIT_MSG.equals(pk.get())) {
             cmts.append("Commit Message\n");
           } else {
-            cmts.append("File ");
-            cmts.append(pk.get());
-            cmts.append("\n");
+            cmts.append("File ").append(pk.get()).append('\n');
           }
           currentFileKey = pk;
 
           if (patchList != null) {
             try {
               currentFileData =
-                  new PatchFile(repo, patchList, pk.getFileName());
+                  new PatchFile(repo, patchList, pk.get());
             } catch (IOException e) {
-              // Don't quote the line if we can't load it.
+              log.warn(String.format(
+                  "Cannot load %s from %s in %s",
+                  pk.getFileName(),
+                  patchList.getNewId().name(),
+                  projectState.getProject().getName()), e);
+              currentFileData = null;
             }
-          } else {
-            currentFileData = null;
           }
         }
 
         if (currentFileData != null) {
-          int maxLines;
-          try {
-            maxLines = currentFileData.getLineCount(side);
-          } catch (Throwable e) {
-            maxLines = lineNbr;
-          }
-
-          final int startLine = Math.max(1, lineNbr - lines + 1);
-          final int stopLine = Math.min(maxLines, lineNbr + lines);
-
-          for (int line = startLine; line <= lineNbr; ++line) {
-            appendFileLine(cmts, currentFileData, side, line);
-          }
-
-          cmts.append(c.getMessage().trim());
-          cmts.append("\n");
-
-          for (int line = lineNbr + 1; line < stopLine; ++line) {
-            appendFileLine(cmts, currentFileData, side, line);
-          }
+          appendComment(cmts, lines, currentFileData, c);
         }
-
         cmts.append("\n\n");
       }
     } finally {
@@ -173,6 +156,30 @@
     return cmts.toString();
   }
 
+  private void appendComment(StringBuilder out, int contextLines,
+      PatchFile currentFileData, PatchLineComment comment) {
+    int lineNbr = comment.getLine();
+    short side = comment.getSide();
+    int maxLines;
+    try {
+      maxLines = currentFileData.getLineCount(side);
+    } catch (Throwable e) {
+      maxLines = lineNbr;
+    }
+
+    final int startLine = Math.max(1, lineNbr - contextLines + 1);
+    final int stopLine = Math.min(maxLines, lineNbr + contextLines);
+
+    for (int line = startLine; line <= lineNbr; ++line) {
+      appendFileLine(out, currentFileData, side, line);
+    }
+    out.append(comment.getMessage().trim()).append('\n');
+
+    for (int line = lineNbr + 1; line < stopLine; ++line) {
+      appendFileLine(out, currentFileData, side, line);
+    }
+  }
+
   private void appendFileLine(StringBuilder cmts, PatchFile fileData, short side, int line) {
     cmts.append("Line " + line);
     try {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SqlRewriterImpl.java b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SqlRewriterImpl.java
index 78b3c95..71daa9c 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SqlRewriterImpl.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/query/change/SqlRewriterImpl.java
@@ -14,6 +14,7 @@
 
 package com.google.gerrit.server.query.change;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.gerrit.reviewdb.client.Branch;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.server.ChangeAccess;
@@ -37,7 +38,8 @@
           SqlRewriterImpl.class, BUILDER);
 
   @Inject
-  SqlRewriterImpl(Provider<ReviewDb> dbProvider) {
+  @VisibleForTesting
+  public SqlRewriterImpl(Provider<ReviewDb> dbProvider) {
     super(mydef, dbProvider);
   }
 
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
index 7d14ac2..4b89544 100644
--- 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
@@ -15,6 +15,7 @@
 package gerrit;
 
 import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.data.LabelValue;
 import com.google.gerrit.rules.PrologEnvironment;
 import com.google.gerrit.rules.StoredValues;
 import com.google.gerrit.server.project.ProjectState;
@@ -43,6 +44,8 @@
  * </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;
@@ -75,10 +78,12 @@
       "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.getFunctionName()),
-        new IntegerTerm(type.getMin().getValue()),
-        new IntegerTerm(type.getMax().getValue()));
+        min != null ? new IntegerTerm(min.getValue()) : NONE,
+        max != null ? new IntegerTerm(max.getValue()) : NONE);
   }
 }
diff --git a/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java b/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java
index 667bdc9..64f7965 100644
--- a/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java
+++ b/gerrit-server/src/test/java/com/google/gerrit/server/index/IndexRewriteTest.java
@@ -27,11 +27,13 @@
 import com.google.gerrit.server.query.OperatorPredicate;
 import com.google.gerrit.server.query.Predicate;
 import com.google.gerrit.server.query.QueryParseException;
+import com.google.gerrit.server.query.RewritePredicate;
 import com.google.gerrit.server.query.change.AndSource;
 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.OrSource;
+import com.google.gerrit.server.query.change.SqlRewriterImpl;
 import com.google.gwtorm.server.OrmException;
 import com.google.gwtorm.server.ResultSet;
 
@@ -177,7 +179,8 @@
     rewrite = new IndexRewriteImpl(
         indexes,
         null,
-        new IndexRewriteImpl.BasicRewritesImpl(null));
+        new IndexRewriteImpl.BasicRewritesImpl(null),
+        new SqlRewriterImpl(null));
   }
 
   public void testIndexPredicate() throws Exception {
@@ -308,6 +311,18 @@
         out.getChildren());
   }
 
+  public void testNoChangeIndexUsesSqlRewrites() throws Exception {
+    Predicate<ChangeData> in = parse("status:open project:p ref:b");
+    Predicate<ChangeData> out;
+
+    out = rewrite(in);
+    assertTrue(out instanceof AndPredicate || out instanceof IndexedChangeQuery);
+
+    indexes.setSearchIndex(null);
+    out = rewrite(in);
+    assertTrue(out instanceof RewritePredicate);
+  }
+
   private Predicate<ChangeData> parse(String query) throws QueryParseException {
     return queryBuilder.parse(query);
   }
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java
index cfcee6a..42c0fd7 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandMetaData.java
@@ -27,5 +27,9 @@
 @Retention(RUNTIME)
 public @interface CommandMetaData {
   String name();
+  String description() default "";
+
+  /** @deprecated use description intead. */
+  @Deprecated
   String descr() default "";
 }
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
index e7e8a44..c64f9d8 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/CommandModule.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.sshd;
 
+import com.google.common.base.Objects;
+import com.google.common.base.Strings;
 import com.google.inject.AbstractModule;
 import com.google.inject.binder.LinkedBindingBuilder;
 
@@ -74,7 +76,7 @@
     if (meta == null) {
       throw new IllegalStateException("no CommandMetaData annotation found");
     }
-    bind(Commands.key(parent, meta.name(), meta.descr())).to(clazz);
+    bind(Commands.key(parent, meta.name(), description(meta))).to(clazz);
   }
 
   /**
@@ -93,7 +95,14 @@
     if (meta == null) {
       throw new IllegalStateException("no CommandMetaData annotation found");
     }
-    bind(Commands.key(parent, name, meta.descr())).to(clazz);
+    bind(Commands.key(parent, name, description(meta))).to(clazz);
+  }
+
+  @SuppressWarnings("deprecation")
+  private static String description(CommandMetaData meta) {
+    return Objects.firstNonNull(
+        Strings.emptyToNull(meta.description()),
+        meta.descr());
   }
 
   /**
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
index 15229dc..0ff3a01 100644
--- 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
@@ -28,7 +28,7 @@
 /** Opens a query processor. */
 @AdminHighPriorityCommand
 @RequiresCapability(GlobalCapability.ACCESS_DATABASE)
-@CommandMetaData(name = "gsql", descr = "Administrative interface to active database")
+@CommandMetaData(name = "gsql", description = "Administrative interface to active database")
 final class AdminQueryShell extends SshCommand {
   @Inject
   private QueryShell.Factory factory;
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
index e83963a..c68dc26 100644
--- 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
@@ -50,7 +50,7 @@
 import java.util.Set;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "set-project-parent", descr = "Change the project permissions are inherited from")
+@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);
 
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
index 0268bc0..dc22a29 100644
--- 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
@@ -33,7 +33,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-@CommandMetaData(name = "ban-commit", descr = "Ban a commit from a project's repository")
+@CommandMetaData(name = "ban-commit", description = "Ban a commit from a project's repository")
 public class BanCommitCommand extends SshCommand {
   @Option(name = "--reason", aliases = {"-r"}, metaVar = "REASON", usage = "reason for banning the commit")
   private String reason;
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
index 6c4b41c..aef1560 100644
--- 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
@@ -39,7 +39,7 @@
 
 /** Create a new user account. **/
 @RequiresCapability(GlobalCapability.CREATE_ACCOUNT)
-@CommandMetaData(name = "create-account", descr = "Create a new batch/role 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<AccountGroup.Id>();
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
index 660460a..c652641 100644
--- 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
@@ -38,7 +38,7 @@
  * Optionally, puts an initial set of user in the newly created group.
  */
 @RequiresCapability(GlobalCapability.CREATE_GROUP)
-@CommandMetaData(name = "create-group", descr = "Create a new account 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;
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
index 89bb973..24d7689 100644
--- 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
@@ -36,7 +36,7 @@
 
 /** Create a new project. **/
 @RequiresCapability(GlobalCapability.CREATE_PROJECT)
-@CommandMetaData(name = "create-project", descr = "Create a new project and associated Git repository")
+@CommandMetaData(name = "create-project", description = "Create a new project and associated Git repository")
 final class CreateProjectCommand extends SshCommand {
   @Option(name = "--name", aliases = {"-n"}, metaVar = "NAME", usage = "name of project to be created (deprecated option)")
   void setProjectNameFromOption(String name) {
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
index 4b78cfc..6c07dddb 100644
--- 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
@@ -31,7 +31,7 @@
 
 /** Causes the caches to purge all entries and reload. */
 @RequiresCapability(GlobalCapability.FLUSH_CACHES)
-@CommandMetaData(name = "flush-caches", descr = "Flush some/all server caches from memory")
+@CommandMetaData(name = "flush-caches", description = "Flush some/all server caches from memory")
 final class FlushCaches extends CacheCommand {
   private static final String WEB_SESSIONS = "web_sessions";
 
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
index c561153..346bea7 100644
--- 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
@@ -37,7 +37,7 @@
 
 /** Runs the Git garbage collection. */
 @RequiresCapability(GlobalCapability.RUN_GC)
-@CommandMetaData(name = "gc", descr = "Run Git garbage collection")
+@CommandMetaData(name = "gc", description = "Run Git garbage collection")
 public class GarbageCollectionCommand extends BaseCommand {
 
   @Option(name = "--all", usage = "runs the Git garbage collection for all projects")
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
index e5b4203..aadb1d9 100644
--- 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
@@ -37,7 +37,7 @@
 
 import java.io.PrintWriter;
 
-@CommandMetaData(name = "ls-groups", descr = "List groups visible to the caller")
+@CommandMetaData(name = "ls-groups", description = "List groups visible to the caller")
 public class ListGroupsCommand extends BaseCommand {
   @Inject
   private MyListGroups impl;
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
index c5bda3c..b7dd380 100644
--- 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
@@ -39,7 +39,7 @@
 /**
  * Implements a command that allows the user to see the members of a group.
  */
-@CommandMetaData(name = "ls-members", descr = "Lists the members of a given group")
+@CommandMetaData(name = "ls-members", description = "Lists the members of a given group")
 public class ListMembersCommand extends BaseCommand {
   @Inject
   ListMembersCommandImpl impl;
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
index ab70395..8bcae4b 100644
--- 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
@@ -23,7 +23,7 @@
 
 import java.util.List;
 
-@CommandMetaData(name = "ls-projects", descr = "List projects visible to the caller")
+@CommandMetaData(name = "ls-projects", description = "List projects visible to the caller")
 final class ListProjectsCommand extends BaseCommand {
   @Inject
   private ListProjects impl;
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
index 58abf95..1806749 100644
--- 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
@@ -40,7 +40,7 @@
 import java.util.Map;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "ls-user-refs", descr = "List refs visible to a specific user")
+@CommandMetaData(name = "ls-user-refs", description = "List refs visible to a specific user")
 public class LsUserRefs extends SshCommand {
   @Inject
   private AccountResolver accountResolver;
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
index 709e337..47c2d68 100644
--- 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
@@ -28,7 +28,7 @@
 import java.util.List;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "enable", descr = "Enable plugins")
+@CommandMetaData(name = "enable", description = "Enable plugins")
 final class PluginEnableCommand extends SshCommand {
   @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin(s) to enable")
   List<String> names;
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
index fc036fe..70d09ee 100644
--- 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
@@ -35,7 +35,7 @@
 import java.net.URL;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "install", descr = "Install/Add a plugin")
+@CommandMetaData(name = "install", description = "Install/Add a plugin")
 final class PluginInstallCommand extends SshCommand {
   @Option(name = "--name", aliases = {"-n"}, usage = "install under name")
   private String name;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java
index ab6c978..7e44641 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/PluginLsCommand.java
@@ -26,7 +26,7 @@
 import java.io.IOException;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "ls", descr = "List the installed plugins")
+@CommandMetaData(name = "ls", description = "List the installed plugins")
 final class PluginLsCommand extends BaseCommand {
   @Inject
   private ListPlugins impl;
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
index 85ade03..3ed1011 100644
--- 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
@@ -28,7 +28,7 @@
 import java.util.List;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "reload", descr = "Reload/Restart plugins")
+@CommandMetaData(name = "reload", description = "Reload/Restart plugins")
 final class PluginReloadCommand extends SshCommand {
   @Argument(index = 0, metaVar = "NAME", usage = "plugins to reload/restart")
   private List<String> names;
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
index 96adb8fe..0ae11af 100644
--- 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
@@ -27,7 +27,7 @@
 import java.util.List;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "remove", descr = "Disable plugins")
+@CommandMetaData(name = "remove", description = "Disable plugins")
 final class PluginRemoveCommand extends SshCommand {
   @Argument(index = 0, metaVar = "NAME", required = true, usage = "plugin to remove")
   List<String> 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
index 2d17876..185bb67 100644
--- 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
@@ -24,7 +24,7 @@
 
 import java.util.List;
 
-@CommandMetaData(name = "query", descr = "Query the change database")
+@CommandMetaData(name = "query", description = "Query the change database")
 class Query extends SshCommand {
   @Inject
   private QueryProcessor processor;
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
index 1630d11..93c6af2 100644
--- 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
@@ -228,9 +228,9 @@
         if (outputFormat == OutputFormat.PRETTY) {
           println("                     List of relations");
         }
-        showResultSet(rs, false, //
-            Identity.create(rs, "TABLE_SCHEM"), //
-            Identity.create(rs, "TABLE_NAME"), //
+        showResultSet(rs, false,
+            Identity.create(rs, "TABLE_SCHEM"),
+            Identity.create(rs, "TABLE_NAME"),
             Identity.create(rs, "TABLE_TYPE"));
       } finally {
         rs.close();
@@ -267,8 +267,8 @@
         if (outputFormat == OutputFormat.PRETTY) {
           println("                     Table " + tableName);
         }
-        showResultSet(rs, true, //
-            Identity.create(rs, "COLUMN_NAME"), //
+        showResultSet(rs, true,
+            Identity.create(rs, "COLUMN_NAME"),
             new Function("TYPE") {
               @Override
               String apply(final ResultSet rs) throws SQLException {
@@ -379,7 +379,7 @@
 
             case PRETTY:
             default:
-              println("(" + rowCount + (rowCount == 1 ? " row" : " rows") //
+              println("(" + rowCount + (rowCount == 1 ? " row" : " rows")
                   + "; " + ms + " ms)");
               break;
           }
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
index f9d5ac1..b3aad6f 100644
--- 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
@@ -42,7 +42,7 @@
 import java.util.Set;
 
 /** Receives change upload over SSH using the Git receive-pack protocol. */
-@CommandMetaData(name = "receive-pack", descr = "Standard Git server side command for client side git push")
+@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);
 
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
index f3c1bb3..38535a4 100644
--- 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
@@ -25,7 +25,7 @@
 
 import org.kohsuke.args4j.Argument;
 
-@CommandMetaData(name = "rename-group", descr = "Rename an account group")
+@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;
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
index b48320f..714a6ad 100644
--- 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
@@ -63,7 +63,7 @@
 import java.util.Map;
 import java.util.Set;
 
-@CommandMetaData(name = "review", descr = "Verify, approve and/or submit one or more patch sets")
+@CommandMetaData(name = "review", description = "Verify, approve and/or submit one or more patch sets")
 public class ReviewCommand extends SshCommand {
   private static final Logger log =
       LoggerFactory.getLogger(ReviewCommand.class);
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
index d515aab..5736bb6 100644
--- 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
@@ -55,7 +55,7 @@
 import java.util.List;
 
 /** Set a user's account settings. **/
-@CommandMetaData(name = "set-account", descr = "Change an account's settings")
+@CommandMetaData(name = "set-account", description = "Change an account's settings")
 final class SetAccountCommand extends BaseCommand {
 
   @Argument(index = 0, required = true, metaVar = "USER", usage = "full name, email-address, ssh username or account id")
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
index cd2710f..48c37b8 100644
--- 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
@@ -43,7 +43,7 @@
 import java.io.UnsupportedEncodingException;
 import java.util.List;
 
-@CommandMetaData(name = "set-members", descr = "Modifies members of specific group or number of groups")
+@CommandMetaData(name = "set-members", description = "Modifies 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")
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
index d512fd5..b45fb3a 100644
--- 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
@@ -38,7 +38,7 @@
 import java.io.IOException;
 
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
-@CommandMetaData(name = "set-project", descr = "Change a project's settings")
+@CommandMetaData(name = "set-project", description = "Change a project's settings")
 final class SetProjectCommand extends SshCommand {
   private static final Logger log = LoggerFactory
       .getLogger(SetProjectCommand.class);
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
index 8e9bcac..6dc79ff 100644
--- 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
@@ -45,7 +45,7 @@
 import java.util.List;
 import java.util.Set;
 
-@CommandMetaData(name = "set-reviewers", descr = "Add or remove reviewers on a change")
+@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);
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
index ae5dc56..7929ef6 100644
--- 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
@@ -52,7 +52,7 @@
 
 /** Show the current cache states. */
 @RequiresCapability(GlobalCapability.VIEW_CACHES)
-@CommandMetaData(name = "show-caches", descr = "Display current cache statistics")
+@CommandMetaData(name = "show-caches", description = "Display current cache statistics")
 final class ShowCaches extends CacheCommand {
   private static volatile long serverStarted;
 
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
index f5abf4b..7b308c1 100644
--- 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
@@ -44,7 +44,7 @@
 
 /** Show the current SSH connections. */
 @RequiresCapability(GlobalCapability.VIEW_CONNECTIONS)
-@CommandMetaData(name = "show-connections", descr = "Display active client SSH connections")
+@CommandMetaData(name = "show-connections", description = "Display active client SSH connections")
 final class ShowConnections extends SshCommand {
   @Option(name = "--numeric", aliases = {"-n"}, usage = "don't resolve names")
   private boolean numeric;
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
index 81a2dcc..a1b062c 100644
--- 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
@@ -40,7 +40,7 @@
 
 /** Display the current work queue. */
 @AdminHighPriorityCommand
-@CommandMetaData(name = "show-queue", descr = "Display the background work queues, including replication")
+@CommandMetaData(name = "show-queue", description = "Display the background work queues, including replication")
 final class ShowQueue extends SshCommand {
   @Option(name = "--wide", aliases = {"-w"}, usage = "display without line width truncation")
   private boolean wide;
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
index 99d4baa..fd4a9ec 100644
--- 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
@@ -36,7 +36,7 @@
 import java.util.concurrent.LinkedBlockingQueue;
 
 @RequiresCapability(GlobalCapability.STREAM_EVENTS)
-@CommandMetaData(name = "stream-events", descr = "Monitor events occurring in real time")
+@CommandMetaData(name = "stream-events", description = "Monitor events occurring in real time")
 final class StreamEvents extends BaseCommand {
   /** Maximum number of events that may be queued up for each connection. */
   private static final int MAX_EVENTS = 128;
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
index 6335160..b957a7a 100644
--- 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
@@ -23,7 +23,7 @@
 import com.google.inject.Provider;
 
 /** Command that allows testing of prolog submit-rules in a live instance. */
-@CommandMetaData(name = "rule", descr = "Test prolog submit rules")
+@CommandMetaData(name = "rule", description = "Test prolog submit rules")
 final class TestSubmitRuleCommand extends BaseTestPrologCommand {
   @Inject
   private Provider<TestSubmitRule> 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
index 326ff46..2e7f0df 100644
--- 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
@@ -23,7 +23,7 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
-@CommandMetaData(name = "type", descr = "Test prolog submit type")
+@CommandMetaData(name = "type", description = "Test prolog submit type")
 final class TestSubmitTypeCommand extends BaseTestPrologCommand {
   @Inject
   private Provider<TestSubmitType> view;
diff --git a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java
index 2066cc2..19888c8 100644
--- a/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java
+++ b/gerrit-sshd/src/main/java/com/google/gerrit/sshd/commands/VersionCommand.java
@@ -18,7 +18,7 @@
 import com.google.gerrit.sshd.CommandMetaData;
 import com.google.gerrit.sshd.SshCommand;
 
-@CommandMetaData(name = "version", descr = "Display gerrit version")
+@CommandMetaData(name = "version", description = "Display gerrit version")
 final class VersionCommand extends SshCommand {
 
   @Override
diff --git a/plugins/cookbook-plugin b/plugins/cookbook-plugin
new file mode 160000
index 0000000..0da2b05
--- /dev/null
+++ b/plugins/cookbook-plugin
@@ -0,0 +1 @@
+Subproject commit 0da2b05c13948dba6a92346538a844a20ee353cc
diff --git a/plugins/helloworld b/plugins/helloworld
deleted file mode 160000
index 6e3c3c8..0000000
--- a/plugins/helloworld
+++ /dev/null
@@ -1 +0,0 @@
-Subproject commit 6e3c3c8a54e9e0e2c5b2fb9205bbbe3112ea55bb
diff --git a/plugins/replication b/plugins/replication
index d2796c5..7ec017f 160000
--- a/plugins/replication
+++ b/plugins/replication
@@ -1 +1 @@
-Subproject commit d2796c5d1cdc0e0a8313c3ef2b923433e421356d
+Subproject commit 7ec017fbac3f34fffc7af175d0dec181d18c33f2