Merge branch 'stable-3.6'

* stable-3.6:
  Update issue tracker URL in pom.xml files
  polygerrit-ui/README.md: Update link to issues
  Update issue numbers and links
  Fix parsing legacy labels for users with comma

Change-Id: Iaf0f98a01481971069f90b5e8282f5ee530ae018
Forward-Compatible: checked
Release-Notes: skip
diff --git a/java/com/google/gerrit/server/comment/CommentContextLoader.java b/java/com/google/gerrit/server/comment/CommentContextLoader.java
index 8fbb259..9a1710d 100644
--- a/java/com/google/gerrit/server/comment/CommentContextLoader.java
+++ b/java/com/google/gerrit/server/comment/CommentContextLoader.java
@@ -200,7 +200,7 @@
       Text src, Range commentRange, int contextPadding, String contentType) {
     if (commentRange.start() < 1 || commentRange.end() - 1 > src.size()) {
       // TODO(ghareeb): We should throw an exception in this case. See
-      // https://bugs.chromium.org/p/gerrit/issues/detail?id=14102 which is an example where the
+      // https://issues.gerritcodereview.com/issues/40013461 which is an example where the
       // diff contains an extra line not in the original file.
       return CommentContext.empty();
     }
diff --git a/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java b/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
index e526a8b..178cf9b 100644
--- a/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
+++ b/java/com/google/gerrit/server/notedb/ChangeNoteUtil.java
@@ -24,6 +24,7 @@
 import com.google.gson.Gson;
 import com.google.inject.Inject;
 import java.time.Instant;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import org.eclipse.jgit.errors.ConfigInvalidException;
@@ -62,6 +63,7 @@
   static final String GERRIT_USER_TEMPLATE = "Gerrit User %d";
 
   private static final Gson gson = OutputFormat.JSON_COMPACT.newGson();
+  private static final String LABEL_VOTE_UUID_SEPARATOR = ", ";
 
   private final ChangeNoteJson changeNoteJson;
   private final String serverId;
@@ -305,65 +307,120 @@
   }
 
   /**
-   * Parses {@link ParsedPatchSetApproval} from {@link #FOOTER_LABEL} line.
+   * Delegates parsing of {@link ParsedPatchSetApproval} from {@link #FOOTER_LABEL} line to
+   * dedicated methods: {@link #parseAddedApproval} and {@link #parseRemovedApproval}
+   * correspondingly.
+   */
+  public static ParsedPatchSetApproval parseApproval(String footerLine)
+      throws ConfigInvalidException {
+    try {
+      return footerLine.startsWith("-")
+          ? parseRemovedApproval(footerLine)
+          : parseAddedApproval(footerLine);
+    } catch (StringIndexOutOfBoundsException ex) {
+      throw parseException(FOOTER_LABEL, footerLine, ex);
+    }
+  }
+
+  /**
+   * Parses added {@link ParsedPatchSetApproval} from {@link #FOOTER_LABEL} line.
    *
    * <p>Valid added approval footer examples:
    *
    * <ul>
-   *   <li>Label: <LABEL>=VOTE
-   *   <li>Label: <LABEL>=VOTE <Gerrit Account>
-   *   <li>Label: <LABEL>=VOTE, <UUID>
-   *   <li>Label: <LABEL>=VOTE, <UUID> <Gerrit Account>
+   *   <li>Label: &lt;LABEL&gt;=VOTE
+   *   <li>Label: &lt;LABEL&gt;=VOTE &lt;Gerrit Account&gt;
+   *   <li>Label: &lt;LABEL&gt;=VOTE, &lt;UUID&gt;
+   *   <li>Label: &lt;LABEL&gt;=VOTE, &lt;UUID&gt; &lt;Gerrit Account&gt;
    * </ul>
    *
-   * <p>Valid removed approval footer examples:
-   *
-   * <ul>
-   *   <li>-<LABEL>
-   *   <li>-<LABEL> <Gerrit Account>
-   * </ul>
-   *
-   * <p><UUID> is optional, since the approval might have been granted before {@link
+   * <p>&lt;UUID&gt; is optional, since the approval might have been granted before {@link
    * com.google.gerrit.entities.PatchSetApproval.UUID} was introduced.
    *
    * <p><Gerrit Account> is only persisted in cases, when the account, that granted the vote does
    * not match the account, that issued {@link ChangeUpdate} (created this NoteDB commit).
    */
-  public static ParsedPatchSetApproval parseApproval(String footerLine)
+  private static ParsedPatchSetApproval parseAddedApproval(String footerLine)
       throws ConfigInvalidException {
-    try {
-      ParsedPatchSetApproval.Builder rawPatchSetApproval =
-          ParsedPatchSetApproval.builder().footerLine(footerLine);
-      String labelVoteStr;
-      boolean isRemoval = footerLine.startsWith("-");
-      rawPatchSetApproval.isRemoval(isRemoval);
-      int uuidStart = isRemoval ? -1 : footerLine.indexOf(", ");
-      int reviewerStart = footerLine.indexOf(' ', uuidStart != -1 ? uuidStart + 2 : 0);
-      int labelStart = isRemoval ? 1 : 0;
-      checkFooter(!isRemoval || uuidStart == -1, FOOTER_LABEL, footerLine);
+    ParsedPatchSetApproval.Builder rawPatchSetApproval =
+        ParsedPatchSetApproval.builder().footerLine(footerLine);
+    rawPatchSetApproval.isRemoval(false);
+    // We need some additional logic to differentiate between labels that have a UUID and those that
+    // have a user with a comma. This allows us to separate the following cases (note that the
+    // leading `Label: ` has been elided at this point):
+    //   Label: <LABEL>=VOTE, <UUID> <Gerrit Account>
+    //   Label: <LABEL>=VOTE <Gerrit, Account>
+    int reviewerStartOffset = 0;
+    int scoreStart = footerLine.indexOf('=') + 1;
+    StringBuilder labelNameScore = new StringBuilder(footerLine.substring(0, scoreStart));
+    for (int i = scoreStart; i < footerLine.length(); i++) {
+      char currentChar = footerLine.charAt(i);
 
-      if (uuidStart != -1) {
-        String uuid =
-            footerLine.substring(
-                uuidStart + 2, reviewerStart > 0 ? reviewerStart : footerLine.length());
+      // If we hit ',' before ' ' we have a UUID
+      if (currentChar == ',') {
+        labelNameScore.append(footerLine, scoreStart, i);
+        int uuidStart = i + LABEL_VOTE_UUID_SEPARATOR.length();
+        int uuidEnd = footerLine.indexOf(' ', uuidStart);
+        String uuid = footerLine.substring(uuidStart, uuidEnd > 0 ? uuidEnd : footerLine.length());
         checkFooter(!Strings.isNullOrEmpty(uuid), FOOTER_LABEL, footerLine);
-        labelVoteStr = footerLine.substring(labelStart, uuidStart);
         rawPatchSetApproval.uuid(Optional.of(uuid));
-      } else if (reviewerStart != -1) {
-        labelVoteStr = footerLine.substring(labelStart, reviewerStart);
-      } else {
-        labelVoteStr = footerLine.substring(labelStart);
+        reviewerStartOffset = uuidStart + uuid.length();
+        break;
       }
-      rawPatchSetApproval.labelVote(labelVoteStr);
 
-      if (reviewerStart > 0) {
-        String ident = footerLine.substring(reviewerStart + 1);
-        rawPatchSetApproval.accountIdent(Optional.of(ident));
+      // Otherwise we don't
+      if (currentChar == ' ') {
+        labelNameScore.append(footerLine, scoreStart, i);
+        break;
       }
-      return rawPatchSetApproval.build();
-    } catch (StringIndexOutOfBoundsException ex) {
-      throw parseException(FOOTER_LABEL, footerLine, ex);
+
+      // If we hit neither we're defensive assign the whole line
+      if (i == footerLine.length() - 1) {
+        labelNameScore = new StringBuilder(footerLine);
+        break;
+      }
     }
+
+    rawPatchSetApproval.labelVote(labelNameScore.toString());
+
+    int reviewerStart = footerLine.indexOf(' ', reviewerStartOffset);
+    if (reviewerStart > 0) {
+      String ident = footerLine.substring(reviewerStart + 1);
+      rawPatchSetApproval.accountIdent(Optional.of(ident));
+    }
+    return rawPatchSetApproval.build();
+  }
+
+  /**
+   * Parses removed {@link ParsedPatchSetApproval} from {@link #FOOTER_LABEL} line.
+   *
+   * <p>Valid removed approval footer examples:
+   *
+   * <ul>
+   *   <li>-&lt;LABEL&gt;
+   *   <li>-&lt;LABEL&gt; &lt;Gerrit Account&gt;
+   * </ul>
+   *
+   * <p>&lt;Gerrit Account&gt; is only persisted in cases, when the account, that granted the vote
+   * does not match the account, that issued {@link ChangeUpdate} (created this NoteDB commit).
+   */
+  private static ParsedPatchSetApproval parseRemovedApproval(String footerLine) {
+    ParsedPatchSetApproval.Builder rawPatchSetApproval =
+        ParsedPatchSetApproval.builder().footerLine(footerLine);
+    rawPatchSetApproval.isRemoval(true);
+    int labelStart = 1;
+    int reviewerStart = footerLine.indexOf(' ', labelStart);
+
+    rawPatchSetApproval.labelVote(
+        reviewerStart != -1
+            ? footerLine.substring(labelStart, reviewerStart)
+            : footerLine.substring(labelStart));
+
+    if (reviewerStart > 0) {
+      String ident = footerLine.substring(reviewerStart + 1);
+      rawPatchSetApproval.accountIdent(Optional.of(ident));
+    }
+    return rawPatchSetApproval.build();
   }
 
   /**
@@ -396,8 +453,8 @@
       boolean isRemoval = labelLine.startsWith("-");
       rawPatchSetApproval.isRemoval(isRemoval);
       int labelStart = isRemoval ? 1 : 0;
-      int uuidStart = isRemoval ? -1 : labelLine.indexOf(", ");
       int tagStart = isRemoval ? -1 : labelLine.indexOf(":\"");
+      int uuidStart = parseCopiedApprovalUuidStart(labelLine, tagStart);
 
       checkFooter(!isRemoval || uuidStart == -1, FOOTER_LABEL, labelLine);
 
@@ -406,7 +463,9 @@
         uuidStart = -1;
       }
 
-      int identitiesStart = labelLine.indexOf(' ', uuidStart != -1 ? uuidStart + 2 : 0);
+      int identitiesStart =
+          labelLine.indexOf(
+              ' ', uuidStart != -1 ? uuidStart + LABEL_VOTE_UUID_SEPARATOR.length() : 0);
       checkFooter(
           identitiesStart != -1 && identitiesStart < labelLine.length(),
           FOOTER_COPIED_LABEL,
@@ -422,10 +481,9 @@
       }
       // The first account is the accountId, and second (if applicable) is the realAccountId.
       List<String> identities =
-          Splitter.on(',')
-              .splitToList(
-                  labelLine.substring(
-                      identitiesStart + 1, tagStart == -1 ? labelLine.length() : tagStart));
+          parseIdentities(
+              labelLine.substring(
+                  identitiesStart + 1, tagStart == -1 ? labelLine.length() : tagStart));
       checkFooter(identities.size() >= 1, FOOTER_COPIED_LABEL, labelLine);
 
       rawPatchSetApproval.accountIdent(Optional.of(identities.get(0)));
@@ -446,6 +504,41 @@
     }
   }
 
+  // Return the UUID start index or -1 if no UUID is present
+  private static int parseCopiedApprovalUuidStart(String line, int tagStart) {
+    int separatorIndex = line.indexOf(LABEL_VOTE_UUID_SEPARATOR);
+
+    // The first part of the condition checks whether the footer has the following format:
+    //   Copied-Label: <LABEL>=VOTE <Gerrit Account>,<Gerrit Real Account> :"<TAG>"
+    //   Weird tag that contains uuid delimiter. The uuid is actually not present.
+    if ((tagStart != -1 && separatorIndex > tagStart)
+        ||
+
+        // The second part of the condition allows us to distinguish the following two lines:
+        //   Label2=+1, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 1 <1@gerrit>
+        //   Label2=+1 User Name (company_name, department) <2@gerrit>
+        (line.indexOf(' ') < separatorIndex)) {
+      return -1;
+    }
+    return separatorIndex;
+  }
+
+  // Splitting on "," breaks for identities containing commas. The below re-implements splitting on
+  // "(?<=>),", but it's 3-5x faster, as performance matters here.
+  private static List<String> parseIdentities(String line) {
+    List<String> idents = Splitter.on(',').splitToList(line);
+    List<String> identitiesList = new ArrayList<>();
+    for (int i = 0; i < idents.size(); i++) {
+      if (i == 0 || idents.get(i - 1).endsWith(">")) {
+        identitiesList.add(idents.get(i));
+      } else {
+        int lastIndex = identitiesList.size() - 1;
+        identitiesList.set(lastIndex, identitiesList.get(lastIndex) + "," + idents.get(i));
+      }
+    }
+    return identitiesList;
+  }
+
   private static void checkFooter(boolean expr, FooterKey footer, String actual)
       throws ConfigInvalidException {
     if (!expr) {
diff --git a/java/com/google/gerrit/server/patch/DiffOperationsImpl.java b/java/com/google/gerrit/server/patch/DiffOperationsImpl.java
index 86f122e..b57ab60 100644
--- a/java/com/google/gerrit/server/patch/DiffOperationsImpl.java
+++ b/java/com/google/gerrit/server/patch/DiffOperationsImpl.java
@@ -315,7 +315,7 @@
                 DiffAlgorithm.HISTOGRAM_NO_FALLBACK,
                 // We don't enforce timeouts with the fallback algorithm. Timeouts were introduced
                 // because of a bug in JGit that happens only when the histogram algorithm uses
-                // Myers as fallback. See https://bugs.chromium.org/p/gerrit/issues/detail?id=487
+                // Myers as fallback. See https://issues.gerritcodereview.com/issues/40000618
                 /* useTimeout= */ false,
                 key.whitespace());
         fallbackKeys.add(fallbackKey);
diff --git a/java/com/google/gerrit/server/patch/PatchList.java b/java/com/google/gerrit/server/patch/PatchList.java
index b983fb8..4efbc69 100644
--- a/java/com/google/gerrit/server/patch/PatchList.java
+++ b/java/com/google/gerrit/server/patch/PatchList.java
@@ -55,7 +55,7 @@
    * We use the ChangeType comparator for a rare case when PatchList contains two entries for the
    * same file, e.g. {ADDED, DELETED}. We return a single entry according to the following order.
    * Check the following bug for an example case:
-   * https://bugs.chromium.org/p/gerrit/issues/detail?id=13914.
+   * https://issues.gerritcodereview.com/issues/40013315.
    */
   @VisibleForTesting
   static class ChangeTypeCmp implements Comparator<ChangeType> {
diff --git a/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java b/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java
index 2b856fb..0cfaa66 100644
--- a/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java
+++ b/java/com/google/gerrit/server/patch/gitfilediff/GitFileDiffCacheImpl.java
@@ -358,7 +358,7 @@
               });
       try {
         // We employ the timeout because of a bug in Myers diff in JGit. See
-        // bugs.chromium.org/p/gerrit/issues/detail?id=487 for more details. The bug may happen
+        // https://issues.gerritcodereview.com/issues/40000618 for more details. The bug may happen
         // if the algorithm used in diffs is HISTOGRAM_WITH_FALLBACK_MYERS.
         return fileDiffFuture.get(timeoutMillis, TimeUnit.MILLISECONDS);
       } catch (InterruptedException | TimeoutException e) {
diff --git a/java/com/google/gerrit/server/restapi/change/Move.java b/java/com/google/gerrit/server/restapi/change/Move.java
index c1b36d7..57ce75a 100644
--- a/java/com/google/gerrit/server/restapi/change/Move.java
+++ b/java/com/google/gerrit/server/restapi/change/Move.java
@@ -113,7 +113,7 @@
       throws RestApiException, UpdateException, PermissionBackendException, IOException {
     if (!moveEnabled) {
       // This will be removed with the above config once we reach consensus for the move change
-      // behavior. See: https://bugs.chromium.org/p/gerrit/issues/detail?id=9877
+      // behavior. See: https://issues.gerritcodereview.com/issues/40009784
       throw new MethodNotAllowedException("move changes endpoint is disabled");
     }
 
diff --git a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
index 1919810..f347e19 100644
--- a/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
+++ b/javatests/com/google/gerrit/acceptance/api/revision/RevisionDiffIT.java
@@ -1035,7 +1035,7 @@
   public void intralineEditsAreIdentified() throws Exception {
     // In some corner cases, intra-line diffs produce wrong results. In this case, the algorithm
     // falls back to a single edit covering the whole range.
-    // See: bugs.chromium.org/p/gerrit/issues/detail?id=13563
+    // See: https://issues.gerritcodereview.com/issues/40013030
 
     assume().that(intraline).isTrue();
 
diff --git a/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java b/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
index 79a65fd..546bb18 100644
--- a/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
+++ b/javatests/com/google/gerrit/server/notedb/ChangeNotesParserTest.java
@@ -139,6 +139,7 @@
             + "Label: Label2=1\n"
             + "Label: Label3=0\n"
             + "Label: Label4=-1\n"
+            + "Label: Label1=+1 Gerrit User 1 (name,with, comma) <1@gerrit>\n"
             + "Subject: This is a test change\n");
     assertParseSucceeds(
         "Update change\n"
@@ -168,6 +169,7 @@
             + "Label: Label1=+1, 577fb248e474018276351785930358ec0450e9f7\n"
             + "Label: Label1=+1, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 2 <2@gerrit>\n"
             + "Label: Label1=0, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 2 <2@gerrit>\n"
+            + "Label: Label1=0, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 3 (name,with, comma) <3@gerrit>\n"
             + "Subject: This is a test change\n");
 
     assertParseSucceeds(
@@ -207,6 +209,8 @@
             + "Copied-Label: Label4=+1 Account <1@gerrit> :\"tag with characters %^#@^( *::!\"\n"
             + "Copied-Label: -Label1 Account <1@gerrit>,Other Account <2@gerrit>\\n"
             + "Copied-Label: -Label1 Account <1@gerrit>\n"
+            + "Copied-Label: Label1=+1 Gerrit User 1 (name,with, comma) <1@gerrit>\n"
+            + "Copied-Label: Label2=+1 Gerrit User 1 (name,with, comma) <1@gerrit>,Gerrit User 2 (name,with, comma) <2@gerrit>\n"
             + "Subject: This is a test change\n");
 
     assertParseFails("Update change\n\nPatch-set: 1\nCopied-Label: Label1=X\n");
@@ -241,6 +245,7 @@
             + "Copied-Label: Label4=+1, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 1 <1@gerrit> :\"tag with uuid delimiter , \"\n"
             + "Copied-Label: Label4=+1, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 1 <1@gerrit>,Gerrit User 2 <2@gerrit> :\"tag with characters %^#@^( *::!\"\n"
             + "Copied-Label: Label4=+1, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 1 <1@gerrit>,Gerrit User 2 <2@gerrit> :\"tag with uuid delimiter , \"\n"
+            + "Copied-Label: Label4=+1, 577fb248e474018276351785930358ec0450e9f7 Gerrit User 1 (name,with, comma) <2@gerrit>,Gerrit User 3 (name,with, comma) <3@gerrit>\n"
             + "Subject: This is a test change\n");
 
     assertParseSucceeds(
diff --git a/polygerrit-ui/README.md b/polygerrit-ui/README.md
index ac8712b..d599230 100644
--- a/polygerrit-ui/README.md
+++ b/polygerrit-ui/README.md
@@ -427,7 +427,9 @@
 
 ## Contributing
 
-Our users report bugs / feature requests related to the UI through [Monorail Issues - PolyGerrit](https://bugs.chromium.org/p/gerrit/issues/list?q=component%3APolyGerrit).
+Our users report bugs / feature requests related to the UI through the Gerrit
+Tracker on the [WebFrontend](https://issues.gerritcodereview.com/issues?q=componentid:1369968)
+component.
 
 If you want to help, feel free to grab one from those `New` issues without
 assignees and send us a change.
diff --git a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts
index 524578e..506e086 100644
--- a/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts
+++ b/polygerrit-ui/app/elements/change/gr-change-actions/gr-change-actions.ts
@@ -1846,7 +1846,7 @@
   }
 
   // TODO(rmistry): Redo this after
-  // https://bugs.chromium.org/p/gerrit/issues/detail?id=4671 is resolved.
+  // https://issues.gerritcodereview.com/issues/40004936 is resolved.
   // private but used in test
   setReviewOnRevert(newChangeId: NumericChangeId) {
     const review = this.jsAPI.getReviewPostRevert(this.change);
diff --git a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts
index 9343fb9..e9ee340 100644
--- a/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts
+++ b/polygerrit-ui/app/elements/core/gr-main-header/gr-main-header.ts
@@ -616,7 +616,7 @@
   // private but used in test
   createHeaderLink(linkObj: TopMenuItemInfo): MainHeaderLink {
     // Delete target property due to complications of
-    // https://bugs.chromium.org/p/gerrit/issues/detail?id=5888
+    // https://issues.gerritcodereview.com/issues/40006107
     //
     // The server tries to guess whether URL is a view within the UI.
     // If not, it sets target='_blank' on the menu item. The server
diff --git a/polygerrit-ui/app/elements/shared/gr-select/gr-select.ts b/polygerrit-ui/app/elements/shared/gr-select/gr-select.ts
index 083ec0b..0448a55 100644
--- a/polygerrit-ui/app/elements/shared/gr-select/gr-select.ts
+++ b/polygerrit-ui/app/elements/shared/gr-select/gr-select.ts
@@ -39,7 +39,7 @@
       this.nativeSelect.value = String(this.bindValue);
       // Async needed for firefox to populate value. It was trying to do it
       // before options from a dom-repeat were rendered previously.
-      // See https://bugs.chromium.org/p/gerrit/issues/detail?id=7735
+      // See https://issues.gerritcodereview.com/issues/40007948
       setTimeout(() => {
         this.nativeSelect.value = String(this.bindValue);
       }, 1);
@@ -79,7 +79,7 @@
       this.nativeSelect.value = this.convert(this.bindValue) ?? '';
       // Async needed for firefox to populate value. It was trying to do it
       // before options from a dom-repeat were rendered previously.
-      // See https://bugs.chromium.org/p/gerrit/issues/detail?id=7735
+      // See https://g-issues.gerritcodereview.com/issues/40007948
       setTimeout(() => {
         this.nativeSelect.value = this.convert(this.bindValue) ?? '';
       }, 1);
diff --git a/tools/maven/gerrit-acceptance-framework_pom.xml b/tools/maven/gerrit-acceptance-framework_pom.xml
index 56b1db2..3c94a67 100644
--- a/tools/maven/gerrit-acceptance-framework_pom.xml
+++ b/tools/maven/gerrit-acceptance-framework_pom.xml
@@ -104,7 +104,7 @@
   </mailingLists>
 
   <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <url>https://issues.gerritcodereview.com/issues?q=is:open</url>
     <system>Gerrit Issue Tracker</system>
   </issueManagement>
 </project>
diff --git a/tools/maven/gerrit-extension-api_pom.xml b/tools/maven/gerrit-extension-api_pom.xml
index 3caa6a9..239964b 100644
--- a/tools/maven/gerrit-extension-api_pom.xml
+++ b/tools/maven/gerrit-extension-api_pom.xml
@@ -104,7 +104,7 @@
   </mailingLists>
 
   <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <url>https://issues.gerritcodereview.com/issues?q=is:open</url>
     <system>Gerrit Issue Tracker</system>
   </issueManagement>
 </project>
diff --git a/tools/maven/gerrit-plugin-api_pom.xml b/tools/maven/gerrit-plugin-api_pom.xml
index 642f051..7cada14 100644
--- a/tools/maven/gerrit-plugin-api_pom.xml
+++ b/tools/maven/gerrit-plugin-api_pom.xml
@@ -104,7 +104,7 @@
   </mailingLists>
 
   <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <url>https://issues.gerritcodereview.com/issues?q=is:open</url>
     <system>Gerrit Issue Tracker</system>
   </issueManagement>
 </project>
diff --git a/tools/maven/gerrit-war_pom.xml b/tools/maven/gerrit-war_pom.xml
index 4f545e9..8d3fcf4 100644
--- a/tools/maven/gerrit-war_pom.xml
+++ b/tools/maven/gerrit-war_pom.xml
@@ -104,7 +104,7 @@
   </mailingLists>
 
   <issueManagement>
-    <url>https://bugs.chromium.org/p/gerrit/issues/list</url>
+    <url>https://issues.gerritcodereview.com/issues?q=is:open</url>
     <system>Gerrit Issue Tracker</system>
   </issueManagement>
 </project>