diff --git a/zkdoc/release-note b/zkdoc/release-note
index ef6c7b0b0c7..18ccd5b5497 100644
--- a/zkdoc/release-note
+++ b/zkdoc/release-note
@@ -65,6 +65,7 @@ ZK 10.0.0
ZK-5539: $init() will call twice on Keikai component
ZK-5540: zk.wpd with browser condition won't work with ZK 10
ZK-5530: users cannot focus on the icons on the Calendar header
+ ZK-5035: Listbox renders duplicate checkmarks after adding 1st listheader dynamically
ZK-5453: XSS in chosenbox
ZK-5025: redundant selection highlight on a menupopup
diff --git a/zktest/src/main/webapp/test2/B100-ZK-5035.zul b/zktest/src/main/webapp/test2/B100-ZK-5035.zul
new file mode 100644
index 00000000000..efd96f189db
--- /dev/null
+++ b/zktest/src/main/webapp/test2/B100-ZK-5035.zul
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/zktest/src/main/webapp/test2/config.properties b/zktest/src/main/webapp/test2/config.properties
index 080784bc7b1..8a0be72b1e6 100644
--- a/zktest/src/main/webapp/test2/config.properties
+++ b/zktest/src/main/webapp/test2/config.properties
@@ -3158,6 +3158,7 @@ B90-ZK-4431.zul=A,E,Multislider
##zats##B100-ZK-5468-Tabbox.zul=A,E,Model,Tabbox
##zats##B100-ZK-5468-Tree.zul=A,E,Model,Tree
##zats##B100-ZK-5235.zul=A,E,Menu,Menupopup,focus
+##zats##B100-ZK-5035.zul=A,E,Listbox,Column,AddChild,Checkmark
##zats##B100-ZK-5453.zul=A,E,Chosenbox,XSS
##zats##B100-ZK-5025.zul=A,E,Menu,Menupopup,Menuitem,focus,hover
diff --git a/zktest/src/test/java/org/zkoss/zktest/zats/test2/B100_ZK_5035Test.java b/zktest/src/test/java/org/zkoss/zktest/zats/test2/B100_ZK_5035Test.java
new file mode 100644
index 00000000000..dd37da239bd
--- /dev/null
+++ b/zktest/src/test/java/org/zkoss/zktest/zats/test2/B100_ZK_5035Test.java
@@ -0,0 +1,33 @@
+/* B100_ZK_5035Test.java
+
+ Purpose:
+
+ Description:
+
+ History:
+ Fri Sep 08 17:14:11 CST 2023, Created by rebeccalai
+
+Copyright (C) 2023 Potix Corporation. All Rights Reserved.
+*/
+package org.zkoss.zktest.zats.test2;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+
+import org.junit.jupiter.api.Test;
+
+import org.zkoss.test.webdriver.WebDriverTestCase;
+
+public class B100_ZK_5035Test extends WebDriverTestCase {
+ @Test
+ public void test() {
+ connect();
+ waitResponse();
+ int checkableBefore = jq(".z-listitem-checkable").length();
+ click(jq("@button"));
+ waitResponse();
+ int checkableAfter = jq(".z-listitem-checkable").length();
+ assertEquals(checkableBefore, checkableAfter);
+ jq(".z-listitem-checkable").forEach(item -> assertFalse(item.parent().parent().prev().exists()));
+ }
+}
diff --git a/zul/src/main/resources/web/js/zul/sel/Listcell.ts b/zul/src/main/resources/web/js/zul/sel/Listcell.ts
index b6dbaea328f..9d7fc6331eb 100644
--- a/zul/src/main/resources/web/js/zul/sel/Listcell.ts
+++ b/zul/src/main/resources/web/js/zul/sel/Listcell.ts
@@ -170,6 +170,10 @@ export class Listcell extends zul.LabelImageWidget {
//B70-ZK-2053:make sure checkmark won't display on multiple listgroup
if (box.isCheckmark() && !_isListgroupfoot(p)
&& (!isGrp || (box.groupSelect && box.isMultiple()))) {
+ // ZK-5035: Remove the old checkmark to prevent duplicate checkmarks
+ if (this.parent?.$n('cm'))
+ this.nextSibling?.rerender();
+
var chkable = p.isSelectable(),
multi = box.isMultiple();
s += '