diff --git a/comps-rocky-10-lh.xml.in b/comps-rocky-10-lh.xml.in
index 91c5e366067ea87ceedadc279a0d9db7d8eb5abd..b31f11c1a509ba25dd76510d0fe7fbae51df51ba 100644
--- a/comps-rocky-10-lh.xml.in
+++ b/comps-rocky-10-lh.xml.in
@@ -1,4 +1,4 @@
-<!DOCTYPE comps PUBLIC "-//Red Hat, Inc.//DTD Comps info//EN" "comps.dtd">
+<?xml version="1.0"?>
 <comps>
   <group variant="BaseOS">
     <id>conflicts-baseos</id>
@@ -254,6 +254,7 @@
       <packagereq type="mandatory" variant="BaseOS">selinux-policy-targeted</packagereq>
       <packagereq type="mandatory" variant="BaseOS">setup</packagereq>
       <packagereq type="mandatory" variant="BaseOS">shadow-utils</packagereq>
+      <rhel_only><packagereq type="conditional" requires="redhat-release" variant="BaseOS">subscription-manager</packagereq></rhel_only>
       <packagereq type="mandatory" variant="BaseOS">sssd-common</packagereq>
       <packagereq type="mandatory" variant="BaseOS">sssd-kcm</packagereq>
       <packagereq type="mandatory" variant="BaseOS">sudo</packagereq>
@@ -283,6 +284,8 @@
       <packagereq type="default" variant="BaseOS">sg3_utils-libs</packagereq>
       <packagereq type="default" variant="BaseOS">initscripts-rename-device</packagereq>
       <packagereq type="default" variant="AppStream">python3-libselinux</packagereq>
+      <rhel_only><packagereq type="default" variant="AppStream">insights-client</packagereq></rhel_only>
+      <rhel_only><packagereq type="default" variant="AppStream">rhc</packagereq></rhel_only>
       <packagereq type="optional" variant="BaseOS">dracut-config-generic</packagereq>
       <packagereq type="optional" variant="BaseOS">dracut-network</packagereq>
       <packagereq type="optional" variant="BaseOS" arch="s390x">libzfcphbaapi</packagereq>
@@ -1059,6 +1062,8 @@
       <packagereq type="default" variant="BaseOS">sos</packagereq>
       <packagereq type="default" variant="BaseOS">sssd</packagereq>
       <packagereq type="default" variant="BaseOS">strace</packagereq>
+      <rhel_only><packagereq type="conditional" requires="redhat-release" variant="BaseOS">subscription-manager-cockpit</packagereq></rhel_only>
+      <rhel_only><packagereq type="conditional" requires="redhat-release" variant="BaseOS">libdnf-plugin-subscription-manager</packagereq></rhel_only>
       <packagereq type="default" variant="BaseOS">time</packagereq>
       <packagereq type="default" variant="BaseOS">unzip</packagereq>
       <packagereq type="default" variant="BaseOS">usbutils</packagereq>
@@ -1083,6 +1088,7 @@
       <packagereq type="default" variant="AppStream">wget</packagereq>
       <packagereq type="default" variant="AppStream">vim-enhanced</packagereq>
       <packagereq type="default" variant="AppStream">insights-client</packagereq>
+      <rhel_only><packagereq type="default" variant="AppStream">rhc</packagereq></rhel_only>
     </packagelist>
   </group>
   <group>
@@ -1162,6 +1168,8 @@
       <packagereq type="default" variant="BaseOS">sos</packagereq>
       <packagereq type="default" variant="BaseOS">sssd</packagereq>
       <packagereq type="default" variant="BaseOS">strace</packagereq>
+      <rhel_only><packagereq type="conditional" requires="redhat-release" variant="BaseOS">subscription-manager-cockpit</packagereq></rhel_only>
+      <rhel_only><packagereq type="conditional" requires="redhat-release" variant="BaseOS">libdnf-plugin-subscription-manager</packagereq></rhel_only>
       <packagereq type="default" variant="BaseOS">time</packagereq>
       <packagereq type="default" variant="BaseOS">unzip</packagereq>
       <packagereq type="default" variant="BaseOS">usbutils</packagereq>
@@ -1185,7 +1193,8 @@
       <packagereq type="default" variant="AppStream">tcpdump</packagereq>
       <packagereq type="default" variant="AppStream">wget</packagereq>
       <packagereq type="default" variant="AppStream">vim-enhanced</packagereq>
-      <packagereq type="default" variant="AppStream">insights-client</packagereq>
+      <rhel_only><packagereq type="default" variant="AppStream">insights-client</packagereq></rhel_only>
+      <rhel_only><packagereq type="default" variant="AppStream">rhc</packagereq></rhel_only>
     </packagelist>
   </group>
   <group>
@@ -2129,7 +2138,7 @@
       <packagereq type="default" variant="AppStream">perl-generators</packagereq>
       <packagereq type="default" variant="AppStream">perl-Fedora-VSP</packagereq>
       <packagereq type="default" variant="AppStream" arch="aarch64,x86_64">pesign</packagereq>
-      <packagereq type="default" variant="AppStream" >source-highlight</packagereq>
+      <packagereq type="default" variant="AppStream">source-highlight</packagereq>
       <packagereq type="default" variant="AppStream">systemtap</packagereq>
       <packagereq type="default" variant="AppStream">jna</packagereq>
       <packagereq type="default" arch="aarch64,ppc64le,x86_64,s390x" variant="AppStream">valgrind</packagereq>
diff --git a/scripts/Makefile b/scripts/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..9ede2c949add779f1d38c049b7f9ff4387923ff9
--- /dev/null
+++ b/scripts/Makefile
@@ -0,0 +1,34 @@
+XMLINFILES=$(wildcard *.xml.in)
+XMLFILES = $(patsubst %.xml.in,%.xml,$(XMLINFILES))
+
+all: po $(XMLFILES) sort
+
+po: $(XMLINFILES)
+	make -C po -f Makefile || exit 1
+
+clean:
+	@rm -fv *~ *.xml
+
+validate: $(XMLFILES) comps.rng
+	# Run xmllint on each file and exit with non-zero if any validation fails
+	RES=0; for f in $(XMLFILES); do \
+		xmllint --noout --relaxng comps.rng $$f; \
+		RES=$$(($$RES + $$?)); \
+	done; exit $$RES
+
+sort:
+	@# Run xsltproc on each xml.in file and exit with non-zero if any sorting fails
+	@# The comps-eln.xml.in is not sorted alphabetically but manually
+	@# based on the need needs of Fedora ELN SIG.
+	@RES=0; for f in $(XMLINFILES); do \
+		if [[ "$$f" == 'comps-eln.xml.in' ]]; then \
+			continue; \
+		fi; \
+		xsltproc --novalid -o $$f comps-cleanup.xsl $$f; \
+		RES=$$(($$RES + $$?)); \
+	done; exit $$RES
+
+%.xml: %.xml.in
+	@xmllint --noout $<
+	@if test ".$(CLEANUP)" == .yes; then xsltproc --novalid -o $< comps-cleanup.xsl $<; fi
+	./update-comps $@ $(DISTRO)
diff --git a/scripts/comps-distro-only.xsl b/scripts/comps-distro-only.xsl
new file mode 100644
index 0000000000000000000000000000000000000000..26ebc557b514107de3c1bbb6bd6c9fd4c2e42e6d
--- /dev/null
+++ b/scripts/comps-distro-only.xsl
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+    xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    version="1.1">
+    <xsl:param name="distro"/>
+
+    <xsl:template match="node()|@*">
+        <xsl:copy>
+            <xsl:apply-templates select="node()|@*"/>
+        </xsl:copy>
+    </xsl:template>
+
+
+    <xsl:template match="rhel_only">
+        <xsl:if test="$distro='rhel'">
+            <xsl:apply-templates/>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template match="centos_only">
+        <xsl:if test="$distro='centos'">
+            <xsl:apply-templates/>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template match="rocky_only">
+        <xsl:if test="$distro='rocky'">
+            <xsl:apply-templates/>
+        </xsl:if>
+    </xsl:template>
+
+</xsl:stylesheet>
diff --git a/scripts/update-comps b/scripts/update-comps
index b163e1ca9481ba00338e9a053de400c37198cda1..de1fa06b3142a67945995f218c9a502fc77d123f 100755
--- a/scripts/update-comps
+++ b/scripts/update-comps
@@ -1,3 +1,12 @@
 #!/bin/bash
-COMPS_FILE=$1
-LANG=C intltool-merge -x -u po/ $COMPS_FILE.xml.in $COMPS_FILE.xml
+
+COMPSFILE=$1
+DISTRO=$2
+
+if [ -z "$COMPSFILE" ]; then
+    echo "Usage: $0 <compsfile>"
+    exit 1
+fi
+
+LANG=C intltool-merge -x -u po/ $COMPSFILE.in $COMPSFILE
+xsltproc --stringparam distro $DISTRO --novalid -o $COMPSFILE comps-distro-only.xsl $COMPSFILE