Merge changes I332152c3,I7d36578e,Ib6fb9bdd

* changes:
  ChangeScreen2: Do not display 'M' next to modified files
  ChangeScreen2: Clean up FileTable status column CSS
  ChangeScreen2: Remove unnecessary   in FileTable
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/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-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/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..749bae3 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;
@@ -110,6 +111,7 @@
 import org.eclipse.jgit.lib.ObjectReader;
 import org.eclipse.jgit.lib.PersonIdent;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.notes.NoteMap;
 import org.eclipse.jgit.revwalk.FooterKey;
@@ -123,6 +125,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 +398,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 +1986,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..01b684f 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;
@@ -44,6 +46,7 @@
 import org.eclipse.jgit.lib.ObjectInserter;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Ref;
+import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.Repository;
 import org.eclipse.jgit.revwalk.RevCommit;
 import org.eclipse.jgit.revwalk.RevObject;
@@ -203,7 +206,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/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..8e5504c 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;
@@ -493,7 +495,8 @@
     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/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);
           }