diff --git a/polygerrit-ui/app/elements/checks/gr-checks-results.ts b/polygerrit-ui/app/elements/checks/gr-checks-results.ts
index 4530631..848948f 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-results.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-results.ts
@@ -768,7 +768,7 @@
    * is empty, then no run is selected and all runs should be shown.
    */
   @state()
-  selectedRuns: string[] = [];
+  selectedRuns: Set<string> = new Set();
 
   @state()
   actions: Action[] = [];
@@ -1304,10 +1304,7 @@
   }
 
   isRunSelected(run: {checkName: string}) {
-    return (
-      this.selectedRuns.length === 0 ||
-      this.selectedRuns.includes(run.checkName)
-    );
+    return this.selectedRuns.size === 0 || this.selectedRuns.has(run.checkName);
   }
 
   renderFilter() {
@@ -1316,7 +1313,7 @@
         this.isRunSelected(run) && isAttemptSelected(this.selectedAttempt, run)
     );
     if (
-      this.selectedRuns.length === 0 &&
+      this.selectedRuns.size === 0 &&
       allResults(runs).length <= 3 &&
       this.filterRegExp === ''
     ) {
@@ -1360,7 +1357,7 @@
       ],
       []
     );
-    const isSelectionActive = this.selectedRuns.length > 0;
+    const isSelectionActive = this.selectedRuns.size > 0;
     const selected = all.filter(result => this.isRunSelected(result));
     const re = new RegExp(this.filterRegExp, 'i');
     const filtered = selected.filter(result => matches(result, re));
diff --git a/polygerrit-ui/app/elements/checks/gr-checks-runs.ts b/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
index b068426..128a9b0a 100644
--- a/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
+++ b/polygerrit-ui/app/elements/checks/gr-checks-runs.ts
@@ -405,7 +405,7 @@
   collapsed = false;
 
   @state()
-  selectedRuns: string[] = [];
+  selectedRuns: Set<string> = new Set();
 
   @state()
   selectedAttempt: AttemptChoice = LATEST_ATTEMPT;
@@ -668,8 +668,8 @@
 
   private renderTitleButtons() {
     if (this.collapsed) return;
-    if (this.selectedRuns.length < 2) return;
-    const actions = this.selectedRuns.map(selected => {
+    if (this.selectedRuns.size < 2) return;
+    const actions = [...this.selectedRuns].map(selected => {
       const run = this.runs.find(
         run => run.isLatestAttempt && run.checkName === selected
       );
@@ -685,7 +685,7 @@
         class="font-normal"
         link
         @click=${() =>
-          this.getViewModel().updateState({checksRunsSelected: []})}
+          this.getViewModel().updateState({checksRunsSelected: undefined})}
         >Unselect All</gr-button
       >
       <gr-tooltip-content
@@ -829,8 +829,8 @@
   }
 
   renderRun(run: CheckRun) {
-    const selectedRun = this.selectedRuns.includes(run.checkName);
-    const deselected = !selectedRun && this.selectedRuns.length > 0;
+    const selectedRun = this.selectedRuns.has(run.checkName);
+    const deselected = !selectedRun && this.selectedRuns.size > 0;
     return html`<gr-checks-run
       .run=${run}
       ?condensed=${this.collapsed}
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
index 0c9b6302..f829313 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router.ts
@@ -1411,7 +1411,7 @@
     const attempt = stringToAttemptChoice(queryMap.get('attempt'));
     if (attempt && attempt !== LATEST_ATTEMPT) state.attempt = attempt;
     const selected = queryMap.get('checksRunsSelected');
-    if (selected) state.checksRunsSelected = selected.split(',');
+    if (selected) state.checksRunsSelected = new Set(selected.split(','));
 
     assertIsDefined(state.project, 'project');
     this.reporting.setRepoName(state.project);
diff --git a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts
index 5c5e67d..119ba48 100644
--- a/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts
+++ b/polygerrit-ui/app/elements/core/gr-router/gr-router_test.ts
@@ -1161,7 +1161,7 @@
             attempt: 1,
             filter: 'fff',
             tab: 'checks',
-            checksRunsSelected: ['asdf', 'qwer'],
+            checksRunsSelected: new Set(['asdf', 'qwer']),
             checksResultsFilter: 'asdf.*qwer',
           });
         });
diff --git a/polygerrit-ui/app/models/views/change.ts b/polygerrit-ui/app/models/views/change.ts
index 6b80f23..3790bb0 100644
--- a/polygerrit-ui/app/models/views/change.ts
+++ b/polygerrit-ui/app/models/views/change.ts
@@ -14,7 +14,7 @@
 import {Tab} from '../../constants/constants';
 import {GerritView} from '../../services/router/router-model';
 import {UrlEncodedCommentId} from '../../types/common';
-import {toggle} from '../../utils/common-util';
+import {toggleSet} from '../../utils/common-util';
 import {select} from '../../utils/observable-util';
 import {
   encodeURL,
@@ -47,7 +47,7 @@
   /** selected attempt for check runs (undefined=latest) */
   attempt?: AttemptChoice;
   /** selected check runs identified by `checkName` */
-  checksRunsSelected?: string[];
+  checksRunsSelected?: Set<string>;
   /** regular expression for filtering check results */
   checksResultsFilter?: string;
 
@@ -117,7 +117,7 @@
   if (state.checksResultsFilter) {
     queries.push(`checksResultsFilter=${state.checksResultsFilter}`);
   }
-  if (state.checksRunsSelected && state.checksRunsSelected.length > 0) {
+  if (state.checksRunsSelected && state.checksRunsSelected.size > 0) {
     queries.push(`checksRunsSelected=${[...state.checksRunsSelected].sort()}`);
   }
   if (state.tab && state.tab !== Tab.FILES) {
@@ -174,7 +174,7 @@
 
   public readonly checksRunsSelected$ = select(
     this.state$,
-    state => state?.checksRunsSelected ?? []
+    state => state?.checksRunsSelected ?? new Set<string>()
   );
 
   constructor() {
@@ -191,7 +191,9 @@
   }
 
   toggleSelectedCheckRun(checkName: string) {
-    const selected = this.getState()?.checksRunsSelected ?? [];
-    this.updateState({checksRunsSelected: toggle(selected, checkName)});
+    const current = this.getState()?.checksRunsSelected ?? new Set();
+    const next = new Set(current);
+    toggleSet(next, checkName);
+    this.updateState({checksRunsSelected: next});
   }
 }
diff --git a/polygerrit-ui/app/models/views/change_test.ts b/polygerrit-ui/app/models/views/change_test.ts
index f756d4b..2cea325 100644
--- a/polygerrit-ui/app/models/views/change_test.ts
+++ b/polygerrit-ui/app/models/views/change_test.ts
@@ -39,7 +39,7 @@
   test('createChangeUrl() checksRunsSelected', () => {
     const state: ChangeViewState = {
       ...STATE,
-      checksRunsSelected: ['asdf'],
+      checksRunsSelected: new Set(['asdf']),
     };
 
     assert.equal(
diff --git a/polygerrit-ui/app/utils/common-util.ts b/polygerrit-ui/app/utils/common-util.ts
index 03306f5..183d167 100644
--- a/polygerrit-ui/app/utils/common-util.ts
+++ b/polygerrit-ui/app/utils/common-util.ts
@@ -117,7 +117,7 @@
 /**
  * Add value, if the set does not contain it. Otherwise remove it.
  */
-export function toggleSetMembership<T>(set: Set<T>, value: T): void {
+export function toggleSet<T>(set: Set<T>, value: T): void {
   if (set.has(value)) {
     set.delete(value);
   } else {
@@ -125,10 +125,6 @@
   }
 }
 
-export function unique<T>(item: T, index: number, array: T[]) {
-  return array.indexOf(item) === index;
-}
-
 export function toggle<T>(array: T[], item: T): T[] {
   if (array.includes(item)) {
     return array.filter(r => r !== item);
@@ -137,6 +133,10 @@
   }
 }
 
+export function unique<T>(item: T, index: number, array: T[]) {
+  return array.indexOf(item) === index;
+}
+
 /**
  * Returns the elements that are present in every sub-array. If a compareBy
  * predicate is passed in, it will be used instead of strict equality. A new
