diff --git a/meta/classes-recipe/dpkg-base.bbclass b/meta/classes-recipe/dpkg-base.bbclass
index 164f247e..66f4d177 100644
--- a/meta/classes-recipe/dpkg-base.bbclass
+++ b/meta/classes-recipe/dpkg-base.bbclass
@@ -231,14 +231,22 @@ addtask dpkg_build_setscene
 
 CLEANFUNCS += "deb_clean"
 
+# Architectures under which this recipe's binary packages end up in the repo:
+# the concrete build arch (PACKAGE_ARCH resolves DPKG_ARCH=any), plus "all"
+# when this is the build that also produces the arch-independent packages.
+def deb_clean_archs(d):
+    dpkg_arch = d.getVar('DPKG_ARCH') or 'any'
+    package_arch = d.getVar('PACKAGE_ARCH')
+    host_arch = d.getVar('HOST_ARCH')
+    archs = [package_arch if dpkg_arch == 'any' else dpkg_arch]
+    if package_arch == host_arch and 'all' not in archs:
+        archs.append('all')
+    return ' '.join(a for a in archs if a)
+
 deb_clean() {
-    DEBS=$( find ${DEPLOY_DIR_DEB} -maxdepth 1 -name "*.deb" || [ ! -d ${S} ] )
-    if [ -n "${DEBS}" ]; then
-        for d in ${DEBS}; do
-            repo_del_package "${REPO_ISAR_DIR}"/"${DISTRO}" \
-                "${REPO_ISAR_DB_DIR}"/"${DISTRO}" "${DEBDISTRONAME}" "${d}"
-        done
-    fi
+    repo_del_by_source "${REPO_ISAR_DIR}"/"${DISTRO}" \
+        "${REPO_ISAR_DB_DIR}"/"${DISTRO}" "${DEBDISTRONAME}" \
+        "${BPN}" ${@deb_clean_archs(d)}
 }
 # the clean function modifies isar-apt. Do not add DEPLOY_DIR_DEB_LOCK here:
 # CLEANFUNCS also runs sstate_cleanall(), which takes that lock itself, and
diff --git a/meta/classes-recipe/repository.bbclass b/meta/classes-recipe/repository.bbclass
index a2061100..d255d1c8 100644
--- a/meta/classes-recipe/repository.bbclass
+++ b/meta/classes-recipe/repository.bbclass
@@ -129,6 +129,28 @@ repo_del_package() {
     repo_set_release_date "${dir}" "${codename}"
 }
 
+repo_del_by_source() {
+    local dir="$1"
+    local dbdir="$2"
+    local codename="$3"
+    local source="$4"
+    shift 4
+
+    if [ -n "${GNUPGHOME}" ]; then
+        export GNUPGHOME="${GNUPGHOME}"
+    fi
+    local arch_filter=""
+    local arch
+    for arch in "$@"; do
+        [ -n "${arch_filter}" ] && arch_filter="${arch_filter}|"
+        arch_filter="${arch_filter}Architecture (= ${arch})"
+    done
+    reprepro -b "${dir}" --dbdir "${dbdir}" -C main \
+        removefilter "${codename}" \
+        '$Source (= '"${source}"'), ('"${arch_filter}"'), $PackageType (= deb)'
+    repo_set_release_date "${dir}" "${codename}"
+}
+
 repo_contains_package() {
     local dir="$1"
     local dbdir="$2"
