Merge "Add new file name to current paths if the file was rewritten"
diff --git a/Documentation/.gitignore b/Documentation/.gitignore
deleted file mode 100644
index 8a3da24..0000000
--- a/Documentation/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*.html
-/.published
diff --git a/Documentation/index.txt b/Documentation/index.txt
index ee76855..8ce2904 100644
--- a/Documentation/index.txt
+++ b/Documentation/index.txt
@@ -8,6 +8,7 @@
 .. link:licenses.html[Licenses and Notices]
 . Installing
 .. link:intro-quick.html[A Quick Introduction To Gerrit]
+.. link:intro-change-screen.html[A Quick Introduction To The New Change Screen]
 .. link:install.html[Installation Guide]
 . Tutorial
 .. Get started
diff --git a/Documentation/intro-change-screen.txt b/Documentation/intro-change-screen.txt
new file mode 100644
index 0000000..887e454
--- /dev/null
+++ b/Documentation/intro-change-screen.txt
@@ -0,0 +1,212 @@
+Change Screen - Introduction
+============================
+
+As of Gerrit 2.8 the change screen was redesigned from the ground up. The old
+changes screen is deprecated and will be discontinued in one of the next Gerrit
+releases.
+
+The design spirit of the new change screen is simplicity: only one patch set is
+presented on the screen. The list of related changes is always visible and
+optional elements are moved to pop down boxes.
+
+This is not only a facelift. The main highlights are under the hood:
+
+* Old style RPC calls are replaced by the REST API
+* The prettify syntax highlighting library was replaced by Codemirror
+* Automatic refresh of open changes
+* Support to download a patch direct in browser: no local repo is needed
+* JS API integration: it was never so easy to add change/revision actions to
+the UI from a plugin.
+
+This document is intended to help users to switch to the new change screen.
+
+Further information on the topic can be found in the:
+link:https://groups.google.com/forum/#!topic/repo-discuss/6Ryz9p6AzgE[
+CodeScreen2 thread on the repo-discuss mailing list].
+
+[[configuration]]
+Configuration
+~~~~~~~~~~~~~
+
+The new change screen is deactivated by default. It can be activated system-wide
+by changing the link:config-gerrit.html[gerrit.changeScreen] setting to
+`CHANGE_SCREEN2`.  Users can deactivate it by setting `OLD_UI` on their user
+preferences page.
+
+[[switching-between-patch-sets]]
+Switching between patch sets
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+As already mentioned above, the main difference between the old and the new
+change screen is the fact that only one patch set is presented on the screen.
+
+To switch to other patch sets for the given change, the drop down 'Revisions'
+box is used on the right upper side of the change header.
+
+Patch sets are always sorted in descending order. The option to switch between
+ascending and reverse patch set sorting order is not supported on the new change
+screen.
+
+[[download-commands]]
+Download commands
+~~~~~~~~~~~~~~~~~
+
+The download commands are moved to the 'Download' drop down box.  Patch files
+can be downloaded as base64 encoded or zipped versions.
+
+[[quick-approve]]
+Quick approve
+~~~~~~~~~~~~~
+
+The so called 'Quick approve' button is some times confusing. Normal users (i.e.
+non-maintainers) see this as 'Verified+1' button to the right of the 'Reply'
+button.
+
+The button is not always "Verified+1". The button appears if a user has
+permission to vote the max score in exactly one label that the rules have marked
+as NEED.
+
+For a maintainer with both 'Verified+1' and 'Code-Review+2' powers the button
+does not appear, as both categories are still marked NEED and the maintainer has
+permission to use both.  If another maintainer scores 'Code-Review+2', then the
+button displays as 'Verified+1'. If a verifier scores 'Verified+1' the button
+displays as 'Code-Review+2'.
+
+It is important to note that by design, the user cannot provide a comment when
+using this button, hence the name 'Quick approve'. To provide comments, the
+'Reply' button should be used.
+
+[[reply-button]]
+Reply button
+~~~~~~~~~~~~
+
+This button corresponds to the 'Review' button the on patch set panel on the old
+change screen.  The only new feature: the user can optionaly send an email
+during the vote.
+
+Key bindings: "a" to open the drop down. "ESC" to close it.
+
+
+[[edit-commit-message]]
+Edit commit message
+~~~~~~~~~~~~~~~~~~~
+
+To edit the commit message use the 'Edit Message' button on the change header,
+which will open a drop-down editor box.
+
+Key bindings: "e" to open the drop down. "ESC" to close it.
+
+[[edit-change-topic]]
+Edit change topic
+~~~~~~~~~~~~~~~~~
+
+To edit the topic use the edit icon to the right of the topic field.
+
+Key bindings: "t" to open the drop down. "ESC" to close it.
+
+[[abandon-restore]]
+Abandon or Restore changes
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When a change is abandoned or restored, a panel appears and a comment message
+can be provided.
+
+[[working-with-drafts]]
+Working with draft changes and patch sets
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+When a change or a patch set is a draft, then three additional buttons appear on
+the action panel: 'Publish', 'Delete Revision', and 'Delete Change'. In the
+'Revisions' drop down a "(DRAFT)" suffix is added to the patch set number to
+indicate that the patch set is a draft.
+
+[[draft-comments]]
+Highlight draft comments
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a patch set has draft comments that weren't published yet, then that patch
+set is marked on the list in the 'Revisions' drop down list. In addition a red
+"draft" prefix appears on the filenames in the file table.
+
+[[codemirror]]
+Codemirror
+~~~~~~~~~~
+
+On the user preferences page, 'Side By Side' or 'Unified Diff' view can be
+configured.  Use the "/" key to start the CodeMirror search, like in vim.
+
+Key bindings are not customizable at the moment. They may be added in the future.
+
+Range comments are supported on Codemirror's 'Side By Side' screen.  Highlight
+lines with the mouse and then click the bottom-most line number to create a
+range comment for the highlighted lines.
+
+[[reviewers]]
+Reviewers
+~~~~~~~~~
+
+Reviewer are split into two groups: Reviewers who actually voted on the change
+in the 'Reviewers' field, and reviewers, who were added to the change but didn't
+vote yet in the 'CC' field.
+
+The votes per category are listed above the File list.
+
+To add a reviewer, use the '[+]' button to the right of the 'CC' field. Typing
+into the pop-up text field activates auto completion of user or group names.
+
+To remove reviewers click on the 'x' icon in the reviewer's "chip".
+
+Key bindings:  "c" to add a reviewer. "ESC" to close the drop down.
+
+[[auto-refresh]]
+Auto refresh of change data
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+On the new change screen polling for updates to the currently open change is
+activated per default.  For example, if another user votes or comments on the
+same change, then a popup window appears on the bottom right corner of the
+screen to notify the user that the change was updated.
+
+The default delay is 30 seconds.  It can be configured with the
+link:config-gerrit.html[change.updateDelay] setting.
+
+[[depends-on-needed-by]]
+"Depends on" and "Needed by"
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Dependencies and dependent changes are listed in the 'Related Changes' drop
+down.
+
+Key bindings:  "J" & "K" to navigate between the related changes. "O" to
+open the currently selected related change.
+
+[[file-table]]
+File table
+~~~~~~~~~~
+
+The user can now manually toggle the 'reviewed' flag per file using the check
+box to the left of the filename.
+
+Key bindings: "j" & "k" to navigate in the file table, and "r" to toggle the
+'reviewed' flag.
+
+[[included-in]]
+Included in
+~~~~~~~~~~~
+
+To see the branches a specific change was merged into and the list of the tags
+a change was tagged with, use the 'Included In' drop down on the change header,
+to the left of the 'Revisions' drop down.
+
+Note that this list is only visible on merged changes.
+
+[[missing-features]]
+Missing features
+~~~~~~~~~~~~~~~~
+
+Several features have not been implemented yet:
+
+* Permalink a change
+* Allow to see if a reviewer can't vote on a label
+* Allow to select a reference version as base for the comparison
+* Change diff view preferences
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 23787af..77a0091 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
@@ -27,6 +27,7 @@
 import com.google.gerrit.client.ui.NavigationTable;
 import com.google.gerrit.reviewdb.client.Change;
 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.gwt.core.client.GWT;
 import com.google.gwt.core.client.JsArray;
@@ -65,6 +66,7 @@
   interface FileTableCss extends CssResource {
     String pointer();
     String reviewed();
+    String status();
     String pathColumn();
     String draftColumn();
     String newColumn();
@@ -74,7 +76,6 @@
     String commonPrefix();
     String inserted();
     String deleted();
-    String statusTypeCell();
   }
 
   private static final String REVIEWED;
@@ -412,7 +413,7 @@
       sb.openTr();
       sb.openTh().setStyleName(R.css().pointer()).closeTh();
       sb.openTh().setStyleName(R.css().reviewed()).closeTh();
-      sb.openTh().setStyleName(R.css().statusTypeCell()).closeTh();
+      sb.openTh().setStyleName(R.css().status()).closeTh();
       sb.openTh().append(Util.C.patchTableColumnName()).closeTh();
       sb.openTh()
         .setAttribute("colspan", 3)
@@ -450,10 +451,10 @@
     }
 
     private void columnStatus(SafeHtmlBuilder sb, FileInfo info) {
-      sb.openTd().setStyleName(R.css().statusTypeCell());
-      if (Patch.COMMIT_MSG.equals(info.path())) {
-        sb.nbsp();
-      } else {
+      sb.openTd().setStyleName(R.css().status());
+      if (!Patch.COMMIT_MSG.equals(info.path())
+          && info.status() != null
+          && !ChangeType.MODIFIED.matches(info.status())) {
         sb.append(info.status());
       }
       sb.closeTd();
@@ -586,7 +587,7 @@
       sb.openTr();
       sb.openTh().setStyleName(R.css().pointer()).closeTh();
       sb.openTh().setStyleName(R.css().reviewed()).closeTh();
-      sb.openTh().setStyleName(R.css().statusTypeCell()).closeTh();
+      sb.openTh().setStyleName(R.css().status()).closeTh();
       sb.openTd().closeTd(); // path
       sb.openTd().setAttribute("colspan", 3).closeTd(); // comments
 
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 4ded78f..969889f 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
@@ -261,14 +261,14 @@
         name = Integer.toString(ai._account_id());
       }
 
-      html.openSpan();
-      html.setAttribute("role", "listitem");
-      html.setAttribute(DATA_ID, ai._account_id());
-      html.setStyleName(style.label_user());
+      html.openSpan()
+          .setAttribute("role", "listitem")
+          .setAttribute(DATA_ID, ai._account_id())
+          .setStyleName(style.label_user());
       if (img != null) {
-        html.openElement("img");
-        html.setStyleName(style.avatar());
-        html.setAttribute("src", img.url());
+        html.openElement("img")
+            .setStyleName(style.avatar())
+            .setAttribute("src", img.url());
         if (img.width() > 0) {
           html.setAttribute("width", img.width());
         }
@@ -279,10 +279,11 @@
       }
       html.append(name);
       if (removable.contains(ai._account_id())) {
-        html.openElement("button");
-        html.setAttribute("title", Util.M.removeReviewer(name));
-        html.setAttribute("onclick", REMOVE + "(event)");
-        html.append(new ImageResourceRenderer().render(Resources.I.remove_reviewer()));
+        html.openElement("button")
+            .setAttribute("title", Util.M.removeReviewer(name))
+            .setAttribute("onclick", REMOVE + "(event)")
+            .append(new ImageResourceRenderer().render(Resources.I.remove_reviewer()))
+            .closeElement("button");
       }
       html.closeSpan();
     }
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css
index 810c35b..a9d5a38 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/change/file_table.css
@@ -19,6 +19,11 @@
   vertical-align: top;
 }
 
+.status {
+  padding-right: 4px;
+  color: #888;
+}
+
 .pathColumn {
   white-space: nowrap;
   min-width: 600px;
@@ -66,11 +71,3 @@
   background-color: #d44;
 }
 
-.statusTypeCell {
-  width: 1px;
-  padding-left: 5px;
-  padding-right: 5px;
-  border-right: 1px solid trimColor;
-  border-bottom: 1px solid trimColor;
-  vertical-align: top;
-}
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
index 4bdd615..5ebeaf5 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/patches/SideBySideTable.java
@@ -209,7 +209,7 @@
         for (int row = 0; row < lines.size(); row++) {
           setRowItem(row, lines.get(row));
           if (lines.get(row) instanceof SkippedLine) {
-            createSkipLine(row, (SkippedLine) lines.get(row));
+            createSkipLine(row, (SkippedLine) lines.get(row), script.getA().isWholeFile());
           }
         }
       }
@@ -540,16 +540,18 @@
 
     if (numRows > 0) {
       line.incrementStart(numRows);
-      createSkipLine(row + loopTo, line);
+      // If we got here, we must have the whole file anyway.
+      createSkipLine(row + loopTo, line, true);
     } else if (numRows < 0) {
       line.reduceSize(-numRows);
-      createSkipLine(row, line);
+      // If we got here, we must have the whole file anyway.
+      createSkipLine(row, line, true);
     } else {
       table.removeRow(row + loopTo);
     }
   }
 
-  private void createSkipLine(int row, SkippedLine line) {
+  private void createSkipLine(int row, SkippedLine line, boolean isWholeFile) {
     FlowPanel p = new FlowPanel();
     InlineLabel l1 = new InlineLabel(" " + PatchUtil.C.patchSkipRegionStart() + " ");
     InlineLabel l2 = new InlineLabel(" " + PatchUtil.C.patchSkipRegionEnd() + " ");
@@ -558,7 +560,7 @@
     all.addClickHandler(expandAllListener);
     all.setStyleName(Gerrit.RESOURCES.css().skipLine());
 
-    if (line.getSize() > 30) {
+    if (line.getSize() > 30 && isWholeFile) {
       // Only show the expand before/after if skipped more than 30 lines.
       Anchor b = new Anchor(PatchUtil.M.expandBefore(NUM_ROWS_TO_EXPAND), true);
       Anchor a = new Anchor(PatchUtil.M.expandAfter(NUM_ROWS_TO_EXPAND), true);
@@ -574,10 +576,14 @@
       p.add(all);
       p.add(l2);
       p.add(a);
-    } else {
+    } else if (isWholeFile) {
       p.add(l1);
       p.add(all);
       p.add(l2);
+    } else {
+      p.add(l1);
+      p.add(new InlineLabel(" " + line.getSize() + " "));
+      p.add(l2);
     }
     table.setWidget(row, 1, p);
   }
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
index 407784e..efbef76 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/DirectChangeByCommit.java
@@ -2,6 +2,7 @@
 
 package com.google.gerrit.httpd;
 
+import com.google.common.base.CharMatcher;
 import com.google.gerrit.common.PageLinks;
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.server.CurrentUser;
@@ -49,7 +50,7 @@
   @Override
   protected void doGet(final HttpServletRequest req,
       final HttpServletResponse rsp) throws IOException {
-    String query = req.getPathInfo();
+    String query = CharMatcher.is('/').trimTrailingFrom(req.getPathInfo());
     HashSet<Change.Id> ids = new HashSet<Change.Id>();
     try {
       ChangeQueryBuilder builder = queryBuilder.create(currentUser.get());
@@ -69,7 +70,7 @@
         }
       }
     } catch (QueryParseException e) {
-      log.warn("Received invalid query by URL: /r/" + query, e);
+      log.info("Received invalid query by URL: /r/" + query);
     } catch (OrmException e) {
       log.warn("Cannot process query by URL: /r/" + query, e);
     }
diff --git a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java
index 36c9ff1..cf8b4db 100644
--- a/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java
+++ b/gerrit-httpd/src/main/java/com/google/gerrit/httpd/rpc/changedetail/ChangeDetailFactory.java
@@ -214,7 +214,7 @@
       PatchSet.Id id = msg.getPatchSetId();
       if (id != null) {
         PatchSet ps = patchsetsById.get(msg.getPatchSetId());
-        if (control.isPatchVisible(ps, db)) {
+        if (ps != null && control.isPatchVisible(ps, db)) {
           msgList.add(msg);
         }
       } else {
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java
index 6ddd6d2..f5ecd2e 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Patch.java
@@ -97,6 +97,10 @@
       return code;
     }
 
+    public boolean matches(String s) {
+      return s != null && s.length() == 1 && s.charAt(0) == code;
+    }
+
     public static ChangeType forCode(final char c) {
       for (final ChangeType s : ChangeType.values()) {
         if (s.code == c) {
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeAccess.java
index 66df78a..9618bc3 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeAccess.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/ChangeAccess.java
@@ -42,12 +42,11 @@
   @Query("WHERE dest.projectName = ?")
   ResultSet<Change> byProject(Project.NameKey p) throws OrmException;
 
+  @Deprecated
   @Query("WHERE owner = ? AND open = true ORDER BY createdOn, changeId")
   ResultSet<Change> byOwnerOpen(Account.Id id) throws OrmException;
 
-  @Query("WHERE owner = ? AND open = false ORDER BY lastUpdatedOn DESC LIMIT 5")
-  ResultSet<Change> byOwnerClosed(Account.Id id) throws OrmException;
-
+  @Deprecated
   @Query("WHERE owner = ? AND open = false ORDER BY lastUpdatedOn")
   ResultSet<Change> byOwnerClosedAll(Account.Id id) throws OrmException;
 
@@ -58,9 +57,11 @@
   @Query("WHERE status = '" + Change.STATUS_SUBMITTED + "'")
   ResultSet<Change> allSubmitted() throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = true AND sortKey > ? ORDER BY sortKey LIMIT ?")
   ResultSet<Change> allOpenPrev(String sortKey, int limit) throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = true AND sortKey < ? ORDER BY sortKey DESC LIMIT ?")
   ResultSet<Change> allOpenNext(String sortKey, int limit) throws OrmException;
 
@@ -70,6 +71,7 @@
   @Query("WHERE open = true AND dest = ?")
   ResultSet<Change> byBranchOpenAll(Branch.NameKey p) throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = true AND dest.projectName = ? AND sortKey > ?"
       + " ORDER BY sortKey LIMIT ?")
   ResultSet<Change> byProjectOpenPrev(Project.NameKey p, String sortKey,
@@ -80,29 +82,35 @@
   ResultSet<Change> byProjectOpenNext(Project.NameKey p, String sortKey,
       int limit) throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = false AND status = ? AND dest.projectName = ? AND sortKey > ?"
       + " ORDER BY sortKey LIMIT ?")
   ResultSet<Change> byProjectClosedPrev(char status, Project.NameKey p,
       String sortKey, int limit) throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = false AND status = ? AND dest.projectName = ? AND sortKey < ?"
       + " ORDER BY sortKey DESC LIMIT ?")
   ResultSet<Change> byProjectClosedNext(char status, Project.NameKey p,
       String sortKey, int limit) throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = false AND status = ? AND sortKey > ? ORDER BY sortKey LIMIT ?")
   ResultSet<Change> allClosedPrev(char status, String sortKey, int limit)
       throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = false AND status = ? AND sortKey < ? ORDER BY sortKey DESC LIMIT ?")
   ResultSet<Change> allClosedNext(char status, String sortKey, int limit)
       throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = false AND status = ? AND dest = ? AND sortKey > ?"
       + " ORDER BY sortKey LIMIT ?")
   ResultSet<Change> byBranchClosedPrev(char status, Branch.NameKey p,
       String sortKey, int limit) throws OrmException;
 
+  @Deprecated
   @Query("WHERE open = false AND status = ? AND dest = ? AND sortKey < ?"
       + " ORDER BY sortKey DESC LIMIT ?")
   ResultSet<Change> byBranchClosedNext(char status, Branch.NameKey p,
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java
index dae8e6d..25dfdbd 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/PatchSetApprovalAccess.java
@@ -39,15 +39,12 @@
   ResultSet<PatchSetApproval> byPatchSetUser(PatchSet.Id patchSet,
       Account.Id account) throws OrmException;
 
+  @Deprecated
   @Query("WHERE changeOpen = true AND key.accountId = ?")
   ResultSet<PatchSetApproval> openByUser(Account.Id account)
       throws OrmException;
 
-  @Query("WHERE changeOpen = false AND key.accountId = ?"
-      + " ORDER BY changeSortKey DESC LIMIT 10")
-  ResultSet<PatchSetApproval> closedByUser(Account.Id account)
-      throws OrmException;
-
+  @Deprecated
   @Query("WHERE changeOpen = false AND key.accountId = ? ORDER BY changeSortKey")
   ResultSet<PatchSetApproval> closedByUserAll(Account.Id account)
       throws OrmException;
diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/TrackingIdAccess.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/TrackingIdAccess.java
index d8b2cee..9f2bae5 100644
--- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/TrackingIdAccess.java
+++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/server/TrackingIdAccess.java
@@ -29,6 +29,7 @@
   @Query("WHERE key.changeId = ?")
   ResultSet<TrackingId> byChange(Change.Id change) throws OrmException;
 
+  @Deprecated
   @Query("WHERE key.trackingKey = ?")
   ResultSet<TrackingId> byTrackingId(TrackingId.Id trackingId)
       throws OrmException;
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
index 2f1cfa0dc..07ecce2 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/ChangeUtil.java
@@ -56,6 +56,7 @@
 import org.eclipse.jgit.lib.ObjectInserter;
 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.FooterLine;
@@ -496,8 +497,9 @@
     return next;
   }
 
-  public static PatchSet.Id nextPatchSetId(Repository git, PatchSet.Id id) {
-    return nextPatchSetId(git.getAllRefs(), id);
+  public static PatchSet.Id nextPatchSetId(Repository git, PatchSet.Id id)
+      throws IOException {
+    return nextPatchSetId(git.getRefDatabase().getRefs(RefDatabase.ALL), id);
   }
 
   private static PatchSet.Id nextPatchSetId(PatchSet.Id id) {
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
index f5a0313..65b96b3 100644
--- 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
@@ -56,7 +56,8 @@
     Map<String, FileInfo> files = Maps.newTreeMap();
     for (PatchListEntry e : list.getPatches()) {
       FileInfoJson.FileInfo d = new FileInfoJson.FileInfo();
-      d.status = e.getChangeType().getCode();
+      d.status = e.getChangeType() != Patch.ChangeType.MODIFIED
+          ? e.getChangeType().getCode() : null;
       d.oldPath = e.getOldName();
       if (e.getPatchType() == Patch.PatchType.BINARY) {
         d.binary = true;
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
index c773735..595e1c8 100644
--- 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
@@ -40,6 +40,7 @@
 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.RevFlag;
@@ -98,7 +99,7 @@
 
     Repository git = gitManager.openRepository(change.getProject());
     try {
-      Map<String, Ref> refs = git.getAllRefs();
+      Map<String, Ref> refs = git.getRefDatabase().getRefs(RefDatabase.ALL);
       Ref ref = refs.get(change.getDest().get());
       if (isStale(change, ref)) {
         result.mergeable =
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 bc70cef..c64db76 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
@@ -163,7 +163,7 @@
     return this;
   }
 
-  public PatchSet.Id getPatchSetId() {
+  public PatchSet.Id getPatchSetId() throws IOException {
     init();
     return patchSet.getId();
   }
@@ -325,7 +325,7 @@
     return updatedChange;
   }
 
-  private void init() {
+  private void init() throws IOException {
     if (sshInfo == null) {
       sshInfo = new NoSshInfo();
     }
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
index 660dafb..bae0990 100644
--- 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
@@ -19,6 +19,7 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
 
 import com.google.common.base.Objects;
 import com.google.common.collect.ArrayListMultimap;
@@ -404,7 +405,7 @@
     }
 
     try {
-      for (final Ref r : repo.getAllRefs().values()) {
+      for (final Ref r : repo.getRefDatabase().getRefs(ALL).values()) {
         if (r.getName().startsWith(Constants.R_HEADS)) {
           try {
             alreadyAccepted.add(rw.parseCommit(r.getObjectId()));
@@ -425,8 +426,15 @@
     final ListMultimap<SubmitType, Change> toSubmit =
         ArrayListMultimap.create();
 
+    final Map<String, Ref> allRefs;
+    try {
+      allRefs = repo.getRefDatabase().getRefs(ALL);
+    } catch (IOException e) {
+      throw new MergeException(e.getMessage(), e);
+    }
+
     final Set<ObjectId> tips = new HashSet<ObjectId>();
-    for (final Ref r : repo.getAllRefs().values()) {
+    for (final Ref r : allRefs.values()) {
       tips.add(r.getObjectId());
     }
 
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
index 7314c64..594b4e4 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommits.java
@@ -18,6 +18,7 @@
 import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromApprovals;
 import static com.google.gerrit.server.mail.MailUtil.getRecipientsFromFooters;
 import static org.eclipse.jgit.lib.Constants.R_HEADS;
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
 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;
@@ -123,6 +124,7 @@
 import org.eclipse.jgit.transport.AdvertiseRefsHookChain;
 import org.eclipse.jgit.transport.BaseReceivePack;
 import org.eclipse.jgit.transport.ReceiveCommand;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
 import org.eclipse.jgit.transport.ReceiveCommand.Result;
 import org.eclipse.jgit.transport.ReceivePack;
 import org.eclipse.jgit.transport.UploadPack;
@@ -395,10 +397,18 @@
     List<AdvertiseRefsHook> advHooks = new ArrayList<AdvertiseRefsHook>(3);
     advHooks.add(new AdvertiseRefsHook() {
       @Override
-      public void advertiseRefs(BaseReceivePack rp) {
+      public void advertiseRefs(BaseReceivePack rp)
+          throws ServiceMayNotContinueException {
         allRefs = rp.getAdvertisedRefs();
         if (allRefs == null) {
-          allRefs = rp.getRepository().getAllRefs();
+          try {
+            allRefs = rp.getRepository().getRefDatabase().getRefs(ALL);
+          } catch (IOException e) {
+            ServiceMayNotContinueException ex =
+                new ServiceMayNotContinueException(e.getMessage());
+            ex.initCause(e);
+            throw ex;
+          }
         }
         rp.setAdvertisedRefs(allRefs, rp.getAdvertisedObjects());
       }
@@ -1975,7 +1985,7 @@
 
   private Ref findMergedInto(final String first, final RevCommit commit) {
     try {
-      final Map<String, Ref> all = repo.getAllRefs();
+      final Map<String, Ref> all = repo.getRefDatabase().getRefs(ALL);
       Ref firstRef = all.get(first);
       if (firstRef != null && isMergedInto(commit, firstRef)) {
         return firstRef;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java
index ace4e90..530a388 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/ReceiveCommitsAdvertiseRefsHook.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.server.git;
 
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
+
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.gerrit.reviewdb.client.Change;
@@ -30,6 +32,7 @@
 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;
@@ -59,10 +62,18 @@
   }
 
   @Override
-  public void advertiseRefs(BaseReceivePack rp) {
+  public void advertiseRefs(BaseReceivePack rp)
+      throws ServiceMayNotContinueException {
     Map<String, Ref> oldRefs = rp.getAdvertisedRefs();
     if (oldRefs == null) {
-      oldRefs = rp.getRepository().getAllRefs();
+      try {
+        oldRefs = rp.getRepository().getRefDatabase().getRefs(ALL);
+      } catch (IOException e) {
+        ServiceMayNotContinueException ex =
+            new ServiceMayNotContinueException(e.getMessage());
+        ex.initCause(e);
+        throw ex;
+      }
     }
     Map<String, Ref> r = Maps.newHashMapWithExpectedSize(oldRefs.size());
     for (Map.Entry<String, Ref> e : oldRefs.entrySet()) {
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
index f469059..3eb9273 100644
--- 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
@@ -26,6 +26,7 @@
 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;
@@ -159,7 +160,7 @@
     TagWalk rw = new TagWalk(git);
     rw.setRetainBody(false);
     try {
-      for (Ref ref : git.getAllRefs().values()) {
+      for (Ref ref : git.getRefDatabase().getRefs(RefDatabase.ALL).values()) {
         if (skip(ref)) {
           continue;
 
@@ -186,7 +187,7 @@
         }
       }
     } catch (IOException e) {
-      log.warn("Repository " + projectName + " has corruption", e);
+      log.warn("Error building tags for repository " + projectName, e);
     } finally {
       rw.release();
     }
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
index 5cd0def..8c65b1a 100644
--- 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
@@ -24,12 +24,15 @@
 import com.google.gwtorm.server.OrmException;
 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.RevWalk;
 import org.eclipse.jgit.transport.AbstractAdvertiseRefsHook;
+import org.eclipse.jgit.transport.ServiceMayNotContinueException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
@@ -120,9 +123,16 @@
   }
 
   @Override
-  protected Map<String, Ref> getAdvertisedRefs(
-      Repository repository, RevWalk revWalk) {
-    return filter(repository.getAllRefs());
+  protected Map<String, Ref> getAdvertisedRefs(Repository repository,
+      RevWalk revWalk) throws ServiceMayNotContinueException {
+    try {
+      return filter(repository.getRefDatabase().getRefs(RefDatabase.ALL));
+    } catch (IOException e) {
+      ServiceMayNotContinueException ex =
+          new ServiceMayNotContinueException(e.getMessage());
+      ex.initCause(e);
+      throw ex;
+    }
   }
 
   private Map<String, Ref> filter(Map<String, Ref> refs) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeBatchIndexer.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeBatchIndexer.java
index 0dbf1af..c1ee9b0 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeBatchIndexer.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeBatchIndexer.java
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.server.index;
 
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
+
 import com.google.common.base.Stopwatch;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
@@ -203,7 +205,7 @@
         Multimap<ObjectId, ChangeData> byId = ArrayListMultimap.create();
         Repository repo = repoManager.openRepository(project);
         try {
-          Map<String, Ref> refs = repo.getAllRefs();
+          Map<String, Ref> refs = repo.getRefDatabase().getRefs(ALL);
           for (Change c : db.get().changes().byProject(project)) {
             Ref r = refs.get(c.currentPatchSetId().toRefName());
             if (r != null) {
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
index fd37cfb..397b044 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/ChangeIndex.java
@@ -125,6 +125,11 @@
   /**
    * 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
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java
index 2185af3..f915dad 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/index/IndexedChangeQuery.java
@@ -91,8 +91,9 @@
       Predicate<ChangeData> pred, int limit) throws QueryParseException {
     this.db = db;
     this.index = index;
-    this.pred = pred;
     this.limit = limit;
+    this.pred = pred;
+    this.source = index.getSource(pred, limit);
   }
 
   @Override
@@ -131,14 +132,8 @@
 
   @Override
   public ResultSet<ChangeData> read() throws OrmException {
-    final ChangeDataSource currSource;
-    try {
-      currSource = index.getSource(pred, limit);
-    } catch (QueryParseException e) {
-      throw new OrmException(e);
-    }
-    source = currSource;
-    final ResultSet<ChangeData> rs = source.read();
+    final ChangeDataSource currSource = source;
+    final ResultSet<ChangeData> rs = currSource.read();
 
     return new ResultSet<ChangeData>() {
       @Override
@@ -174,6 +169,14 @@
   @Override
   public ResultSet<ChangeData> restart(ChangeData last) throws OrmException {
     pred = replaceSortKeyPredicates(pred, last.change(db).getSortKey());
+    try {
+      source = index.getSource(pred, limit);
+    } catch (QueryParseException e) {
+      // Don't need to show this exception to the user; the only thing that
+      // changed about pred was its SortKeyPredicates, and any other QPEs
+      // that might happen should have already thrown from the constructor.
+      throw new OrmException(e);
+    }
     return read();
   }
 
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
index 0c29ec8..eab6ed9 100644
--- 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
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.server.project;
 
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
+
 import com.google.gerrit.common.ChangeHooks;
 import com.google.gerrit.common.errors.InvalidRevisionException;
 import com.google.gerrit.extensions.restapi.AuthException;
@@ -214,7 +216,7 @@
       } catch (IncorrectObjectTypeException err) {
         throw new InvalidRevisionException();
       }
-      for (final Ref r : repo.getAllRefs().values()) {
+      for (final Ref r : repo.getRefDatabase().getRefs(ALL).values()) {
         try {
           rw.markUninteresting(rw.parseAny(r.getObjectId()));
         } catch (MissingObjectException err) {
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
index b01c757..7ed5b5f 100644
--- 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
@@ -24,6 +24,7 @@
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 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 java.io.IOException;
@@ -59,7 +60,7 @@
     }
 
     try {
-      final Map<String, Ref> all = db.getAllRefs();
+      final Map<String, Ref> all = db.getRefDatabase().getRefs(RefDatabase.ALL);
 
       if (!all.containsKey(Constants.HEAD)) {
         // The branch pointed to by HEAD doesn't exist yet, so getAllRefs
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
index 2ae42a4..f98822f 100644
--- 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
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.server.project;
 
+import static org.eclipse.jgit.lib.RefDatabase.ALL;
+
 import com.google.common.collect.Lists;
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.common.PageLinks;
@@ -29,7 +31,6 @@
 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.Project.NameKey;
 import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.IdentifiedUser;
 import com.google.gerrit.server.InternalUser;
@@ -489,11 +490,12 @@
   }
 
   public boolean canReadCommit(RevWalk rw, RevCommit commit) {
-    NameKey projName = state.getProject().getNameKey();
+    Project.NameKey projName = state.getProject().getNameKey();
     try {
       Repository repo = repoManager.openRepository(projName);
       try {
-        for (Entry<String, Ref> entry : repo.getAllRefs().entrySet()) {
+        Map<String, Ref> allRefs = repo.getRefDatabase().getRefs(ALL);
+        for (Entry<String, Ref> entry : allRefs.entrySet()) {
           RevCommit tip;
           try {
             tip = rw.parseCommit(entry.getValue().getObjectId());
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 34fe3fb..c94ee12 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
@@ -81,6 +81,7 @@
       @Named("S") final SortKeyPredicate.After s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(40000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -105,6 +106,7 @@
       @Named("S") final SortKeyPredicate.Before s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(40000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -128,6 +130,7 @@
       @Named("S") final SortKeyPredicate.After s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(500, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -170,6 +173,7 @@
       @Named("S") final SortKeyPredicate.After s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(40000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -192,6 +196,7 @@
       @Named("S") final SortKeyPredicate.Before s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(40000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -214,6 +219,7 @@
       @Named("S") final SortKeyPredicate.After s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(40000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -236,6 +242,7 @@
       @Named("S") final SortKeyPredicate.Before s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(40000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -257,6 +264,7 @@
       @Named("S") final SortKeyPredicate.After s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(2000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -275,6 +283,7 @@
       @Named("S") final SortKeyPredicate.Before s,
       @Named("L") final IntPredicate<ChangeData> l) {
     return new PaginatedSource(2000, s.getValue(), l.intValue()) {
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -298,6 +307,7 @@
         init("r20_byMergedPrev", s, l);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -322,6 +332,7 @@
         init("r20_byMergedNext", s, l);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -346,6 +357,7 @@
         init("r20_byAbandonedPrev", s, l);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -370,6 +382,7 @@
         init("r20_byAbandonedNext", s, l);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a, String key, int limit)
           throws OrmException {
@@ -409,6 +422,7 @@
         init("r25_byOwnerOpen", o);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a) throws OrmException {
         return a.byOwnerOpen(o.getAccountId());
@@ -430,6 +444,7 @@
         init("r25_byOwnerClosed", o);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       ResultSet<Change> scan(ChangeAccess a) throws OrmException {
         return a.byOwnerClosedAll(o.getAccountId());
@@ -457,6 +472,7 @@
         init("r30_byReviewerOpen", r);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       public ResultSet<ChangeData> read() throws OrmException {
         return ChangeDataResultSet.patchSetApproval(dbProvider.get()
@@ -490,6 +506,7 @@
         init("r30_byReviewerClosed", r);
       }
 
+      @SuppressWarnings("deprecation")
       @Override
       public ResultSet<ChangeData> read() throws OrmException {
         return ChangeDataResultSet.patchSetApproval(dbProvider.get()
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
index 38b3d0c..89e5ba9 100644
--- 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
@@ -46,6 +46,7 @@
     return false;
   }
 
+  @SuppressWarnings("deprecation")
   @Override
   public ResultSet<ChangeData> read() throws OrmException {
     HashSet<Change.Id> ids = new HashSet<Change.Id>();
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java
index 2409b12e..27bf0bc 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/schema/Schema_56.java
@@ -24,6 +24,7 @@
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
 import org.eclipse.jgit.lib.Repository;
 
@@ -61,7 +62,15 @@
         continue;
       }
       try {
-        Map<String, Ref> all = git.getAllRefs();
+        Map<String, Ref> all;
+        try {
+          all = git.getRefDatabase().getRefs(RefDatabase.ALL);
+        } catch (IOException e) {
+          ui.message("warning: " + name.get() + ": Cannot read refs: "
+              + e.getMessage());
+          e.printStackTrace();
+          continue;
+        }
         if (all.keySet().equals(keysOne) || all.keySet().equals(keysTwo)) {
           try {
             RefUpdate update = git.updateRef(Constants.HEAD);
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 b0ed650..b071e3d 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
@@ -14,6 +14,8 @@
 
 package com.google.gerrit.sshd.commands;
 
+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;
@@ -88,30 +90,33 @@
 
     IdentifiedUser user = userFactory.create(userAccount.getId());
     ProjectControl userProjectControl = projectControl.forUser(user);
-    Repository repo = null;
+    Repository repo;
     try {
       repo = repoManager.openRepository(userProjectControl.getProject()
               .getNameKey());
-
-      Map<String, Ref> refsMap =
-          new VisibleRefFilter(tagCache, changeCache, repo, userProjectControl,
-              db, true).filter(repo.getAllRefs(), false);
-
-      for (final String ref : refsMap.keySet()) {
-        if (!onlyRefsHeads || ref.startsWith(Branch.R_HEADS)) {
-          stdout.println(ref);
-        }
-      }
     } catch (RepositoryNotFoundException e) {
       throw new UnloggedFailure("fatal: '"
           + projectControl.getProject().getNameKey() + "': not a git archive");
     } catch (IOException e) {
       throw new UnloggedFailure("fatal: Error opening: '"
           + projectControl.getProject().getNameKey());
-    } finally {
-      if (repo != null) {
-        repo.close();
+    }
+
+    try {
+      Map<String, Ref> refsMap =
+          new VisibleRefFilter(tagCache, changeCache, repo, userProjectControl,
+              db, true).filter(repo.getRefDatabase().getRefs(ALL), false);
+
+      for (final String ref : refsMap.keySet()) {
+        if (!onlyRefsHeads || ref.startsWith(Branch.R_HEADS)) {
+          stdout.println(ref);
+        }
       }
+    } catch (IOException e) {
+      throw new Failure(1, "fatal: Error reading refs: '"
+          + projectControl.getProject().getNameKey(), e);
+    } finally {
+      repo.close();
     }
   }
 }
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 cd50499..31f9301 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
@@ -28,6 +28,7 @@
 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;
@@ -141,8 +142,10 @@
               + ref.getName() + "\n");
         }
 
+        Map<String, Ref> allRefs =
+            rp.getRepository().getRefDatabase().getRefs(RefDatabase.ALL);
         List<Ref> hidden = new ArrayList<Ref>();
-        for (Ref ref : rp.getRepository().getAllRefs().values()) {
+        for (Ref ref : allRefs.values()) {
           if (!adv.containsKey(ref.getName())) {
             hidden.add(ref);
           }
diff --git a/lib/asciidoctor/BUCK b/lib/asciidoctor/BUCK
index af6e31e..d27d11a 100644
--- a/lib/asciidoctor/BUCK
+++ b/lib/asciidoctor/BUCK
@@ -16,6 +16,7 @@
     '//lib:args4j',
     '//lib:guava',
   ],
+  visibility = ['//tools/eclipse:classpath'],
 )
 
 java_binary(
@@ -35,6 +36,7 @@
     '//lib/lucene:analyzers-common',
     '//lib/lucene:core',
   ],
+  visibility = ['//tools/eclipse:classpath'],
 )
 
 maven_jar(
diff --git a/lib/asciidoctor/java/AsciiDoctor.java b/lib/asciidoctor/java/AsciiDoctor.java
index 3e7f5e3..a5bf492 100644
--- a/lib/asciidoctor/java/AsciiDoctor.java
+++ b/lib/asciidoctor/java/AsciiDoctor.java
@@ -15,7 +15,6 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
-import java.io.FileReader;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.HashMap;
diff --git a/lib/asciidoctor/java/DocIndexer.java b/lib/asciidoctor/java/DocIndexer.java
index 1185f5a..5da7858 100644
--- a/lib/asciidoctor/java/DocIndexer.java
+++ b/lib/asciidoctor/java/DocIndexer.java
@@ -40,8 +40,7 @@
 import org.kohsuke.args4j.Option;
 
 public class DocIndexer {
-
-  private static final Version LUCENE_VERSION = Version.LUCENE_43;
+  private static final Version LUCENE_VERSION = Version.LUCENE_44;
   private static final String DOC_FIELD = "doc";
   private static final String URL_FIELD = "url";
 
diff --git a/tools/eclipse/BUCK b/tools/eclipse/BUCK
index 874c3fc..9d6dd53 100644
--- a/tools/eclipse/BUCK
+++ b/tools/eclipse/BUCK
@@ -10,6 +10,8 @@
     '//gerrit-httpd:httpd_tests',
     '//gerrit-main:main_lib',
     '//gerrit-server:server__compile',
+    '//lib/asciidoctor:asciidoc_lib',
+    '//lib/asciidoctor:doc_indexer_lib',
     '//lib/prolog:compiler_lib',
   ] + scan_plugins(),
 )