Merge "Documentation/rest-api-projects: update AccessCheckInfo spec"
diff --git a/java/com/google/gerrit/httpd/init/WebAppInitializer.java b/java/com/google/gerrit/httpd/init/WebAppInitializer.java
index cb476af..ec13514 100644
--- a/java/com/google/gerrit/httpd/init/WebAppInitializer.java
+++ b/java/com/google/gerrit/httpd/init/WebAppInitializer.java
@@ -55,6 +55,7 @@
 import com.google.gerrit.server.config.AuthConfig;
 import com.google.gerrit.server.config.AuthConfigModule;
 import com.google.gerrit.server.config.CanonicalWebUrlModule;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
 import com.google.gerrit.server.config.DownloadConfig;
 import com.google.gerrit.server.config.GerritGlobalModule;
 import com.google.gerrit.server.config.GerritInstanceNameModule;
@@ -376,6 +377,8 @@
             return HttpCanonicalWebUrlProvider.class;
           }
         });
+    modules.add(new DefaultUrlFormatter.Module());
+
     modules.add(SshKeyCacheImpl.module());
     modules.add(
         new AbstractModule() {
diff --git a/java/com/google/gerrit/pgm/Daemon.java b/java/com/google/gerrit/pgm/Daemon.java
index 1a9af55..bbd62cc 100644
--- a/java/com/google/gerrit/pgm/Daemon.java
+++ b/java/com/google/gerrit/pgm/Daemon.java
@@ -65,6 +65,7 @@
 import com.google.gerrit.server.config.AuthConfigModule;
 import com.google.gerrit.server.config.CanonicalWebUrlModule;
 import com.google.gerrit.server.config.CanonicalWebUrlProvider;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
 import com.google.gerrit.server.config.DownloadConfig;
 import com.google.gerrit.server.config.GerritGlobalModule;
 import com.google.gerrit.server.config.GerritInstanceNameModule;
@@ -459,6 +460,7 @@
             }
           });
     }
+    modules.add(new DefaultUrlFormatter.Module());
     if (sshd) {
       modules.add(SshKeyCacheImpl.module());
     } else {
diff --git a/java/com/google/gerrit/pgm/util/BatchProgramModule.java b/java/com/google/gerrit/pgm/util/BatchProgramModule.java
index b316d3a..540c5f3 100644
--- a/java/com/google/gerrit/pgm/util/BatchProgramModule.java
+++ b/java/com/google/gerrit/pgm/util/BatchProgramModule.java
@@ -47,14 +47,13 @@
 import com.google.gerrit.server.config.AdministrateServerGroups;
 import com.google.gerrit.server.config.CanonicalWebUrl;
 import com.google.gerrit.server.config.CanonicalWebUrlProvider;
-import com.google.gerrit.server.config.DefaultBrowseUrls;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
 import com.google.gerrit.server.config.DisableReverseDnsLookup;
 import com.google.gerrit.server.config.DisableReverseDnsLookupProvider;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.GitReceivePackGroups;
 import com.google.gerrit.server.config.GitUploadPackGroups;
 import com.google.gerrit.server.config.SysExecutorModule;
-import com.google.gerrit.server.config.UrlFormatter;
 import com.google.gerrit.server.extensions.events.EventUtil;
 import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 import com.google.gerrit.server.extensions.events.RevisionCreated;
@@ -114,6 +113,7 @@
     install(new SysExecutorModule());
     install(BatchUpdate.module());
     install(PatchListCacheImpl.module());
+    install(new DefaultUrlFormatter.Module());
 
     // There is the concept of LifecycleModule, in Gerrit's own extension to Guice, which has these:
     //  listener().to(SomeClassImplementingLifecycleListener.class);
@@ -140,7 +140,6 @@
     bind(String.class)
         .annotatedWith(CanonicalWebUrl.class)
         .toProvider(CanonicalWebUrlProvider.class);
-    bind(UrlFormatter.class).to(DefaultBrowseUrls.class);
     bind(Boolean.class)
         .annotatedWith(DisableReverseDnsLookup.class)
         .toProvider(DisableReverseDnsLookupProvider.class)
diff --git a/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java b/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java
index 14c93dc..646d395 100644
--- a/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java
+++ b/java/com/google/gerrit/server/config/CanonicalWebUrlModule.java
@@ -30,7 +30,6 @@
     //
     final Class<? extends Provider<String>> provider = provider();
     bind(String.class).annotatedWith(CanonicalWebUrl.class).toProvider(provider);
-    bind(UrlFormatter.class).to(DefaultBrowseUrls.class);
   }
 
   protected abstract Class<? extends Provider<String>> provider();
diff --git a/java/com/google/gerrit/server/config/DefaultBrowseUrls.java b/java/com/google/gerrit/server/config/DefaultUrlFormatter.java
similarity index 74%
rename from java/com/google/gerrit/server/config/DefaultBrowseUrls.java
rename to java/com/google/gerrit/server/config/DefaultUrlFormatter.java
index 988cb05..8219a97 100644
--- a/java/com/google/gerrit/server/config/DefaultBrowseUrls.java
+++ b/java/com/google/gerrit/server/config/DefaultUrlFormatter.java
@@ -14,17 +14,25 @@
 
 package com.google.gerrit.server.config;
 
+import com.google.inject.AbstractModule;
 import java.util.Optional;
 import javax.inject.Inject;
 import javax.inject.Provider;
 import javax.inject.Singleton;
 
 @Singleton
-public class DefaultBrowseUrls implements UrlFormatter {
+public class DefaultUrlFormatter implements UrlFormatter {
   private final Provider<String> canonicalWebUrlProvider;
 
+  public static class Module extends AbstractModule {
+    @Override
+    protected void configure() {
+      bind(UrlFormatter.class).to(DefaultUrlFormatter.class);
+    }
+  }
+
   @Inject
-  DefaultBrowseUrls(@CanonicalWebUrl Provider<String> canonicalWebUrlProvider) {
+  DefaultUrlFormatter(@CanonicalWebUrl Provider<String> canonicalWebUrlProvider) {
     this.canonicalWebUrlProvider = canonicalWebUrlProvider;
   }
 
diff --git a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
index ef699b3..393e22f 100644
--- a/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
+++ b/java/com/google/gerrit/server/git/receive/ReceiveCommits.java
@@ -181,6 +181,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.regex.Matcher;
+import java.util.stream.Stream;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.errors.IncorrectObjectTypeException;
 import org.eclipse.jgit.errors.MissingObjectException;
@@ -270,17 +271,14 @@
   }
 
   private static final Function<Exception, RestApiException> INSERT_EXCEPTION =
-      new Function<Exception, RestApiException>() {
-        @Override
-        public RestApiException apply(Exception input) {
-          if (input instanceof RestApiException) {
-            return (RestApiException) input;
-          } else if ((input instanceof ExecutionException)
-              && (input.getCause() instanceof RestApiException)) {
-            return (RestApiException) input.getCause();
-          }
-          return new RestApiException("Error inserting change/patchset", input);
+      input -> {
+        if (input instanceof RestApiException) {
+          return (RestApiException) input;
+        } else if ((input instanceof ExecutionException)
+            && (input.getCause() instanceof RestApiException)) {
+          return (RestApiException) input.getCause();
         }
+        return new RestApiException("Error inserting change/patchset", input);
       };
 
   // ReceiveCommits has a lot of fields, sorry. Here and in the constructor they are split up
@@ -489,7 +487,7 @@
     messages.add(new CommitValidationMessage(message, false));
   }
 
-  void addError(String error) {
+  private void addError(String error) {
     messages.add(new CommitValidationMessage(error, true));
   }
 
@@ -507,11 +505,7 @@
     Task commandProgress = progress.beginSubTask("refs", UNKNOWN);
     commands = commands.stream().map(c -> wrapReceiveCommand(c, commandProgress)).collect(toList());
     processCommandsUnsafe(commands, progress);
-    for (ReceiveCommand cmd : commands) {
-      if (cmd.getResult() == NOT_ATTEMPTED) {
-        cmd.setResult(REJECTED_OTHER_REASON, "internal server error");
-      }
-    }
+    rejectRemaining(commands, "internal server error");
 
     // This sends error messages before the 'done' string of the progress monitor is sent.
     // Currently, the test framework relies on this ordering to understand if pushes completed
@@ -566,11 +560,7 @@
               + (regularCommands.isEmpty() ? 0 : 1);
 
       if (commandTypes > 1) {
-        for (ReceiveCommand cmd : commands) {
-          if (cmd.getResult() == NOT_ATTEMPTED) {
-            cmd.setResult(REJECTED_OTHER_REASON, "cannot combine normal pushes and magic pushes");
-          }
-        }
+        rejectRemaining(commands, "cannot combine normal pushes and magic pushes");
         return;
       }
 
@@ -661,11 +651,7 @@
       logger.atFine().log("Added %d additional ref updates", added);
       bu.execute();
     } catch (UpdateException | RestApiException e) {
-      for (ReceiveCommand cmd : cmds) {
-        if (cmd.getResult() == NOT_ATTEMPTED) {
-          cmd.setResult(REJECTED_OTHER_REASON, "internal server error");
-        }
-      }
+      rejectRemaining(cmds, "internal server error");
       logger.atFine().withCause(e).log("update failed:");
     }
 
@@ -2325,11 +2311,11 @@
     }
   }
 
-  ChangeLookup lookupByChangeKey(RevCommit c, Change.Key key) throws OrmException {
+  private ChangeLookup lookupByChangeKey(RevCommit c, Change.Key key) throws OrmException {
     return new ChangeLookup(c, key, queryProvider.get().byBranchKey(magicBranch.dest, key));
   }
 
-  ChangeLookup lookupByCommit(RevCommit c) throws OrmException {
+  private ChangeLookup lookupByCommit(RevCommit c) throws OrmException {
     return new ChangeLookup(
         c, null, queryProvider.get().byBranchCommit(magicBranch.dest, c.getName()));
   }
@@ -2440,7 +2426,7 @@
             new BatchUpdateOp() {
               @Override
               public boolean updateChange(ChangeContext ctx) {
-                change = ctx.getChange();
+                CreateRequest.this.change = ctx.getChange();
                 return false;
               }
             });
@@ -2475,8 +2461,7 @@
   private void preparePatchSetsForReplace(List<CreateRequest> newChanges) {
     try {
       readChangesForReplace();
-      for (Iterator<ReplaceRequest> itr = replaceByChange.values().iterator(); itr.hasNext(); ) {
-        ReplaceRequest req = itr.next();
+      for (ReplaceRequest req : replaceByChange.values()) {
         if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
           req.validateNewPatchSet();
         }
@@ -2484,19 +2469,11 @@
     } catch (OrmException err) {
       logger.atSevere().withCause(err).log(
           "Cannot read database before replacement for project %s", project.getName());
-      for (ReplaceRequest req : replaceByChange.values()) {
-        if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
-          req.inputCommand.setResult(REJECTED_OTHER_REASON, "internal server error");
-        }
-      }
+      rejectRemainingRequests(replaceByChange.values(), "internal server error");
     } catch (IOException | PermissionBackendException err) {
       logger.atSevere().withCause(err).log(
           "Cannot read repository before replacement for project %s", project.getName());
-      for (ReplaceRequest req : replaceByChange.values()) {
-        if (req.inputCommand.getResult() == NOT_ATTEMPTED) {
-          req.inputCommand.setResult(REJECTED_OTHER_REASON, "internal server error");
-        }
-      }
+      rejectRemainingRequests(replaceByChange.values(), "internal server error");
     }
     logger.atFine().log("Read %d changes to replace", replaceByChange.size());
 
@@ -2940,7 +2917,7 @@
     return refsById;
   }
 
-  static boolean parentsEqual(RevCommit a, RevCommit b) {
+  private static boolean parentsEqual(RevCommit a, RevCommit b) {
     if (a.getParentCount() != b.getParentCount()) {
       return false;
     }
@@ -2952,7 +2929,7 @@
     return true;
   }
 
-  static boolean authorEqual(RevCommit a, RevCommit b) {
+  private static boolean authorEqual(RevCommit a, RevCommit b) {
     PersonIdent aAuthor = a.getAuthorIdent();
     PersonIdent bAuthor = b.getAuthorIdent();
 
@@ -3194,6 +3171,18 @@
     cmd.setResult(REJECTED_OTHER_REASON, why);
   }
 
+  private static void rejectRemaining(Collection<ReceiveCommand> commands, String why) {
+    rejectRemaining(commands.stream(), why);
+  }
+
+  private static void rejectRemaining(Stream<ReceiveCommand> commands, String why) {
+    commands.filter(cmd -> cmd.getResult() == NOT_ATTEMPTED).forEach(cmd -> reject(cmd, why));
+  }
+
+  private static void rejectRemainingRequests(Collection<ReplaceRequest> requests, String why) {
+    rejectRemaining(requests.stream().map(req -> req.cmd), why);
+  }
+
   private static boolean isHead(ReceiveCommand cmd) {
     return cmd.getRefName().startsWith(Constants.R_HEADS);
   }
diff --git a/java/com/google/gerrit/server/restapi/change/Module.java b/java/com/google/gerrit/server/restapi/change/Module.java
index 5a5d2bb..f8b0cc4 100644
--- a/java/com/google/gerrit/server/restapi/change/Module.java
+++ b/java/com/google/gerrit/server/restapi/change/Module.java
@@ -25,7 +25,6 @@
 import static com.google.gerrit.server.change.RevisionResource.REVISION_KIND;
 import static com.google.gerrit.server.change.RobotCommentResource.ROBOT_COMMENT_KIND;
 import static com.google.gerrit.server.change.VoteResource.VOTE_KIND;
-import static com.google.gerrit.server.project.CommitResource.COMMIT_KIND;
 
 import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.restapi.RestApiModule;
@@ -178,7 +177,6 @@
     delete(CHANGE_EDIT_KIND).to(ChangeEdits.DeleteContent.class);
     get(CHANGE_EDIT_KIND, "/").to(ChangeEdits.Get.class);
     get(CHANGE_EDIT_KIND, "meta").to(ChangeEdits.GetMeta.class);
-    post(COMMIT_KIND, "cherrypick").to(CherryPickCommit.class);
 
     child(CHANGE_KIND, "messages").to(ChangeMessages.class);
     get(CHANGE_MESSAGE_KIND).to(GetChangeMessage.class);
diff --git a/java/com/google/gerrit/testing/InMemoryModule.java b/java/com/google/gerrit/testing/InMemoryModule.java
index 8f9aa14..12f3936 100644
--- a/java/com/google/gerrit/testing/InMemoryModule.java
+++ b/java/com/google/gerrit/testing/InMemoryModule.java
@@ -47,6 +47,7 @@
 import com.google.gerrit.server.config.CanonicalWebUrlModule;
 import com.google.gerrit.server.config.CanonicalWebUrlProvider;
 import com.google.gerrit.server.config.ChangeUpdateExecutor;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
 import com.google.gerrit.server.config.GerritGlobalModule;
 import com.google.gerrit.server.config.GerritInstanceNameModule;
 import com.google.gerrit.server.config.GerritOptions;
@@ -223,6 +224,7 @@
             return CanonicalWebUrlProvider.class;
           }
         });
+    install(new DefaultUrlFormatter.Module());
     // Replacement of DiffExecutorModule to not use thread pool in the tests
     install(
         new AbstractModule() {
diff --git a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
index 72878ee..7eaeeef 100644
--- a/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/change/ChangeIT.java
@@ -650,7 +650,6 @@
   @Test
   public void reviewAndMoveToWorkInProgress() throws Exception {
     PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
     assertThat(r.getChange().change().isWorkInProgress()).isFalse();
 
     ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
@@ -664,7 +663,6 @@
   @Test
   public void reviewAndSetWorkInProgressAndAddReviewerAndVote() throws Exception {
     PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
     assertThat(r.getChange().change().isWorkInProgress()).isFalse();
 
     ReviewInput in =
@@ -681,7 +679,6 @@
   @Test
   public void reviewWithWorkInProgressAndReadyReturnsError() throws Exception {
     PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
     ReviewInput in = ReviewInput.noScore();
     in.ready = true;
     in.workInProgress = true;
@@ -692,7 +689,6 @@
   @Test
   public void reviewWithWorkInProgressByNonOwnerReturnsError() throws Exception {
     PushOneCommit.Result r = createChange();
-    r.assertOkStatus();
     ReviewInput in = ReviewInput.noScore().setWorkInProgress(true);
     setApiUser(user);
     ReviewResult result = gApi.changes().id(r.getChangeId()).revision("current").review(in);
diff --git a/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java b/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
index 0c4a47f..d00f96b 100644
--- a/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
+++ b/javatests/com/google/gerrit/server/notedb/AbstractChangeNotesTest.java
@@ -42,11 +42,10 @@
 import com.google.gerrit.server.config.AnonymousCowardName;
 import com.google.gerrit.server.config.AnonymousCowardNameProvider;
 import com.google.gerrit.server.config.CanonicalWebUrl;
-import com.google.gerrit.server.config.DefaultBrowseUrls;
+import com.google.gerrit.server.config.DefaultUrlFormatter;
 import com.google.gerrit.server.config.DisableReverseDnsLookup;
 import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.config.GerritServerId;
-import com.google.gerrit.server.config.UrlFormatter;
 import com.google.gerrit.server.extensions.events.GitReferenceUpdated;
 import com.google.gerrit.server.git.GitModule;
 import com.google.gerrit.server.git.GitRepositoryManager;
@@ -136,6 +135,8 @@
               @Override
               public void configure() {
                 install(new GitModule());
+
+                install(new DefaultUrlFormatter.Module());
                 install(NoteDbModule.forTest(testConfig));
                 bind(AllUsersName.class).toProvider(AllUsersNameProvider.class);
                 bind(String.class).annotatedWith(GerritServerId.class).toInstance("gerrit");
@@ -164,7 +165,6 @@
                 migration.setFrom(NotesMigrationState.FINAL);
                 bind(MutableNotesMigration.class).toInstance(migration);
                 bind(NotesMigration.class).to(MutableNotesMigration.class);
-                bind(UrlFormatter.class).to(DefaultBrowseUrls.class);
 
                 // Tests don't support ReviewDb at all, but bindings are required via NoteDbModule.
                 bind(new TypeLiteral<SchemaFactory<ReviewDb>>() {})
diff --git a/plugins/commit-message-length-validator b/plugins/commit-message-length-validator
index aeacc16..556e427 160000
--- a/plugins/commit-message-length-validator
+++ b/plugins/commit-message-length-validator
@@ -1 +1 @@
-Subproject commit aeacc1652ac0bd34346e07af3d0801bec4d71b53
+Subproject commit 556e427fd737744ce8a6a37b89fd427ae59bc8ea
diff --git a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html
index 8734cd1..bcfc9e1 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html
+++ b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.html
@@ -57,7 +57,7 @@
       }
       th {
         border-bottom: 1px solid var(--border-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         text-align: left;
       }
       .canModify #groupMemberSearchInput,
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
index 6fa799e..b8119b7 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.html
@@ -43,7 +43,7 @@
         background-color: var(--hover-background-color);
       }
       :host([needs-review]) {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       :host([highlight]) {
         background-color: var(--assignee-highlight-color);
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
index 8413388..e521576 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.html
@@ -57,7 +57,7 @@
       }
       .title {
         color: var(--deemphasized-text-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         max-width: 20em;
         padding-left: var(--metadata-horizontal-padding);
         padding-right: .5em;
diff --git a/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.html b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.html
index 1431887..e79bce1 100644
--- a/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.html
+++ b/polygerrit-ui/app/elements/change/gr-change-requirements/gr-change-requirements.html
@@ -47,7 +47,7 @@
         color: inherit;
       }
       .name {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       section {
         display: table-row;
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
index 8885a6f..4506c16 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.html
@@ -91,7 +91,7 @@
         font-size: 1.2rem;
       }
       .headerTitle .headerSubject {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       #replyBtn {
         margin-bottom: 1em;
diff --git a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
index b906753..e4183df 100644
--- a/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
+++ b/polygerrit-ui/app/elements/change/gr-comment-list/gr-comment-list.html
@@ -37,7 +37,7 @@
       }
       .file {
         border-top: 1px solid var(--border-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         margin: 10px 0 3px;
         padding: 10px 0 5px;
       }
diff --git a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
index 545d170..5e82cda 100644
--- a/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-download-dialog/gr-download-dialog.html
@@ -68,7 +68,7 @@
       }
       .title {
         flex: 1;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .hidden {
         display: none;
diff --git a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
index 5520ac9..142e706 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list-header/gr-file-list-header.html
@@ -136,7 +136,7 @@
         display: flex;
       }
       .label {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         margin-right: 24px;
       }
       gr-commit-info,
diff --git a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
index fa984c9..358e994 100644
--- a/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
+++ b/polygerrit-ui/app/elements/change/gr-file-list/gr-file-list.html
@@ -158,7 +158,7 @@
       }
       .drafts {
         color: #C62828;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .show-hide {
         margin-left: .35em;
diff --git a/polygerrit-ui/app/elements/change/gr-message/gr-message.html b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
index 00157ab..19b0716b 100644
--- a/polygerrit-ui/app/elements/change/gr-message/gr-message.html
+++ b/polygerrit-ui/app/elements/change/gr-message/gr-message.html
@@ -80,7 +80,7 @@
         width: 2.5em;
       }
       .name {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .message {
         --gr-formatted-text-prose-max-width: 80ch;
@@ -163,7 +163,7 @@
       }
       gr-account-label {
         --gr-account-label-text-style: {
-          font-family: var(--font-family-bold);
+          font-weight: var(--font-weight-bold);
         };
       }
     </style>
diff --git a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
index 98efa01..8aa8173 100644
--- a/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
+++ b/polygerrit-ui/app/elements/change/gr-related-changes-list/gr-related-changes-list.html
@@ -70,7 +70,7 @@
       }
       .status {
         color: var(--deemphasized-text-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         margin-left: .25em;
       }
       .notCurrent {
diff --git a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html
index c9f0a16..45b9c15 100644
--- a/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html
+++ b/polygerrit-ui/app/elements/change/gr-reply-dialog/gr-reply-dialog.html
@@ -104,7 +104,7 @@
         margin-top: 1em;
       }
       .groupName {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .groupSize {
         font-style: italic;
diff --git a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
index 9db339b8..9fda898 100644
--- a/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
+++ b/polygerrit-ui/app/elements/core/gr-keyboard-shortcuts-dialog/gr-keyboard-shortcuts-dialog.html
@@ -51,7 +51,7 @@
         text-align: right;
       }
       .header {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         padding-top: 1em;
       }
       .key {
@@ -59,7 +59,7 @@
         border: 1px solid var(--border-color);
         border-radius: 3px;
         display: inline-block;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         padding: .1em .5em;
         text-align: center;
       }
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
index 9822860..06e52c3 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.html
@@ -73,7 +73,7 @@
       .linksTitle {
         color: var(--header-text-color);
         display: inline-block;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         position: relative;
         text-transform: uppercase;
       }
@@ -151,7 +151,7 @@
       @media screen and (max-width: 50em) {
         .bigTitle {
           font-size: var(--font-size-large);
-          font-family: var(--font-family-bold);
+          font-weight: var(--font-weight-bold);
         }
         gr-smart-search,
         .browse,
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
index 649e867..6ea0330 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-comment/gr-diff-comment.html
@@ -77,7 +77,7 @@
       .authorName,
       .draftLabel,
       .draftTooltip {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .draftLabel,
       .draftTooltip {
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.html b/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.html
index 78814d4..a22f689 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-preferences/gr-diff-preferences.html
@@ -51,7 +51,7 @@
       }
       .header {
         border-bottom: 1px solid var(--border-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .mainContainer {
         padding: 1em 0;
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
index 2e56871..04d53a4 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
+++ b/polygerrit-ui/app/elements/diff/gr-diff-view/gr-diff-view.html
@@ -184,7 +184,7 @@
         .mobileNavLink {
           color: var(--primary-text-color);
           font-size: 1.5rem;
-          font-family: var(--font-family-bold);
+          font-weight: var(--font-weight-bold);
           text-decoration: none;
         }
         .mobileNavLink:not([href]) {
diff --git a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html
index 233235e..d5f1dc3 100644
--- a/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html
+++ b/polygerrit-ui/app/elements/settings/gr-cla-view/gr-cla-view.html
@@ -40,7 +40,7 @@
         padding: 0.3em;
       }
       #claNewAgreementsLabel {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       #claNewAgreement {
         display: none;
@@ -49,7 +49,7 @@
         display: block;
       }
       .contributorAgreementButton {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .alreadySubmittedText {
         color: var(--error-text-color);
diff --git a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html
index 7a8cd6f..5f1794c 100644
--- a/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html
+++ b/polygerrit-ui/app/elements/settings/gr-registration-dialog/gr-registration-dialog.html
@@ -48,7 +48,7 @@
       }
       header {
         border-bottom: 1px solid var(--border-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         margin-bottom: 1em;
       }
       .container {
diff --git a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
index 5817fb7..b00fded 100644
--- a/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
+++ b/polygerrit-ui/app/elements/shared/gr-alert/gr-alert.html
@@ -54,7 +54,7 @@
       }
       .action {
         color: var(--link-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         margin-left: 1em;
         text-decoration: none;
         --gr-button: {
diff --git a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
index 6564abe..3b93a6e 100644
--- a/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
+++ b/polygerrit-ui/app/elements/shared/gr-button/gr-button.html
@@ -39,9 +39,6 @@
         text-transform: none;
       }
       paper-button {
-        /* paper-button sets this to anti-aliased, which appears different than
-        roboto-medium elsewhere. */
-        -webkit-font-smoothing: initial;
         align-items: center;
         background-color: var(--background-color);
         color: var(--text-color);
diff --git a/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.html b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.html
index ac0a829..797c8ea 100644
--- a/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.html
+++ b/polygerrit-ui/app/elements/shared/gr-dialog/gr-dialog.html
@@ -35,7 +35,7 @@
       header {
         border-bottom: 1px solid var(--border-color);
         flex-shrink: 0;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       main {
         display: flex;
diff --git a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html
index bfa7885..6aec5a6 100644
--- a/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html
+++ b/polygerrit-ui/app/elements/shared/gr-download-commands/gr-download-commands.html
@@ -42,7 +42,7 @@
         display: block;
       }
       label {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .schemes {
         display: flex;
diff --git a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html
index 58e3125..47ab03a 100644
--- a/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html
+++ b/polygerrit-ui/app/elements/shared/gr-dropdown/gr-dropdown.html
@@ -94,7 +94,7 @@
         @apply --gr-dropdown-item;
       }
       .bold-text {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
     </style>
     <gr-button
diff --git a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
index 8581396..ddc35bf 100644
--- a/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
+++ b/polygerrit-ui/app/elements/shared/gr-editable-label/gr-editable-label.html
@@ -41,7 +41,7 @@
       label {
         color: var(--deemphasized-text-color);
         display: inline-block;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         overflow: hidden;
         text-overflow: ellipsis;
         white-space: nowrap;
diff --git a/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html
index 5825301..c001ce7 100644
--- a/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html
+++ b/polygerrit-ui/app/elements/shared/gr-labeled-autocomplete/gr-labeled-autocomplete.html
@@ -32,7 +32,7 @@
       }
       #header {
         color: var(--deemphasized-text-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         font-size: var(--font-size-small);
       }
       #body {
diff --git a/polygerrit-ui/app/styles/dashboard-header-styles.html b/polygerrit-ui/app/styles/dashboard-header-styles.html
index b82bf3a..7b0e46b 100644
--- a/polygerrit-ui/app/styles/dashboard-header-styles.html
+++ b/polygerrit-ui/app/styles/dashboard-header-styles.html
@@ -39,7 +39,7 @@
       }
       .info > div > span {
         display: inline-block;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         text-align: right;
         width: 4em;
       }
diff --git a/polygerrit-ui/app/styles/fonts.css b/polygerrit-ui/app/styles/fonts.css
index 6a5da44..41aec27 100644
--- a/polygerrit-ui/app/styles/fonts.css
+++ b/polygerrit-ui/app/styles/fonts.css
@@ -42,9 +42,9 @@
 
 /* latin-ext */
 @font-face {
-  font-family: 'Roboto Medium';
+  font-family: 'Roboto';
   font-style: normal;
-  font-weight: 400;
+  font-weight: 500;
   src: local('Roboto Medium'), local('Roboto-Medium'),
        url('../fonts/Roboto-Medium.woff2') format('woff2'),
        url('../fonts/Roboto-Medium.woff') format('woff');
@@ -52,11 +52,11 @@
 }
 /* latin */
 @font-face {
-  font-family: 'Roboto Medium';
+  font-family: 'Roboto';
   font-style: normal;
-  font-weight: 400;
+  font-weight: 500;
   src: local('Roboto Medium'), local('Roboto-Medium'),
        url('../fonts/Roboto-Medium.woff2') format('woff2'),
        url('../fonts/Roboto-Medium.woff') format('woff');
   unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
-}
\ No newline at end of file
+}
diff --git a/polygerrit-ui/app/styles/gr-change-list-styles.html b/polygerrit-ui/app/styles/gr-change-list-styles.html
index 37e8bdc..af30e46 100644
--- a/polygerrit-ui/app/styles/gr-change-list-styles.html
+++ b/polygerrit-ui/app/styles/gr-change-list-styles.html
@@ -64,7 +64,7 @@
       }
       .topHeader,
       .groupHeader {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .topHeader th {
         background-color: var(--table-header-background-color);
diff --git a/polygerrit-ui/app/styles/gr-form-styles.html b/polygerrit-ui/app/styles/gr-form-styles.html
index 3cfd1d5c..59b633f 100644
--- a/polygerrit-ui/app/styles/gr-form-styles.html
+++ b/polygerrit-ui/app/styles/gr-form-styles.html
@@ -46,7 +46,7 @@
       }
       .gr-form-styles .title {
         color: var(--deemphasized-text-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         padding-right: .5em;
         width: 15em;
       }
diff --git a/polygerrit-ui/app/styles/gr-page-nav-styles.html b/polygerrit-ui/app/styles/gr-page-nav-styles.html
index 49aa033..18ec143 100644
--- a/polygerrit-ui/app/styles/gr-page-nav-styles.html
+++ b/polygerrit-ui/app/styles/gr-page-nav-styles.html
@@ -45,14 +45,14 @@
         margin-top: 1em;
       }
       .navStyles .title {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         margin: .4em 0;
       }
       .navStyles .selected {
         background-color: var(--view-background-color);
         border-bottom: 1px solid var(--border-color);
         border-top: 1px solid var(--border-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       .navStyles a {
         color: var(--primary-text-color);
diff --git a/polygerrit-ui/app/styles/gr-table-styles.html b/polygerrit-ui/app/styles/gr-table-styles.html
index 79d8100..1308952 100644
--- a/polygerrit-ui/app/styles/gr-table-styles.html
+++ b/polygerrit-ui/app/styles/gr-table-styles.html
@@ -68,7 +68,7 @@
       .genericList .topHeader,
       .genericList .groupHeader {
         color: var(--primary-text-color);
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
         text-align: left;
         vertical-align: middle
       }
diff --git a/polygerrit-ui/app/styles/shared-styles.html b/polygerrit-ui/app/styles/shared-styles.html
index 0c798f4..78abe3a 100644
--- a/polygerrit-ui/app/styles/shared-styles.html
+++ b/polygerrit-ui/app/styles/shared-styles.html
@@ -72,15 +72,15 @@
       /* Other Shared Styles*/
       h1 {
         font-size: 2rem;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       h2 {
         font-size: 1.5rem;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       h3 {
         font-size: 1.17em;
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       iron-icon {
         color: var(--deemphasized-text-color);
@@ -104,7 +104,7 @@
         --paper-toggle-button-checked-button-color: var(--link-color);
       }
       strong {
-        font-family: var(--font-family-bold);
+        font-weight: var(--font-weight-bold);
       }
       :host {
         color: var(--primary-text-color);
diff --git a/polygerrit-ui/app/styles/themes/app-theme.html b/polygerrit-ui/app/styles/themes/app-theme.html
index ea81796..fba3e97 100644
--- a/polygerrit-ui/app/styles/themes/app-theme.html
+++ b/polygerrit-ui/app/styles/themes/app-theme.html
@@ -34,7 +34,7 @@
   --default-horizontal-margin: 1rem;
   --deemphasized-text-color: #757575;
   --font-family: 'Roboto', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
-  --font-family-bold: 'Roboto Medium', -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol';
+  --font-weight-bold: 500;
   --monospace-font-family: 'Roboto Mono', Menlo, 'Lucida Console', Monaco, monospace;
   --iron-overlay-backdrop: {
     transition: none;