diff --git a/iopsys-brcm63xx-arm/base-files/sbin/vlanconf b/iopsys-brcm63xx-arm/base-files/sbin/vlanconf
index 5f346affa4cdc0c845e1141e5a3b83dc9ea5eceb..49007fc95f31b55c97f3f1b6353d40c9a42a3f2d 100755
--- a/iopsys-brcm63xx-arm/base-files/sbin/vlanconf
+++ b/iopsys-brcm63xx-arm/base-files/sbin/vlanconf
@@ -392,7 +392,13 @@ create_vlan() {
 			vlanCtl_filterOnTagVid $VLANID $TAGINDEX
 
 			TAGINDEX=1
-			[ $TYPE == "8021ad" ] && vlanCtl_filterOnTagVid $INNER_VLANID $TAGINDEX
+
+			# The check for INNER_VLANID -ne 0 is for supporting any inner vlan in QinQ
+			# if INNER_VLANID is specified, then, this rule is added normally:
+			# vlanctl  --set-rxif NAME --filter-vid VLANID 0 --filter-vid INNER_VLANID 1 --pop-tag --if IFNAME --rx --tags 2 --rule-append
+			# Otherwise, pop outer tag and continue:
+			# vlanctl  --set-rxif NAME --filter-vid VLANID --pop-tag --if IFNAME --rx --tags 2 --rule-append
+			[ "$TYPE" == "8021ad" -a $INNER_VLANID -ne 0 ] && vlanCtl_filterOnTagVid $INNER_VLANID $TAGINDEX
 
 			# For managed interfaces, pop the vlan header at rx
 			if [ $UNMANAGED -eq 0 ]; then
@@ -458,7 +464,13 @@ create_vlan() {
 			vlanCtl_filterOnTagVid $VLANID $TAGINDEX
 
 			TAGINDEX=1
-			[ $TYPE == "8021ad" ] && vlanCtl_filterOnTagVid $INNER_VLANID $TAGINDEX
+
+			# The check for INNER_VLANID -ne 0 is for supporting any inner vlan in QinQ
+			# if INNER_VLANID is specified, then, this rule is added normally:
+			# vlanctl  --set-rxif NAME --filter-vid VLANID 0 --filter-vid INNER_VLANID 1 --pop-tag --if IFNAME --rx --tags 2 --rule-append
+			# Otherwise, pop outer tag and continue:
+			# vlanctl  --set-rxif NAME --filter-vid VLANID --pop-tag --if IFNAME --rx --tags 2 --rule-append
+			[ "$TYPE" == "8021ad" -a $INNER_VLANID -ne 0 ] && vlanCtl_filterOnTagVid $INNER_VLANID $TAGINDEX
 
 			vlanCtl_cmdPopVlanTag
 			[ $TYPE == "8021ad" ] && vlanCtl_cmdPopVlanTag