diff -Nur NetworkManager-1.20.10.org/libnm-core/nm-core-internal.h NetworkManager-1.20.10/libnm-core/nm-core-internal.h
--- NetworkManager-1.20.10.org/libnm-core/nm-core-internal.h	2020-06-12 11:29:24.997178184 +0800
+++ NetworkManager-1.20.10/libnm-core/nm-core-internal.h	2020-06-12 14:14:02.965298351 +0800
@@ -495,6 +495,7 @@
 	NM_BOND_OPTION_TYPE_IP,
 	NM_BOND_OPTION_TYPE_MAC,
 	NM_BOND_OPTION_TYPE_IFNAME,
+	NM_BOND_OPTION_TYPE_PRIMARY_SLAVE,
 } NMBondOptionType;
 
 NMBondOptionType
diff -Nur NetworkManager-1.20.10.org/libnm-core/nm-setting-bond.c NetworkManager-1.20.10/libnm-core/nm-setting-bond.c
--- NetworkManager-1.20.10.org/libnm-core/nm-setting-bond.c	2020-06-12 11:29:24.997178184 +0800
+++ NetworkManager-1.20.10/libnm-core/nm-setting-bond.c	2020-06-12 14:19:44.310508536 +0800
@@ -77,7 +77,7 @@
 	{ NM_SETTING_BOND_OPTION_ARP_IP_TARGET,    "",           NM_BOND_OPTION_TYPE_IP },
 	{ NM_SETTING_BOND_OPTION_ARP_VALIDATE,     "none",       NM_BOND_OPTION_TYPE_BOTH, 0, 6,
 	  { "none", "active", "backup", "all", "filter", "filter_active", "filter_backup", NULL } },
-	{ NM_SETTING_BOND_OPTION_PRIMARY,          "",           NM_BOND_OPTION_TYPE_IFNAME },
+	{ NM_SETTING_BOND_OPTION_PRIMARY,          "",           NM_BOND_OPTION_TYPE_PRIMARY_SLAVE },
 	{ NM_SETTING_BOND_OPTION_PRIMARY_RESELECT, "always",     NM_BOND_OPTION_TYPE_BOTH, 0, 2,
 	  { "always", "better", "failure", NULL } },
 	{ NM_SETTING_BOND_OPTION_FAIL_OVER_MAC,    "none",       NM_BOND_OPTION_TYPE_BOTH, 0, 2,
@@ -232,7 +232,16 @@
 	}
 	return TRUE;
 }
+static gboolean
+nm_check_primary_slave (const char *value)
+{
+	if (!value || !value[0]){
+		return TRUE;
+	}
 
+
+	return nm_utils_is_valid_iface_name (value, NULL);
+}
 static gboolean
 validate_ifname (const char *name, const char *value)
 {
@@ -280,6 +289,8 @@
 				return nm_utils_hwaddr_valid (value, ETH_ALEN);
 			case NM_BOND_OPTION_TYPE_IFNAME:
 				return validate_ifname (name, value);
+			case NM_BOND_OPTION_TYPE_PRIMARY_SLAVE:
+				return nm_check_primary_slave (value);
 			}
 			return FALSE;
 		}
@@ -333,6 +344,9 @@
                             const char *value)
 {
 	NMSettingBondPrivate *priv;
+	const char *init_updelay = "0";
+	const char *init_downdelay = "0";
+	const char *tmp = NULL;
 
 	g_return_val_if_fail (NM_IS_SETTING_BOND (setting), FALSE);
 
@@ -348,11 +362,22 @@
 	    && strcmp (value, "0") != 0) {
 		g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_ARP_INTERVAL);
 		g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_ARP_IP_TARGET);
+
+		tmp = g_hash_table_lookup (NM_SETTING_BOND_GET_PRIVATE (setting)->options, NM_SETTING_BOND_OPTION_DOWNDELAY);
+		if(!tmp){
+			g_hash_table_insert (priv->options, g_strdup (NM_SETTING_BOND_OPTION_DOWNDELAY), g_strdup (init_downdelay));
+		}
+		tmp = g_hash_table_lookup (NM_SETTING_BOND_GET_PRIVATE (setting)->options,NM_SETTING_BOND_OPTION_UPDELAY);
+		if(!tmp){
+			g_hash_table_insert (priv->options, g_strdup (NM_SETTING_BOND_OPTION_UPDELAY),g_strdup (init_updelay));
+		}
 	} else if (   !strcmp (name, NM_SETTING_BOND_OPTION_ARP_INTERVAL)
 	           && strcmp (value, "0") != 0) {
 		g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_MIIMON);
 		g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_DOWNDELAY);
 		g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_UPDELAY);
+	}else if( !strcmp (name, NM_SETTING_BOND_OPTION_PRIMARY) && !strcmp (value, "") ){
+		g_hash_table_remove (priv->options, NM_SETTING_BOND_OPTION_PRIMARY);
 	}
 
 	_notify (setting, PROP_OPTIONS);
diff -Nur NetworkManager-1.20.10.org/libnm-core/tests/test-setting.c NetworkManager-1.20.10/libnm-core/tests/test-setting.c
--- NetworkManager-1.20.10.org/libnm-core/tests/test-setting.c	2020-06-12 11:29:24.993178124 +0800
+++ NetworkManager-1.20.10/libnm-core/tests/test-setting.c	2020-06-12 14:08:36.560383748 +0800
@@ -688,7 +688,7 @@
 		((const char *[]){ "mode", "802.3ad", "ad_actor_system", "00:02:03:04:05:06", NULL }));
 	test_bond_normalize_options (
 		((const char *[]){ "mode", "1", "miimon", "1", NULL }),
-		((const char *[]){ "mode", "active-backup", "miimon", "1", NULL }));
+		((const char *[]){ "mode", "active-backup", "miimon", "1", NM_SETTING_BOND_OPTION_DOWNDELAY, "0", NM_SETTING_BOND_OPTION_UPDELAY, "0", NULL }));
 	test_bond_normalize_options (
 		((const char *[]){ "mode", "balance-alb", "tlb_dynamic_lb", "1", NULL }),
 		((const char *[]){ "mode", "balance-alb", NULL }));
