diff --git a/Documentation/BUCK b/Documentation/BUCK
index f070d7e..5ea58fd 100644
--- a/Documentation/BUCK
+++ b/Documentation/BUCK
@@ -19,7 +19,7 @@
   srcs = glob([
       'images/*.jpg',
       'images/*.png',
-    ]) + ['doc.css'],
+    ]) + [':doc.css'],
   out = 'html.zip',
   visibility = ['PUBLIC'],
 )
@@ -39,6 +39,13 @@
   out = 'licenses.txt',
 )
 
+genrule(
+  name = 'doc.css',
+  srcs = ['doc.css.in'],
+  cmd = 'cp $SRCS $OUT',
+  out = 'doc.css',
+)
+
 python_binary(
   name = 'gen_licenses',
   main = 'gen_licenses.py',
diff --git a/Documentation/asciidoc.defs b/Documentation/asciidoc.defs
index 4d00c50..6581dd7 100644
--- a/Documentation/asciidoc.defs
+++ b/Documentation/asciidoc.defs
@@ -34,7 +34,7 @@
   for attribute in attributes:
     asciidoc.extend(['-a', attribute])
   asciidoc.append('$SRCS')
-  newsrcs = ["doc.css"]
+  newsrcs = [":doc.css"]
   for src in srcs:
     fn = src
     # We have two cases: regular source files and generated files.
diff --git a/Documentation/doc.css b/Documentation/doc.css.in
similarity index 100%
rename from Documentation/doc.css
rename to Documentation/doc.css.in
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
index 441e31c..5a1e50d 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/SubmoduleOp.java
@@ -102,7 +102,7 @@
       @Assisted final Map<Change.Id, CodeReviewCommit> commits,
       @GerritPersonIdent final PersonIdent myIdent,
       GitRepositoryManager repoManager, GitReferenceUpdated gitRefUpdated,
-      @Assisted Account account, ChangeHooks changeHooks) {
+      @Nullable @Assisted Account account, ChangeHooks changeHooks) {
     this.destBranch = destBranch;
     this.mergeTip = mergeTip;
     this.rw = rw;
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
index 15f8f92..cad5174 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/git/validators/CommitValidators.java
@@ -18,11 +18,9 @@
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.common.PageLinks;
 import com.google.gerrit.extensions.registration.DynamicSet;
-import com.google.gerrit.reviewdb.client.Account;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.IdentifiedUser;
-import com.google.gerrit.server.account.Realm;
 import com.google.gerrit.server.config.CanonicalWebUrl;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.events.CommitReceivedEvent;
@@ -75,7 +73,6 @@
   private final SshInfo sshInfo;
   private final Repository repo;
   private final DynamicSet<CommitValidationListener> commitValidationListeners;
-  private final Realm realm;
 
   @Inject
   CommitValidators(@GerritPersonIdent final PersonIdent gerritIdent,
@@ -83,8 +80,7 @@
       @GerritServerConfig final Config config,
       final DynamicSet<CommitValidationListener> commitValidationListeners,
       @Assisted final SshInfo sshInfo,
-      @Assisted final Repository repo, @Assisted final RefControl refControl,
-      Realm realm) {
+      @Assisted final Repository repo, @Assisted final RefControl refControl) {
     this.gerritIdent = gerritIdent;
     this.refControl = refControl;
     this.canonicalWebUrl = canonicalWebUrl;
@@ -93,7 +89,6 @@
     this.sshInfo = sshInfo;
     this.repo = repo;
     this.commitValidationListeners = commitValidationListeners;
-    this.realm = realm;
   }
 
   public List<CommitValidationMessage> validateForReceiveCommits(
@@ -105,10 +100,8 @@
     validators.add(new UploadMergesPermissionValidator(refControl));
     validators.add(new AmendedGerritMergeCommitValidationListener(
         refControl, gerritIdent));
-    validators.add(new AuthorUploaderValidator(refControl, canonicalWebUrl,
-        realm));
-    validators.add(new CommitterUploaderValidator(refControl, canonicalWebUrl,
-        realm));
+    validators.add(new AuthorUploaderValidator(refControl, canonicalWebUrl));
+    validators.add(new CommitterUploaderValidator(refControl, canonicalWebUrl));
     validators.add(new SignedOffByValidator(refControl, canonicalWebUrl));
     if (MagicBranch.isMagicBranch(receiveEvent.command.getRefName())
         || ReceiveCommits.NEW_PATCHSET.matcher(
@@ -142,8 +135,7 @@
     validators.add(new UploadMergesPermissionValidator(refControl));
     validators.add(new AmendedGerritMergeCommitValidationListener(
         refControl, gerritIdent));
-    validators.add(new AuthorUploaderValidator(refControl, canonicalWebUrl,
-        realm));
+    validators.add(new AuthorUploaderValidator(refControl, canonicalWebUrl));
     validators.add(new SignedOffByValidator(refControl, canonicalWebUrl));
     if (MagicBranch.isMagicBranch(receiveEvent.command.getRefName())
         || ReceiveCommits.NEW_PATCHSET.matcher(
@@ -443,13 +435,10 @@
       CommitValidationListener {
     private final RefControl refControl;
     private final String canonicalWebUrl;
-    private final Realm realm;
 
-    public AuthorUploaderValidator(RefControl refControl,
-        String canonicalWebUrl, Realm realm) {
+    public AuthorUploaderValidator(RefControl refControl, String canonicalWebUrl) {
       this.refControl = refControl;
       this.canonicalWebUrl = canonicalWebUrl;
-      this.realm = realm;
     }
 
     @Override
@@ -463,7 +452,7 @@
         List<CommitValidationMessage> messages = new LinkedList<>();
 
         messages.add(getInvalidEmailError(receiveEvent.commit, "author", author,
-            currentUser, canonicalWebUrl, realm));
+            currentUser, canonicalWebUrl));
         throw new CommitValidationException("invalid author", messages);
       }
       return Collections.emptyList();
@@ -475,13 +464,11 @@
       CommitValidationListener {
     private final RefControl refControl;
     private final String canonicalWebUrl;
-    private final Realm realm;
 
     public CommitterUploaderValidator(RefControl refControl,
-        String canonicalWebUrl, Realm realm) {
+        String canonicalWebUrl) {
       this.refControl = refControl;
       this.canonicalWebUrl = canonicalWebUrl;
-      this.realm = realm;
     }
 
     @Override
@@ -493,8 +480,8 @@
           .contains(committer.getEmailAddress())
           && !refControl.canForgeCommitter()) {
         List<CommitValidationMessage> messages = new LinkedList<>();
-        messages.add(getInvalidEmailError(receiveEvent.commit, "committer",
-            committer, currentUser, canonicalWebUrl, realm));
+        messages.add(getInvalidEmailError(receiveEvent.commit, "committer", committer,
+            currentUser, canonicalWebUrl));
         throw new CommitValidationException("invalid committer", messages);
       }
       return Collections.emptyList();
@@ -558,9 +545,8 @@
     }
   }
 
-  private static CommitValidationMessage getInvalidEmailError(RevCommit c,
-      String type, PersonIdent who, IdentifiedUser currentUser,
-      String canonicalWebUrl, Realm realm) {
+  private static CommitValidationMessage getInvalidEmailError(RevCommit c, String type,
+      PersonIdent who, IdentifiedUser currentUser, String canonicalWebUrl) {
     StringBuilder sb = new StringBuilder();
     sb.append("\n");
     sb.append("ERROR:  In commit ").append(c.name()).append("\n");
@@ -571,31 +557,21 @@
     if (currentUser.getEmailAddresses().isEmpty()) {
       sb.append("ERROR:  You have not registered any email addresses.\n");
     } else {
-      if (currentUser.getEmailAddresses().size() == 1) {
-        sb.append("ERROR:  The following address is currently "
-            + "registered for you:\n");
-      } else {
-        sb.append("ERROR:  The following addresses are currently "
-            + "registered for you:\n");
-      }
+      sb.append("ERROR:  The following addresses are currently registered:\n");
       for (String address : currentUser.getEmailAddresses()) {
         sb.append("ERROR:    ").append(address).append("\n");
       }
     }
-    if (canonicalWebUrl != null && canRegisterNewEmail(realm)) {
-      sb.append("ERROR:\n");
+    sb.append("ERROR:\n");
+    if (canonicalWebUrl != null) {
       sb.append("ERROR:  To register an email address, please visit:\n");
       sb.append("ERROR:  ").append(canonicalWebUrl).append("#")
-          .append(PageLinks.SETTINGS_CONTACT).append("\n");
+        .append(PageLinks.SETTINGS_CONTACT).append("\n");
     }
     sb.append("\n");
     return new CommitValidationMessage(sb.toString(), false);
   }
 
-  private static boolean canRegisterNewEmail(Realm realm) {
-    return realm.allowsEdit(Account.FieldName.REGISTER_NEW_EMAIL);
-  }
-
   /**
    * Get the Gerrit URL.
    *
