diff --git a/ReleaseNotes/ReleaseNotes-2.8.txt b/ReleaseNotes/ReleaseNotes-2.8.txt
index 59c807e..1c63983f 100644
--- a/ReleaseNotes/ReleaseNotes-2.8.txt
+++ b/ReleaseNotes/ReleaseNotes-2.8.txt
@@ -70,6 +70,9 @@
 information and enforce them on the user profile during login and beyond.
 
 * link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_gerrit.html#_a_id_httpd_a_section_httpd[
+Customizable registration page for HTTP authentication].
+
+* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/config_gerrit.html#_a_id_httpd_a_section_httpd[
 Configurable external `robots.txt` file].
 
 * Support for
@@ -249,6 +252,9 @@
 * link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#get-child-project[
 Get child project]
 
+* link:http://gerrit-documentation.googlecode.com/svn/Documentation/2.8/rest-api-projects.html#set-config[
+Set configuration]
+
 
 Capabilities
 ~~~~~~~~~~~~
@@ -278,6 +284,9 @@
 * The `RebasedPatchSet` template is removed.  Email notifications for rebased
 changes are now sent with the `ReplacePatchSet` template.
 
+* Comment notification emails now include context of comments that are replied
+to, and links to the file(s) in which comments are made.
+
 
 Plugins
 ~~~~~~~
@@ -383,6 +392,9 @@
 Since there can be multiple changes with the same commit on different branches,
 use the parent change on the same branch during rebase.
 
+* link:https://code.google.com/p/gerrit/issues/detail?id=600[Issue 600]:
+Fix change stuck in SUBMITTED state but actually merged.
+
 Configuration
 ~~~~~~~~~~~~~
 
@@ -400,6 +412,9 @@
 * link:https://code.google.com/p/gerrit/issues/detail?id=2045[Issue 2045]:
 Define user scope when parsing server config.
 
+* link:https://code.google.com/p/gerrit/issues/detail?id=1990[Issue 1990]:
+Support optional Certificate Revocation List (CRL) with `CLIENT_SSL_CERT_LDAP`.
+
 Web UI
 ~~~~~~
 
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
index 3c38374..e462e2b 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.java
@@ -42,6 +42,7 @@
     String hideNumber();
     String range();
     String rangeHighlight();
+    String showtabs();
   }
 
   @UiField
diff --git a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
index 58940f2..4714fca 100644
--- a/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
+++ b/gerrit-gwtui/src/main/java/com/google/gerrit/client/diff/DiffTable.ui.xml
@@ -21,7 +21,7 @@
     @external .CodeMirror, .CodeMirror-lines, .CodeMirror-selectedtext;
     @external .CodeMirror-linenumber, .CodeMirror-vscrollbar;
     @external .cm-keymap-fat-cursor, CodeMirror-cursor;
-    @external .cm-searching, .cm-trailingspace;
+    @external .cm-searching, .cm-trailingspace, .cm-tab;
     .difftable .CodeMirror-lines {
       padding: 0;
     }
@@ -108,6 +108,10 @@
       opacity: 0.8;
       z-index: 2;
     }
+    .showtabs .cm-tab:before {
+      content: "\00bb";
+      color: #f00;
+    }
   </ui:style>
   <g:HTMLPanel styleName='{style.difftable}'>
     <table class='{style.table}'>
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 e37e8c1..8972102 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
@@ -126,7 +126,7 @@
   private CommentLinkProcessor commentLinkProcessor;
   private Map<String, PublishedBox> publishedMap;
   private Map<LineHandle, CommentBox> lineActiveBoxMap;
-  private Map<LineHandle, PublishedBox> lineLastPublishedBoxMap;
+  private Map<LineHandle, List<PublishedBox>> linePublishedBoxesMap;
   private Map<LineHandle, PaddingManager> linePaddingManagerMap;
   private Map<LineHandle, LinePaddingWidgetWrapper> linePaddingOnOtherSideMap;
   private List<DiffChunkInfo> diffChunks;
@@ -297,8 +297,6 @@
       }
     });
     cm.addKeyMap(KeyMap.create()
-        .on("'j'", moveCursorDown(cm, 1))
-        .on("'k'", moveCursorDown(cm, -1))
         .on("'a'", openReplyBox())
         .on("'u'", upToChange())
         .on("'r'", toggleReviewed())
@@ -330,8 +328,9 @@
             new ShowHelpCommand().onKeyPress(null);
           }
         })
-        .on("Alt-N", diffChunkNav(cm, false))
-        .on("Alt-P", diffChunkNav(cm, true))
+        .on("N", maybeNextVimSearch(cm))
+        .on("P", diffChunkNav(cm, true))
+        .on("Shift-O", openClosePublished(cm))
         .on("Shift-Left", flipCursorSide(cm, true))
         .on("Shift-Right", flipCursorSide(cm, false)));
   }
@@ -416,7 +415,7 @@
     render(diffInfo);
     Collections.sort(diffChunks, getDiffChunkComparator());
     lineActiveBoxMap = new HashMap<LineHandle, CommentBox>();
-    lineLastPublishedBoxMap = new HashMap<LineHandle, PublishedBox>();
+    linePublishedBoxesMap = new HashMap<LineHandle, List<PublishedBox>>();
     linePaddingManagerMap = new HashMap<LineHandle, PaddingManager>();
     if (publishedBase != null || publishedRevision != null) {
       publishedMap = new HashMap<String, PublishedBox>();
@@ -442,6 +441,9 @@
         resizeCodeMirror();
       }
     });
+    if (pref.isShowTabs()) {
+      diffTable.addStyleName(DiffTable.style.showtabs());
+    }
   }
 
   private CodeMirror displaySide(DiffInfo.FileMeta meta, String contents,
@@ -628,8 +630,9 @@
   void removeDraft(DraftBox box, int line) {
     LineHandle handle = getCmFromSide(box.getSide()).getLineHandle(line);
     lineActiveBoxMap.remove(handle);
-    if (lineLastPublishedBoxMap.containsKey(handle)) {
-      lineActiveBoxMap.put(handle, lineLastPublishedBoxMap.get(handle));
+    if (linePublishedBoxesMap.containsKey(handle)) {
+      List<PublishedBox> list = linePublishedBoxesMap.get(handle);
+      lineActiveBoxMap.put(handle, list.get(list.size() - 1));
     }
   }
 
@@ -677,7 +680,13 @@
       }
       int line = info.line() - 1;
       LineHandle handle = cm.getLineHandle(line);
-      lineLastPublishedBoxMap.put(handle, box);
+      if (linePublishedBoxesMap.containsKey(handle)) {
+        linePublishedBoxesMap.get(handle).add(box);
+      } else {
+        List<PublishedBox> list = new ArrayList<PublishedBox>();
+        list.add(box);
+        linePublishedBoxesMap.put(handle, list);
+      }
       lineActiveBoxMap.put(handle, box);
       addCommentBox(info, box);
     }
@@ -1065,14 +1074,6 @@
     };
   }
 
-  private Runnable moveCursorDown(final CodeMirror cm, final int numLines) {
-    return new Runnable() {
-      public void run() {
-        cm.moveCursorDown(numLines);
-      }
-    };
-  }
-
   private Runnable openReplyBox() {
     return new Runnable() {
       public void run() {
@@ -1085,6 +1086,31 @@
     };
   }
 
+  private Runnable openClosePublished(final CodeMirror cm) {
+    return new Runnable() {
+      @Override
+      public void run() {
+        if (cm.hasActiveLine()) {
+          List<PublishedBox> list =
+              linePublishedBoxesMap.get(cm.getActiveLine());
+          if (list == null) {
+            return;
+          }
+          boolean open = false;
+          for (PublishedBox box : list) {
+            if (!box.isOpen()) {
+              open = true;
+              break;
+            }
+          }
+          for (PublishedBox box : list) {
+            box.setOpen(open);
+          }
+        }
+      }
+    };
+  }
+
   private Runnable upToChange() {
     return new Runnable() {
       public void run() {
@@ -1117,6 +1143,19 @@
     };
   }
 
+  private Runnable maybeNextVimSearch(final CodeMirror cm) {
+    return new Runnable() {
+      @Override
+      public void run() {
+        if (cm.hasVimSearchHighlight()) {
+          CodeMirror.handleVimKey(cm, "n");
+        } else {
+          diffChunkNav(cm, false).run();
+        }
+      }
+    };
+  }
+
   private Runnable diffChunkNav(final CodeMirror cm, final boolean prev) {
     return new Runnable() {
       @Override
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
index 8286ed6..4db989c 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/CodeMirror.java
@@ -265,10 +265,6 @@
     return this.lineCount();
   }-*/;
 
-  public final native void moveCursorDown(int numLines) /*-{
-    this.moveV(numLines, "line");
-  }-*/;
-
   public final native Element getGutterElement() /*-{
     return this.getGutterElement();
   }-*/;
@@ -307,6 +303,19 @@
     $wnd.CodeMirror.keyMap[name] = km;
   }-*/;
 
+  public static final native void handleVimKey(CodeMirror cm, String key) /*-{
+    $wnd.CodeMirror.Vim.handleKey(cm, key);
+  }-*/;
+
+  public static final native void mapVimKey(String alias, String actual) /*-{
+    $wnd.CodeMirror.Vim.map(alias, actual);
+  }-*/;
+
+  public final native boolean hasVimSearchHighlight() /*-{
+    return this.state.vim && this.state.vim.searchState_ &&
+        !!this.state.vim.searchState_.getOverlay();
+  }-*/;
+
   protected CodeMirror() {
   }
 
diff --git a/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java b/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java
index 37adf1e..2a515b7 100644
--- a/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java
+++ b/gerrit-gwtui/src/main/java/net/codemirror/lib/Loader.java
@@ -90,10 +90,14 @@
   private static void initVimKeys() {
     // TODO: Better custom keybindings, remove temporary navigation hacks.
     KeyMap km = CodeMirror.cloneKeyMap("vim");
-    for (String s : new String[] {"A", "C", "J", "K", "O", "R", "U", "Ctrl-C"}) {
+    for (String s : new String[] {"A", "C", "O", "R", "U", "Ctrl-C"}) {
       km.remove(s);
     }
     CodeMirror.addKeyMap("vim_ro", km);
+    CodeMirror.mapVimKey("j", "gj");
+    CodeMirror.mapVimKey("k", "gk");
+    CodeMirror.mapVimKey("Down", "gj");
+    CodeMirror.mapVimKey("Up", "gk");
   }
 
   private static void error(Exception e) {
diff --git a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
index 91dd015..f809f49 100644
--- a/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
+++ b/gerrit-lucene/src/main/java/com/google/gerrit/lucene/LuceneVersionManager.java
@@ -114,6 +114,13 @@
       throw fail(e);
     }
 
+    if (!sitePaths.index_dir.exists()) {
+      throw new ProvisionException("No index versions ready; run Reindex");
+    } else if (!sitePaths.index_dir.isDirectory()) {
+      log.warn("Not a directory: %s", sitePaths.index_dir.getAbsolutePath());
+      throw new ProvisionException("No index versions ready; run Reindex");
+    }
+
     TreeMap<Integer, Version> versions = scanVersions(cfg);
     // Search from the most recent ready version.
     // Write to the most recent ready version and the most recent version.
@@ -162,7 +169,7 @@
     for (Schema<ChangeData> schema : ChangeSchemas.ALL.values()) {
       File f = getDir(sitePaths, schema);
       boolean exists = f.exists() && f.isDirectory();
-      if (exists && !f.isDirectory()) {
+      if (f.exists() && !f.isDirectory()) {
         log.warn("Not a directory: %s", f.getAbsolutePath());
       }
       int v = schema.getVersion();
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 4277307..5b3f59a 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
@@ -231,25 +231,27 @@
   }
 
   private void appendQuotedParent(StringBuilder out, PatchLineComment child) {
-    PatchLineComment parent;
-    try {
-      parent = args.db.get().patchComments().get(
-          new PatchLineComment.Key(
-              child.getKey().getParentKey(),
-              child.getParentUuid()));
-    } catch (OrmException e) {
-      parent = null;
-    }
-    if (parent != null) {
-      String msg = parent.getMessage().trim();
-      if (msg.length() > 75) {
-        msg = msg.substring(0, 75);
+    if (child.getParentUuid() != null) {
+      PatchLineComment parent;
+      try {
+        parent = args.db.get().patchComments().get(
+            new PatchLineComment.Key(
+                child.getKey().getParentKey(),
+                child.getParentUuid()));
+      } catch (OrmException e) {
+        parent = null;
       }
-      int lf = msg.indexOf('\n');
-      if (lf > 0) {
-        msg = msg.substring(0, lf);
+      if (parent != null) {
+        String msg = parent.getMessage().trim();
+        if (msg.length() > 75) {
+          msg = msg.substring(0, 75);
+        }
+        int lf = msg.indexOf('\n');
+        if (lf > 0) {
+          msg = msg.substring(0, lf);
+        }
+        out.append("> ").append(msg).append('\n');
       }
-      out.append("> ").append(msg).append('\n');
     }
   }
 
diff --git a/plugins/cookbook-plugin b/plugins/cookbook-plugin
index cae2762..ce6467a 160000
--- a/plugins/cookbook-plugin
+++ b/plugins/cookbook-plugin
@@ -1 +1 @@
-Subproject commit cae2762b4882d5ba34ac3f2773f21d2acd748dfe
+Subproject commit ce6467a8e68ddfc564a106c63e3cf0f92a071229
