diff --git a/.NetworkManager.metadata b/.NetworkManager.metadata
index e98f47c..c158ea3 100644
--- a/.NetworkManager.metadata
+++ b/.NetworkManager.metadata
@@ -1 +1 @@
-78682cdbe2de3f01e358d0bcb2fefabae82e4b35 SOURCES/NetworkManager-1.22.0.tar.xz
+93b74524dbd01bf62f6885f2cdae6ff15c5bfd7e  SOURCES/NetworkManager-1.22.8.tar.xz
diff --git a/.gitignore b/.gitignore
index eaa4bf0..9796ed6 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/NetworkManager-1.22.0.tar.xz
+SOURCES/NetworkManager-1.22.8.tar.xz
diff --git a/SOURCES/0001-cloud-setup-systemd-unit-rh1791758.patch b/SOURCES/0001-cloud-setup-systemd-unit-rh1791758.patch
new file mode 100644
index 0000000..b356d93
--- /dev/null
+++ b/SOURCES/0001-cloud-setup-systemd-unit-rh1791758.patch
@@ -0,0 +1,37 @@
+From 04ad92e259cd81fb0a492bc0e2284877ccb297ea Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Thu, 16 Jan 2020 13:40:26 +0100
+Subject: [PATCH 1/1] cloud-setup: avoid unsupported systemd settings in
+ nm-cloud-setup.service init for rhel-8.2
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1791758
+---
+ clients/cloud-setup/nm-cloud-setup.service.in | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/clients/cloud-setup/nm-cloud-setup.service.in b/clients/cloud-setup/nm-cloud-setup.service.in
+index 69a1a29ccba1..92e427beb8a1 100644
+--- a/clients/cloud-setup/nm-cloud-setup.service.in
++++ b/clients/cloud-setup/nm-cloud-setup.service.in
+@@ -21,15 +21,15 @@ PrivateDevices=yes
+ PrivateTmp=yes
+ ProtectControlGroups=yes
+ ProtectHome=yes
+-ProtectHostname=yes
+-ProtectKernelLogs=yes
++#ProtectHostname=yes
++#ProtectKernelLogs=yes
+ ProtectKernelModules=yes
+ ProtectKernelTunables=yes
+ ProtectSystem=strict
+ RestrictAddressFamilies=AF_UNIX AF_NETLINK AF_INET AF_INET6
+ RestrictNamespaces=yes
+ RestrictRealtime=yes
+-RestrictSUIDSGID=yes
++#RestrictSUIDSGID=yes
+ SystemCallFilter=@system-service
+ 
+ [Install]
+-- 
+2.24.1
+
diff --git a/SOURCES/1000-dhcp-nettools-search-domains-fix-rh1783981.patch b/SOURCES/1000-dhcp-nettools-search-domains-fix-rh1783981.patch
deleted file mode 100644
index 7d86df4..0000000
--- a/SOURCES/1000-dhcp-nettools-search-domains-fix-rh1783981.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 43922e1ffa2442486afe60bdca3f91fe619d5980 Mon Sep 17 00:00:00 2001
-From: Beniamino Galvani <bgalvani@redhat.com>
-Date: Tue, 17 Dec 2019 14:23:33 +0100
-Subject: [PATCH 1/1] dhcp: nettools: fix parsing of search domains option
-
-'first' was never modified and so the dot was never added.
-
-Fixes: 6adade6f21d5 ('dhcp: add nettools dhcp4 client')
-
-https://bugzilla.redhat.com/show_bug.cgi?id=1783981
-(cherry picked from commit 9aa00a8a14cb64f851234d025498ff2f9ec18e94)
-(cherry picked from commit ea22135384edaf57a41293bd517ff1445b8c88a8)
----
- src/dhcp/nm-dhcp-nettools.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c
-index e557c0048750..a537ee8272bc 100644
---- a/src/dhcp/nm-dhcp-nettools.c
-+++ b/src/dhcp/nm-dhcp-nettools.c
-@@ -246,10 +246,10 @@ lease_option_print_domain_name (GString *str, uint8_t *cache, size_t *n_cachep,
- 				return TRUE;
- 			}
- 
--			if (!first) {
-+			if (!first)
- 				g_string_append_c(str, '.');
-+			else
- 				first = FALSE;
--			}
- 
- 			if (!lease_option_print_label (str, n_label, domainp, n_domainp))
- 				return FALSE;
--- 
-2.23.0
-
diff --git a/SOURCES/1000-ifcfg-fix-writer-rh1804167.patch b/SOURCES/1000-ifcfg-fix-writer-rh1804167.patch
new file mode 100644
index 0000000..9c6bffb
--- /dev/null
+++ b/SOURCES/1000-ifcfg-fix-writer-rh1804167.patch
@@ -0,0 +1,50 @@
+From ff9c477f3238aeca9b8ca2e0805d419a449ea4d9 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Tue, 18 Feb 2020 18:30:19 +0100
+Subject: [PATCH] ifcfg: fix writer when changing OVS slave to clear previous
+ settings
+
+We need to reset the OVS_PORT and OVS_PORT_UUID variables.
+Otherwise, clearing the slave type doesn't work.
+
+On master this is solved differently, by automatically clearing all
+variables that are not explicitly set.
+
+Reproducer:
+
+    nmcli con del t-eth1
+    nmcli con add type ethernet autoconnect no ifname eth1 master port0 con-name t-eth1 slave-type ovs-port
+    echo "
+    remove ovs-interface
+    remove connection.master
+    remove connection.slave-type
+    print
+    save
+    quit
+    " | nmcli c edit t-eth1
+    nmcli con show t-eth1 | grep 'ovs\|slave-type'
+
+Fixes: 1440fe6a8804 ('ifcfg: don't forget master of ovs interfaces')
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1804167
+(cherry picked from commit 0c8046574e782ca926d265348d10866f1653aef1)
+---
+ src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+index f328cc8f0..90a1a2b8f 100644
+--- a/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
++++ b/src/settings/plugins/ifcfg-rh/nms-ifcfg-rh-writer.c
+@@ -1923,6 +1923,8 @@ write_connection_setting (NMSettingConnection *s_con, shvarFile *ifcfg)
+ 	svSetValueStr (ifcfg, "BRIDGE", NULL);
+ 	svSetValueStr (ifcfg, "TEAM_MASTER_UUID", NULL);
+ 	svSetValueStr (ifcfg, "TEAM_MASTER", NULL);
++	svSetValueStr (ifcfg, "OVS_PORT_UUID", NULL);
++	svSetValueStr (ifcfg, "OVS_PORT", NULL);
+ 
+ 	master = nm_setting_connection_get_master (s_con);
+ 	if (master) {
+-- 
+2.24.1
+
diff --git a/SOURCES/1001-Revert-core-create-virtual-device-on-settings-change-rh1804350.patch b/SOURCES/1001-Revert-core-create-virtual-device-on-settings-change-rh1804350.patch
new file mode 100644
index 0000000..9762320
--- /dev/null
+++ b/SOURCES/1001-Revert-core-create-virtual-device-on-settings-change-rh1804350.patch
@@ -0,0 +1,131 @@
+From c6e479eb14779e42bc7eafdcd913cbdf7bd6c312 Mon Sep 17 00:00:00 2001
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Tue, 18 Feb 2020 19:09:18 +0100
+Subject: [PATCH] Revert "core: create virtual device on settings changes in
+ idle handler"
+
+When AddConnection() or Update() terminate, the (unrealized) virtual
+device should be already be available, otherwise an activation attempt
+of that connection can fail.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1804350
+
+This reverts commit c163207b077a0e66e344b2352ccbe392c76e63ed.
+
+(cherry picked from commit efc04b1285674ba2aea459039f4143b3307b4bcf)
+---
+ src/nm-manager.c | 51 ++----------------------------------------------
+ 1 file changed, 2 insertions(+), 49 deletions(-)
+
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 6d3a5ddbf..7f6657fd7 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -168,9 +168,6 @@ typedef struct {
+ 
+ 	NMSettings *settings;
+ 
+-	CList connection_changed_on_idle_lst;
+-	guint connection_changed_on_idle_id;
+-
+ 	RadioState radio_states[RFKILL_TYPE_MAX];
+ 	NMVpnManager *vpn_manager;
+ 
+@@ -2098,7 +2095,6 @@ static void
+ connection_changed (NMManager *self,
+                     NMSettingsConnection *sett_conn)
+ {
+-	NMManagerPrivate *priv;
+ 	NMConnection *connection;
+ 	NMDevice *device;
+ 
+@@ -2106,11 +2102,6 @@ connection_changed (NMManager *self,
+ 	                  NM_SETTINGS_CONNECTION_INT_FLAGS_VOLATILE))
+ 		return;
+ 
+-	priv = NM_MANAGER_GET_PRIVATE (self);
+-
+-	if (!nm_settings_has_connection (priv->settings, sett_conn))
+-		return;
+-
+ 	connection = nm_settings_connection_get_connection (sett_conn);
+ 
+ 	if (!nm_connection_is_virtual (connection))
+@@ -2126,46 +2117,12 @@ connection_changed (NMManager *self,
+ 	retry_connections_for_parent_device (self, device);
+ }
+ 
+-static gboolean
+-connection_changed_on_idle_cb (gpointer user_data)
+-{
+-	NMManager *self = user_data;
+-	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+-	NMCListElem *elem;
+-
+-	priv->connection_changed_on_idle_id = 0;
+-
+-	while ((elem = c_list_first_entry (&priv->connection_changed_on_idle_lst, NMCListElem, lst))) {
+-		gs_unref_object NMSettingsConnection *sett_conn = NULL;
+-
+-		sett_conn = nm_c_list_elem_free_steal (elem);
+-		connection_changed (self, sett_conn);
+-	}
+-
+-	return G_SOURCE_REMOVE;
+-}
+-
+-static void
+-connection_changed_on_idle (NMManager *self,
+-                            NMSettingsConnection *sett_conn)
+-{
+-	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+-
+-	if (priv->connection_changed_on_idle_id == 0)
+-		priv->connection_changed_on_idle_id = g_idle_add (connection_changed_on_idle_cb, self);
+-
+-	if (!nm_c_list_elem_find_first_ptr (&priv->connection_changed_on_idle_lst, sett_conn)) {
+-		c_list_link_tail (&priv->connection_changed_on_idle_lst,
+-		                  &nm_c_list_elem_new_stale (g_object_ref (sett_conn))->lst);
+-	}
+-}
+-
+ static void
+ connection_added_cb (NMSettings *settings,
+                      NMSettingsConnection *sett_conn,
+                      NMManager *self)
+ {
+-	connection_changed_on_idle (self, sett_conn);
++	connection_changed (self, sett_conn);
+ }
+ 
+ static void
+@@ -2174,7 +2131,7 @@ connection_updated_cb (NMSettings *settings,
+                        guint update_reason_u,
+                        NMManager *self)
+ {
+-	connection_changed_on_idle (self, sett_conn);
++	connection_changed (self, sett_conn);
+ }
+ 
+ /*****************************************************************************/
+@@ -7511,7 +7468,6 @@ nm_manager_init (NMManager *self)
+ 	c_list_init (&priv->active_connections_lst_head);
+ 	c_list_init (&priv->async_op_lst_head);
+ 	c_list_init (&priv->delete_volatile_connection_lst_head);
+-	c_list_init (&priv->connection_changed_on_idle_lst);
+ 
+ 	priv->platform = g_object_ref (NM_PLATFORM_GET);
+ 
+@@ -7817,9 +7773,6 @@ dispose (GObject *object)
+ 		g_clear_object (&priv->policy);
+ 	}
+ 
+-	nm_clear_g_source (&priv->connection_changed_on_idle_id);
+-	nm_c_list_elem_free_all (&priv->connection_changed_on_idle_lst, g_object_unref);
+-
+ 	if (priv->settings) {
+ 		g_signal_handlers_disconnect_by_func (priv->settings, settings_startup_complete_changed, self);
+ 		g_signal_handlers_disconnect_by_func (priv->settings, system_unmanaged_devices_changed_cb, self);
+-- 
+2.24.1
+
diff --git a/SOURCES/1002-device-allow-setting-arp_validate-with-supported-bon-rh1789437.patch b/SOURCES/1002-device-allow-setting-arp_validate-with-supported-bon-rh1789437.patch
new file mode 100644
index 0000000..d61808c
--- /dev/null
+++ b/SOURCES/1002-device-allow-setting-arp_validate-with-supported-bon-rh1789437.patch
@@ -0,0 +1,52 @@
+From 517099b8bf6ee6ef801ef7ca9a3d32e80935b71a Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Wed, 19 Feb 2020 10:10:27 +0100
+Subject: [PATCH 1/1] device: allow setting "arp_validate" with supported bond
+ modes
+
+arp_validate is allowed for several bonding modes, at least since commit [1].
+
+The validation was too strict. Just use set_bond_attr() directly, that
+already correctly encodes whether to set the value or not.
+
+[1] https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=13ac34a8866e31b31db6237c73aa558aff84d765
+
+(cherry picked from commit d9d51dd42d288501bb1af5ef69736dd8f1687e3b)
+(cherry picked from commit 02ba767496302f516492357a3bd4dc6cee3bd343)
+---
+ src/devices/nm-device-bond.c | 11 ++---------
+ 1 file changed, 2 insertions(+), 9 deletions(-)
+
+diff --git a/src/devices/nm-device-bond.c b/src/devices/nm-device-bond.c
+index c6ecb2e85fb8..36d003283977 100644
+--- a/src/devices/nm-device-bond.c
++++ b/src/devices/nm-device-bond.c
+@@ -214,7 +214,7 @@ apply_bonding_config (NMDeviceBond *self)
+ 	 *
+ 	 * arp_interval conflicts miimon > 0
+ 	 * arp_interval conflicts [ alb, tlb ]
+-	 * arp_validate needs [ active-backup ]
++	 * arp_validate does not work with [ BOND_MODE_8023AD, BOND_MODE_TLB, BOND_MODE_ALB ]
+ 	 * downdelay needs miimon
+ 	 * updelay needs miimon
+ 	 * primary needs [ active-backup, tlb, alb ]
+@@ -266,15 +266,8 @@ apply_bonding_config (NMDeviceBond *self)
+ 		 */
+ 	}
+ 
+-	/* ARP validate: value > 0 only valid in active-backup mode */
+ 	value = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_ARP_VALIDATE);
+-	if (   value
+-	    && !nm_streq (value, "0")
+-	    && !nm_streq (value, "none")
+-	    && mode == NM_BOND_MODE_ACTIVEBACKUP)
+-		set_bond_attr (device, mode, NM_SETTING_BOND_OPTION_ARP_VALIDATE, value);
+-	else
+-		set_bond_attr (device, mode, NM_SETTING_BOND_OPTION_ARP_VALIDATE, "0");
++	set_bond_attr (device, mode, NM_SETTING_BOND_OPTION_ARP_VALIDATE, value ?: "0");
+ 
+ 	/* Primary */
+ 	value = nm_setting_bond_get_option_by_name (s_bond, NM_SETTING_BOND_OPTION_PRIMARY);
+-- 
+2.24.1
+
diff --git a/SOURCES/1003-dhcp-keep-trying-after-send-failure-rh1806516.patch b/SOURCES/1003-dhcp-keep-trying-after-send-failure-rh1806516.patch
new file mode 100644
index 0000000..35400f5
--- /dev/null
+++ b/SOURCES/1003-dhcp-keep-trying-after-send-failure-rh1806516.patch
@@ -0,0 +1,136 @@
+From 95c67b5117499c3a31cdb52b81f1cc9bdb091d88 Mon Sep 17 00:00:00 2001
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Tue, 18 Feb 2020 17:04:37 +0100
+Subject: [PATCH 1/2] n-dhcp4: fix logging macro
+
+The level can be a complex expression, don't use it directly in the
+macro.
+
+(cherry picked from commit 910267cf5f0f163a038ec983bec237c8a8cb1abf)
+(cherry picked from commit 84c4920f5d97cc79ca349d035c719ffac3dd5fc3)
+---
+ shared/n-dhcp4/src/n-dhcp4-private.h | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/shared/n-dhcp4/src/n-dhcp4-private.h b/shared/n-dhcp4/src/n-dhcp4-private.h
+index 436ee8065..f647cb5e2 100644
+--- a/shared/n-dhcp4/src/n-dhcp4-private.h
++++ b/shared/n-dhcp4/src/n-dhcp4-private.h
+@@ -702,10 +702,11 @@ static inline uint64_t n_dhcp4_gettime(clockid_t clock) {
+ #define n_dhcp4_c_log(_config, _level, ...)                                    \
+         do {                                                                   \
+                 const NDhcp4ClientConfig *__config = _config;                  \
++                int __level = _level;                                          \
+                                                                                \
+-                if (_level <= __config->log.level && __config->log.func) {     \
++                if (__level <= __config->log.level && __config->log.func) {    \
+                         if (1) {                                               \
+-                                _config->log.func(_level,                      \
++                                _config->log.func(__level,                     \
+                                                   __config->log.data,          \
+                                                   __VA_ARGS__);                \
+                         } else {                                               \
+-- 
+2.24.1
+
+From 539bb87ca200faaba7d1ccb96aae5eaf15349173 Mon Sep 17 00:00:00 2001
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Mon, 24 Feb 2020 09:55:13 +0100
+Subject: [PATCH 2/2] n-dhcp4: keep trying after a failure in send()
+
+Currently if an error is encountered during a send() of a message, the
+client fails and there is no possibility of recover, since no timers
+are armed after a failed event dispatch. An easy way to reproduce a
+failure is to add a firewall rule like:
+
+  iptables -A OUTPUT -p udp --dport 67 -j REJECT
+
+which makes the send() fail with EPERM during the renew. In such case,
+the client should continue (failing) until it reaches the rebind phase
+at T2, when it will be able to renew the lease using the packet
+socket.
+
+In general, a failure to send a packet should not cause the failure of
+the client.
+
+https://gitlab.freedesktop.org/NetworkManager/NetworkManager/merge_requests/419
+https://bugzilla.redhat.com/show_bug.cgi?id=1806516
+(cherry picked from commit 5a7b83ea0a2eb3cb0bb39c8219490c704024b5f5)
+(cherry picked from commit 932b4538aee7da9a1fe75d115358bb943872e3fd)
+---
+ shared/n-dhcp4/src/n-dhcp4-c-connection.c | 25 ++++++++++++-----------
+ 1 file changed, 13 insertions(+), 12 deletions(-)
+
+diff --git a/shared/n-dhcp4/src/n-dhcp4-c-connection.c b/shared/n-dhcp4/src/n-dhcp4-c-connection.c
+index d4354467d..a5c8ea66f 100644
+--- a/shared/n-dhcp4/src/n-dhcp4-c-connection.c
++++ b/shared/n-dhcp4/src/n-dhcp4-c-connection.c
+@@ -1006,6 +1006,7 @@ static int n_dhcp4_c_connection_send_request(NDhcp4CConnection *connection,
+                                              uint64_t timestamp) {
+         char server_addr[INET_ADDRSTRLEN];
+         char client_addr[INET_ADDRSTRLEN];
++        char error_msg[128];
+         int r;
+         bool broadcast = false;
+ 
+@@ -1045,45 +1046,45 @@ static int n_dhcp4_c_connection_send_request(NDhcp4CConnection *connection,
+         case N_DHCP4_C_MESSAGE_REBIND:
+                 broadcast = true;
+                 r = n_dhcp4_c_connection_packet_broadcast(connection, request);
+-                if (r)
+-                        return r;
+                 break;
+         case N_DHCP4_C_MESSAGE_INFORM:
+                 broadcast = true;
+                 r = n_dhcp4_c_connection_udp_broadcast(connection, request);
+-                if (r)
+-                        return r;
+-
+                 break;
+         case N_DHCP4_C_MESSAGE_RENEW:
+         case N_DHCP4_C_MESSAGE_RELEASE:
+                 r = n_dhcp4_c_connection_udp_send(connection, request);
+-                if (r)
+-                        return r;
+-
+                 break;
+         default:
+                 c_assert(0);
+         }
+ 
++        if (r) {
++                snprintf(error_msg, sizeof(error_msg), ": error %d", r);
++        } else {
++                error_msg[0] = '\0';
++        }
++
+         if (request->userdata.client_addr == INADDR_ANY) {
+                 n_dhcp4_c_log(connection->client_config, LOG_INFO,
+-                              "sent %s to %s",
++                              "send %s to %s%s",
+                               message_type_to_str(request->userdata.message_type),
+                               broadcast ?
+                               "255.255.255.255" :
+                               inet_ntop(AF_INET, &connection->server_ip,
+-                                        server_addr, sizeof(server_addr)));
++                                        server_addr, sizeof(server_addr)),
++                              error_msg);
+         } else {
+                 n_dhcp4_c_log(connection->client_config, LOG_INFO,
+-                              "sent %s of %s to %s",
++                              "send %s of %s to %s%s",
+                               message_type_to_str(request->userdata.message_type),
+                               inet_ntop(AF_INET, &request->userdata.client_addr,
+                                         client_addr, sizeof(client_addr)),
+                               broadcast ?
+                               "255.255.255.255" :
+                               inet_ntop(AF_INET, &connection->server_ip,
+-                                        server_addr, sizeof(server_addr)));
++                                        server_addr, sizeof(server_addr)),
++                              error_msg);
+         }
+ 
+         ++request->userdata.n_send;
+-- 
+2.24.1
+
diff --git a/SOURCES/1004-ovs-fail-enslavement-if-no-bridge-rh1797696.patch b/SOURCES/1004-ovs-fail-enslavement-if-no-bridge-rh1797696.patch
new file mode 100644
index 0000000..e5a5469
--- /dev/null
+++ b/SOURCES/1004-ovs-fail-enslavement-if-no-bridge-rh1797696.patch
@@ -0,0 +1,86 @@
+From 717915c1e292953ababf7519b9e34a90a3aaacab Mon Sep 17 00:00:00 2001
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Thu, 20 Feb 2020 14:38:30 +0100
+Subject: [PATCH 1/2] ovs: fail port enslavement when the bridge AC is not
+ found
+
+The previous code tried to get the bridge active connection and it
+used the port active connection instead in case of failure. This
+doesn't seem right, as in nm-ovsdb.c the bridge AC is used to get the
+bridge settings (including the uuid, interface name, and cloned mac).
+
+In case of failure getting the bridge AC we should just fail.
+
+Fixes: 830a5a14cb29 ('device: add support for OpenVSwitch devices')
+(cherry picked from commit c8b5a3f91a1be7c595be4bc176a75d5beb57047a)
+(cherry picked from commit d8fb95d22b0aaf006eeb6f071a319eb8e2a50ae1)
+---
+ src/devices/ovs/nm-device-ovs-port.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/src/devices/ovs/nm-device-ovs-port.c b/src/devices/ovs/nm-device-ovs-port.c
+index 0955e8a92..66a610530 100644
+--- a/src/devices/ovs/nm-device-ovs-port.c
++++ b/src/devices/ovs/nm-device-ovs-port.c
+@@ -86,6 +86,7 @@ add_iface_cb (GError *error, gpointer user_data)
+ static gboolean
+ enslave_slave (NMDevice *device, NMDevice *slave, NMConnection *connection, gboolean configure)
+ {
++	NMDeviceOvsPort *self = NM_DEVICE_OVS_PORT (device);
+ 	NMActiveConnection *ac_port = NULL;
+ 	NMActiveConnection *ac_bridge = NULL;
+ 	NMDevice *bridge_device;
+@@ -95,8 +96,11 @@ enslave_slave (NMDevice *device, NMDevice *slave, NMConnection *connection, gboo
+ 
+ 	ac_port = NM_ACTIVE_CONNECTION (nm_device_get_act_request (device));
+ 	ac_bridge = nm_active_connection_get_master (ac_port);
+-	if (!ac_bridge)
+-		ac_bridge = ac_port;
++	if (!ac_bridge) {
++		_LOGW (LOGD_DEVICE, "can't enslave %s: bridge active-connection not found",
++		       nm_device_get_iface (slave));
++		return FALSE;
++	}
+ 
+ 	bridge_device = nm_active_connection_get_device (ac_bridge);
+ 
+-- 
+2.24.1
+
+From fb4fbb7bc7569540871b96f930f01b15a6687abd Mon Sep 17 00:00:00 2001
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Thu, 20 Feb 2020 14:44:58 +0100
+Subject: [PATCH 2/2] ovs: fail port enslavement when the bridge device is not
+ found
+
+Fail the enslavement of the ovs port if the bridge device is not
+found, instead of generating assertions and potentially crash later.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1797696
+
+Fixes: 101e65d2bb19 ('ovs: allow changing mac address of bridges and interfaces')
+(cherry picked from commit c5c49995b10baf043fa57a96c9d8ddf2e99267b4)
+(cherry picked from commit 7494a2e37ab0114d1d3ef93b0dbe47005d3f8741)
+---
+ src/devices/ovs/nm-device-ovs-port.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/src/devices/ovs/nm-device-ovs-port.c b/src/devices/ovs/nm-device-ovs-port.c
+index 66a610530..e02163777 100644
+--- a/src/devices/ovs/nm-device-ovs-port.c
++++ b/src/devices/ovs/nm-device-ovs-port.c
+@@ -103,6 +103,11 @@ enslave_slave (NMDevice *device, NMDevice *slave, NMConnection *connection, gboo
+ 	}
+ 
+ 	bridge_device = nm_active_connection_get_device (ac_bridge);
++	if (!bridge_device) {
++		_LOGW (LOGD_DEVICE, "can't enslave %s: bridge device not found",
++		       nm_device_get_iface (slave));
++		return FALSE;
++	}
+ 
+ 	nm_ovsdb_add_interface (nm_ovsdb_get (),
+ 	                        nm_active_connection_get_applied_connection (ac_bridge),
+-- 
+2.24.1
+
diff --git a/SOURCES/1005-fix-leak-device-state-files-rh1810153.patch b/SOURCES/1005-fix-leak-device-state-files-rh1810153.patch
new file mode 100644
index 0000000..779f364
--- /dev/null
+++ b/SOURCES/1005-fix-leak-device-state-files-rh1810153.patch
@@ -0,0 +1,391 @@
+From 457fae22aea770e2bf6553630caba645b6e1796d Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Wed, 4 Mar 2020 13:21:48 +0100
+Subject: [PATCH 1/4] core: cleanup nm_config_device_state_prune_unseen() and
+ accept NMPlatform for skipping pruning
+
+(cherry picked from commit ad9e7488167ab25a5915040e813e76a5b669257b)
+(cherry picked from commit 0b4ebda859a3dc1c8ec4d8c887383d04bcd249f9)
+---
+ src/nm-config.c  | 36 +++++++++++++++++++++++-------------
+ src/nm-config.h  |  3 ++-
+ src/nm-manager.c |  8 ++++----
+ 3 files changed, 29 insertions(+), 18 deletions(-)
+
+diff --git a/src/nm-config.c b/src/nm-config.c
+index a0995cf932b8..0fccca4e22dc 100644
+--- a/src/nm-config.c
++++ b/src/nm-config.c
+@@ -2298,6 +2298,8 @@ _config_device_state_data_new (int ifindex, GKeyFile *kf)
+ 	return device_state;
+ }
+ 
++#define DEVICE_STATE_FILENAME_LEN_MAX 60
++
+ /**
+  * nm_config_device_state_load:
+  * @ifindex: the ifindex for which the state is to load
+@@ -2309,7 +2311,7 @@ NMConfigDeviceStateData *
+ nm_config_device_state_load (int ifindex)
+ {
+ 	NMConfigDeviceStateData *device_state;
+-	char path[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR) + 60];
++	char path[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR"/") + DEVICE_STATE_FILENAME_LEN_MAX + 1];
+ 	gs_unref_keyfile GKeyFile *kf = NULL;
+ 	const char *nm_owned_str;
+ 
+@@ -2393,7 +2395,7 @@ nm_config_device_state_write (int ifindex,
+                               const char *next_server,
+                               const char *root_path)
+ {
+-	char path[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR) + 60];
++	char path[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR"/") + DEVICE_STATE_FILENAME_LEN_MAX + 1];
+ 	GError *local = NULL;
+ 	gs_unref_keyfile GKeyFile *kf = NULL;
+ 
+@@ -2476,35 +2478,43 @@ nm_config_device_state_write (int ifindex,
+ }
+ 
+ void
+-nm_config_device_state_prune_unseen (GHashTable *seen_ifindexes)
++nm_config_device_state_prune_unseen (GHashTable *preserve_ifindexes,
++                                     NMPlatform *preserve_in_platform)
+ {
+ 	GDir *dir;
+ 	const char *fn;
+-	int ifindex;
+-	gsize fn_len;
+-	char buf[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR"/") + 30 + 3] = NM_CONFIG_DEVICE_STATE_DIR"/";
++	char buf[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR"/") + DEVICE_STATE_FILENAME_LEN_MAX + 1] = NM_CONFIG_DEVICE_STATE_DIR"/";
+ 	char *buf_p = &buf[NM_STRLEN (NM_CONFIG_DEVICE_STATE_DIR"/")];
+ 
+-	g_return_if_fail (seen_ifindexes);
+-
+ 	dir = g_dir_open (NM_CONFIG_DEVICE_STATE_DIR, 0, NULL);
+ 	if (!dir)
+ 		return;
+ 
+ 	while ((fn = g_dir_read_name (dir))) {
++		int ifindex;
++		gsize fn_len;
++
+ 		ifindex = _device_state_parse_filename (fn);
+ 		if (ifindex <= 0)
+ 			continue;
+-		if (g_hash_table_contains (seen_ifindexes, GINT_TO_POINTER (ifindex)))
++
++		if (   preserve_ifindexes
++		    && g_hash_table_contains (preserve_ifindexes, GINT_TO_POINTER (ifindex)))
++			continue;
++
++		if (   preserve_in_platform
++		    && nm_platform_link_get (preserve_in_platform, ifindex))
+ 			continue;
+ 
+-		fn_len = strlen (fn) + 1;
++		fn_len = strlen (fn);
++		nm_assert (fn_len > 0);
+ 		nm_assert (&buf_p[fn_len] < &buf[G_N_ELEMENTS (buf)]);
+-		memcpy (buf_p, fn, fn_len);
++		memcpy (buf_p, fn, fn_len + 1u);
+ 		nm_assert (({
+ 		                char bb[30];
+-		                nm_sprintf_buf (bb, "%d", ifindex);
+-		                nm_streq0 (bb, buf_p);
++
++		                nm_streq0 (nm_sprintf_buf (bb, "%d", ifindex),
++		                           buf_p);
+ 		           }));
+ 		_LOGT ("device-state: prune #%d (%s)", ifindex, buf);
+ 		(void) unlink (buf);
+diff --git a/src/nm-config.h b/src/nm-config.h
+index d9460ebb46e3..048d64f41f47 100644
+--- a/src/nm-config.h
++++ b/src/nm-config.h
+@@ -258,7 +258,8 @@ gboolean nm_config_device_state_write (int ifindex,
+                                        const char *next_server,
+                                        const char *root_path);
+ 
+-void nm_config_device_state_prune_unseen (GHashTable *seen_ifindexes);
++void nm_config_device_state_prune_unseen (GHashTable *preserve_ifindexes,
++                                          NMPlatform *preserve_in_platform);
+ 
+ const GHashTable *nm_config_device_state_get_all (NMConfig *self);
+ const NMConfigDeviceStateData *nm_config_device_state_get (NMConfig *self,
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 7f6657fd70e2..35127fa6cd25 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -6585,19 +6585,19 @@ void
+ nm_manager_write_device_state_all (NMManager *self)
+ {
+ 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+-	gs_unref_hashtable GHashTable *seen_ifindexes = NULL;
++	gs_unref_hashtable GHashTable *preserve_ifindexes = NULL;
+ 	NMDevice *device;
+ 
+-	seen_ifindexes = g_hash_table_new (nm_direct_hash, NULL);
++	preserve_ifindexes = g_hash_table_new (nm_direct_hash, NULL);
+ 
+ 	c_list_for_each_entry (device, &priv->devices_lst_head, devices_lst) {
+ 		if (nm_manager_write_device_state (self, device)) {
+-			g_hash_table_add (seen_ifindexes,
++			g_hash_table_add (preserve_ifindexes,
+ 			                  GINT_TO_POINTER (nm_device_get_ip_ifindex (device)));
+ 		}
+ 	}
+ 
+-	nm_config_device_state_prune_unseen (seen_ifindexes);
++	nm_config_device_state_prune_unseen (preserve_ifindexes, NULL);
+ }
+ 
+ static gboolean
+-- 
+2.24.1
+
+
+From af10b35dabc0b542eba8117bb32b3fee3ff207f9 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Wed, 4 Mar 2020 16:52:57 +0100
+Subject: [PATCH 2/4] core/trivial: rename
+ nm_config_device_state_prune_unseen() to nm_config_device_state_prune_stale()
+
+It's just a more fitting name after the previous change.
+
+(cherry picked from commit ecb0210e7a225f2b73149229cc96ac84f93404d1)
+(cherry picked from commit 7fa1e825450ce4b69670b5bfd5a9c705d9c05920)
+---
+ src/nm-config.c  | 4 ++--
+ src/nm-config.h  | 4 ++--
+ src/nm-manager.c | 2 +-
+ 3 files changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/nm-config.c b/src/nm-config.c
+index 0fccca4e22dc..0a6082d71a63 100644
+--- a/src/nm-config.c
++++ b/src/nm-config.c
+@@ -2478,8 +2478,8 @@ nm_config_device_state_write (int ifindex,
+ }
+ 
+ void
+-nm_config_device_state_prune_unseen (GHashTable *preserve_ifindexes,
+-                                     NMPlatform *preserve_in_platform)
++nm_config_device_state_prune_stale (GHashTable *preserve_ifindexes,
++                                    NMPlatform *preserve_in_platform)
+ {
+ 	GDir *dir;
+ 	const char *fn;
+diff --git a/src/nm-config.h b/src/nm-config.h
+index 048d64f41f47..b4478ceb04af 100644
+--- a/src/nm-config.h
++++ b/src/nm-config.h
+@@ -258,8 +258,8 @@ gboolean nm_config_device_state_write (int ifindex,
+                                        const char *next_server,
+                                        const char *root_path);
+ 
+-void nm_config_device_state_prune_unseen (GHashTable *preserve_ifindexes,
+-                                          NMPlatform *preserve_in_platform);
++void nm_config_device_state_prune_stale (GHashTable *preserve_ifindexes,
++                                         NMPlatform *preserve_in_platform);
+ 
+ const GHashTable *nm_config_device_state_get_all (NMConfig *self);
+ const NMConfigDeviceStateData *nm_config_device_state_get (NMConfig *self,
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 35127fa6cd25..c9ef20a526d2 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -6597,7 +6597,7 @@ nm_manager_write_device_state_all (NMManager *self)
+ 		}
+ 	}
+ 
+-	nm_config_device_state_prune_unseen (preserve_ifindexes, NULL);
++	nm_config_device_state_prune_stale (preserve_ifindexes, NULL);
+ }
+ 
+ static gboolean
+-- 
+2.24.1
+
+
+From 509b555a45b170f843242e3d92b229936457ba75 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Wed, 4 Mar 2020 13:38:49 +0100
+Subject: [PATCH 3/4] core: return ifindex from nm_manager_write_device_state()
+
+nm_manager_write_device_state() writes the device state to a file. The ifindex
+is here important, because that is the identifier for the device and is also
+used as file name. Return the ifindex that was used, instead of letting the
+caller reimplement the knowledge which ifindex was used.
+
+(cherry picked from commit 5477847eed9654727df5b70767a2a6498da1cb67)
+(cherry picked from commit fb6e14cf3f602a840bee66c27dfcb754872f1525)
+---
+ src/nm-manager.c | 34 +++++++++++++++++++++-------------
+ src/nm-manager.h |  2 +-
+ 2 files changed, 22 insertions(+), 14 deletions(-)
+
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index c9ef20a526d2..74776a24acf2 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -1515,7 +1515,7 @@ manager_device_state_changed (NMDevice *device,
+ 	               NM_DEVICE_STATE_UNMANAGED,
+ 	               NM_DEVICE_STATE_DISCONNECTED,
+ 	               NM_DEVICE_STATE_ACTIVATED))
+-		nm_manager_write_device_state (self, device);
++		nm_manager_write_device_state (self, device, NULL);
+ 
+ 	if (NM_IN_SET (new_state,
+ 	               NM_DEVICE_STATE_UNAVAILABLE,
+@@ -6514,7 +6514,7 @@ start_factory (NMDeviceFactory *factory, gpointer user_data)
+ }
+ 
+ gboolean
+-nm_manager_write_device_state (NMManager *self, NMDevice *device)
++nm_manager_write_device_state (NMManager *self, NMDevice *device, int *out_ifindex)
+ {
+ 	NMManagerPrivate *priv = NM_MANAGER_GET_PRIVATE (self);
+ 	int ifindex;
+@@ -6530,6 +6530,8 @@ nm_manager_write_device_state (NMManager *self, NMDevice *device)
+ 	const char *next_server = NULL;
+ 	const char *root_path = NULL;
+ 
++	NM_SET_OUT (out_ifindex, 0);
++
+ 	ifindex = nm_device_get_ip_ifindex (device);
+ 	if (ifindex <= 0)
+ 		return FALSE;
+@@ -6570,15 +6572,19 @@ nm_manager_write_device_state (NMManager *self, NMDevice *device)
+ 		next_server = nm_dhcp4_config_get_option (dhcp4_config, "next_server");
+ 	}
+ 
+-	return nm_config_device_state_write (ifindex,
+-	                                     managed_type,
+-	                                     perm_hw_addr_fake,
+-	                                     uuid,
+-	                                     nm_owned,
+-	                                     route_metric_default_aspired,
+-	                                     route_metric_default_effective,
+-	                                     next_server,
+-	                                     root_path);
++	if (!nm_config_device_state_write (ifindex,
++	                                   managed_type,
++	                                   perm_hw_addr_fake,
++	                                   uuid,
++	                                   nm_owned,
++	                                   route_metric_default_aspired,
++	                                   route_metric_default_effective,
++	                                   next_server,
++	                                   root_path))
++		return FALSE;
++
++	NM_SET_OUT (out_ifindex, ifindex);
++	return TRUE;
+ }
+ 
+ void
+@@ -6591,9 +6597,11 @@ nm_manager_write_device_state_all (NMManager *self)
+ 	preserve_ifindexes = g_hash_table_new (nm_direct_hash, NULL);
+ 
+ 	c_list_for_each_entry (device, &priv->devices_lst_head, devices_lst) {
+-		if (nm_manager_write_device_state (self, device)) {
++		int ifindex;
++
++		if (nm_manager_write_device_state (self, device, &ifindex)) {
+ 			g_hash_table_add (preserve_ifindexes,
+-			                  GINT_TO_POINTER (nm_device_get_ip_ifindex (device)));
++			                  GINT_TO_POINTER (ifindex));
+ 		}
+ 	}
+ 
+diff --git a/src/nm-manager.h b/src/nm-manager.h
+index ad06e318f4dc..5873abd24b8e 100644
+--- a/src/nm-manager.h
++++ b/src/nm-manager.h
+@@ -103,7 +103,7 @@ NMSettingsConnection **nm_manager_get_activatable_connections (NMManager *manage
+                                                                guint *out_len);
+ 
+ void          nm_manager_write_device_state_all (NMManager *manager);
+-gboolean      nm_manager_write_device_state (NMManager *manager, NMDevice *device);
++gboolean      nm_manager_write_device_state (NMManager *manager, NMDevice *device, int *out_ifindex);
+ 
+ /* Device handling */
+ 
+-- 
+2.24.1
+
+
+From d60b888a07d69e155a7bea9dead1376df1a21bfb Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Wed, 4 Mar 2020 15:44:53 +0100
+Subject: [PATCH 4/4] core: periodically cleanup unused device state files from
+ /run
+
+Otherwise, we only prune unused files when the service terminates.
+Usually, NetworkManager service doesn't get restarted before shutdown
+of the system (nor should it be). That means, if you create (and
+destroy) a large number of software devices, the state files pile
+up.
+
+From time to time, go through the files on disk and delete those that
+are no longer relevant.
+
+In this case, "from time to time" means after we write/update state
+files 100 times.
+
+(cherry picked from commit 332df7a58e86ce08cfd9331897d8b928ae6d267e)
+(cherry picked from commit d65b5c2e81f69ddc9217159a16f49d23d965da1c)
+---
+ src/nm-manager.c | 20 +++++++++++++++++++-
+ 1 file changed, 19 insertions(+), 1 deletion(-)
+
+diff --git a/src/nm-manager.c b/src/nm-manager.c
+index 74776a24acf2..931d1068f160 100644
+--- a/src/nm-manager.c
++++ b/src/nm-manager.c
+@@ -50,6 +50,8 @@
+ #include "nm-dispatcher.h"
+ #include "NetworkManagerUtils.h"
+ 
++#define DEVICE_STATE_PRUNE_RATELIMIT_MAX 100u
++
+ /*****************************************************************************/
+ 
+ typedef struct {
+@@ -191,6 +193,8 @@ typedef struct {
+ 
+ 	NMConnectivityState connectivity_state;
+ 
++	guint8 device_state_prune_ratelimit_count;
++
+ 	bool startup:1;
+ 	bool devices_inited:1;
+ 
+@@ -1514,9 +1518,23 @@ manager_device_state_changed (NMDevice *device,
+ 	if (NM_IN_SET (new_state,
+ 	               NM_DEVICE_STATE_UNMANAGED,
+ 	               NM_DEVICE_STATE_DISCONNECTED,
+-	               NM_DEVICE_STATE_ACTIVATED))
++	               NM_DEVICE_STATE_ACTIVATED)) {
+ 		nm_manager_write_device_state (self, device, NULL);
+ 
++		G_STATIC_ASSERT_EXPR (DEVICE_STATE_PRUNE_RATELIMIT_MAX < G_MAXUINT8);
++		if (priv->device_state_prune_ratelimit_count++ > DEVICE_STATE_PRUNE_RATELIMIT_MAX) {
++			/* We write the device state to /run. The state files are named after the
++			 * ifindex (which is assumed to be unique and not repeat -- in practice
++			 * it may repeat). So from time to time, we prune device state files
++			 * for interfaces that no longer exist.
++			 *
++			 * Otherwise, the files might pile up if you create (and destroy) a large
++			 * number of software devices. */
++			priv->device_state_prune_ratelimit_count = 0;
++			nm_config_device_state_prune_stale (NULL, priv->platform);
++		}
++	}
++
+ 	if (NM_IN_SET (new_state,
+ 	               NM_DEVICE_STATE_UNAVAILABLE,
+ 	               NM_DEVICE_STATE_DISCONNECTED))
+-- 
+2.24.1
+
diff --git a/SOURCES/1006-dhcp-nettools-clear-source-rh1810188.patch b/SOURCES/1006-dhcp-nettools-clear-source-rh1810188.patch
new file mode 100644
index 0000000..786e672
--- /dev/null
+++ b/SOURCES/1006-dhcp-nettools-clear-source-rh1810188.patch
@@ -0,0 +1,78 @@
+From 6347e939e6210c8f6bc40f8b43f41acec27ea6b8 Mon Sep 17 00:00:00 2001
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Sat, 29 Feb 2020 19:14:10 +0100
+Subject: [PATCH 1/2] dhcp: clean source on dispatch failure
+
+Fix the following warning:
+
+ NetworkManager[1524461]: Source ID 3844 was not found when attempting to remove it
+
+ g_logv (log_domain=0x7f2816fa676e "GLib", log_level=G_LOG_LEVEL_CRITICAL, format=<optimized out>, args=args@entry=0x7ffe697374d0) at gmessages.c:1391
+ g_log (log_domain=log_domain@entry=0x7f2816fa676e "GLib", log_level=log_level@entry=G_LOG_LEVEL_CRITICAL, format=format@entry=0x7f2816fae240 "Source ID %u was not found when attempting to remove it") at gmessages.c:1432
+ g_source_remove (tag=519) at gmain.c:2352
+ nm_clear_g_source (id=<optimized out>) at ./shared/nm-glib-aux/nm-macros-internal.h:1198
+ dispose (object=0x55f7289b1ca0) at src/dhcp/nm-dhcp-nettools.c:1433
+ g_object_unref (_object=<optimized out>) at gobject.c:3303
+ g_object_unref (_object=0x55f7289b1ca0) at gobject.c:3232
+ dhcp4_cleanup (self=self@entry=0x55f728af3b20, cleanup_type=cleanup_type@entry=CLEANUP_TYPE_DECONFIGURE, release=release@entry=0) at src/devices/nm-device.c:7565
+ ...
+
+Fixes: 45521b1b3872 ('dhcp: nettools: move to failed state if event dispatch fails')
+(cherry picked from commit 843d696e46d96eb30642d872ba6c1a46c900ca14)
+(cherry picked from commit 7a004ef0bb49717606acbf47326a4c6c753cb09b)
+---
+ src/dhcp/nm-dhcp-nettools.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c
+index 45ff46f53fbd..2af73cdc3c3c 100644
+--- a/src/dhcp/nm-dhcp-nettools.c
++++ b/src/dhcp/nm-dhcp-nettools.c
+@@ -1074,6 +1074,7 @@ dhcp4_event_cb (GIOChannel *source,
+ 		 */
+ 		_LOGE ("error %d dispatching events", r);
+ 		nm_dhcp_client_set_state (NM_DHCP_CLIENT (self), NM_DHCP_STATE_FAIL, NULL, NULL);
++		priv->event_id = 0;
+ 		return G_SOURCE_REMOVE;
+ 	}
+ 
+-- 
+2.24.1
+
+
+From b978458c375e06722ae16b332d26b9678c0da455 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Tue, 3 Mar 2020 09:50:43 +0100
+Subject: [PATCH 2/2] dhcp/nettools: first clear source before emitting event
+ in dhcp4_event_cb()
+
+A similar patch was done on master, but here the situation is different.
+
+I feel we should not allow for the possibility where we invoke an event
+that might mess with the source id. In practice there was no problem.
+But it feels cleaner to clear it first.
+
+Fixes: 843d696e46d9 ('dhcp: clean source on dispatch failure')
+(cherry picked from commit 0549351111ccfde9d6a404952c43234612028d13)
+(cherry picked from commit beeb067c71b4b67778badb6eed6ee2dd00a5218f)
+---
+ src/dhcp/nm-dhcp-nettools.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/dhcp/nm-dhcp-nettools.c b/src/dhcp/nm-dhcp-nettools.c
+index 2af73cdc3c3c..622251a31c27 100644
+--- a/src/dhcp/nm-dhcp-nettools.c
++++ b/src/dhcp/nm-dhcp-nettools.c
+@@ -1073,8 +1073,8 @@ dhcp4_event_cb (GIOChannel *source,
+ 		 * a predefined number of times (possibly infinite).
+ 		 */
+ 		_LOGE ("error %d dispatching events", r);
+-		nm_dhcp_client_set_state (NM_DHCP_CLIENT (self), NM_DHCP_STATE_FAIL, NULL, NULL);
+ 		priv->event_id = 0;
++		nm_dhcp_client_set_state (NM_DHCP_CLIENT (self), NM_DHCP_STATE_FAIL, NULL, NULL);
+ 		return G_SOURCE_REMOVE;
+ 	}
+ 
+-- 
+2.24.1
+
diff --git a/SOURCES/9999-fix-pregen-doc.patch b/SOURCES/9999-fix-pregen-doc.patch
index 2bf3732..fc80b07 100644
--- a/SOURCES/9999-fix-pregen-doc.patch
+++ b/SOURCES/9999-fix-pregen-doc.patch
@@ -14,10 +14,10 @@ Patch the man pages with the proper values.
  2 files changed, 2 insertions(+), 2 deletions(-)
 
 diff --git a/docs/api/html/NetworkManager.conf.html b/docs/api/html/NetworkManager.conf.html
-index 97287e90fe06..d8369008a47e 100644
+index 04672d9bd998..8486881f2cb3 100644
 --- a/docs/api/html/NetworkManager.conf.html
 +++ b/docs/api/html/NetworkManager.conf.html
-@@ -569,7 +569,7 @@ unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth
+@@ -572,7 +572,7 @@ unmanaged-devices=mac:00:22:68:1c:59:b1;mac:00:1E:65:30:D1:C4;interface-name:eth
            are "<code class="literal">syslog</code>" and "<code class="literal">journal</code>".
            When NetworkManager is started with "<code class="literal">--debug</code>"
            in addition all messages will be printed to stderr.
@@ -27,10 +27,10 @@ index 97287e90fe06..d8369008a47e 100644
  </tr>
  <tr>
 diff --git a/man/NetworkManager.conf.5 b/man/NetworkManager.conf.5
-index 6b1a3081a7a4..77ce8668cf4b 100644
+index b2984e0aacce..bc0aa552db99 100644
 --- a/man/NetworkManager.conf.5
 +++ b/man/NetworkManager.conf.5
-@@ -590,7 +590,7 @@ INFO\&.
+@@ -596,7 +596,7 @@ INFO\&.
  .PP
  \fIbackend\fR
  .RS 4
diff --git a/SPECS/NetworkManager.spec b/SPECS/NetworkManager.spec
index c564a55..292ace9 100644
--- a/SPECS/NetworkManager.spec
+++ b/SPECS/NetworkManager.spec
@@ -5,9 +5,9 @@
 %global glib2_version %(pkg-config --modversion glib-2.0 2>/dev/null || echo bad)
 
 %global epoch_version 1
-%global rpm_version 1.22.0
-%global real_version 1.22.0
-%global release_version 2
+%global rpm_version 1.22.8
+%global real_version 1.22.8
+%global release_version 4
 %global snapshot %{nil}
 %global git_sha %{nil}
 
@@ -141,10 +141,17 @@ Source6: 70-nm-connectivity.conf
 # RHEL downstream patches that change behavior from upstream.
 # These are not bugfixes, hence they are also relevant after
 # the next rebase of the source tarball.
-#Patch1: 0001-some-downstream-difference.patch
+Patch1: 0001-cloud-setup-systemd-unit-rh1791758.patch
 
 # Bugfixes that are only relevant until next rebase of the package.
-Patch1000: 1000-dhcp-nettools-search-domains-fix-rh1783981.patch
+#Patch1000: 1000-some-patch.patch
+Patch1000: 1000-ifcfg-fix-writer-rh1804167.patch
+Patch1001: 1001-Revert-core-create-virtual-device-on-settings-change-rh1804350.patch
+Patch1002: 1002-device-allow-setting-arp_validate-with-supported-bon-rh1789437.patch
+Patch1003: 1003-dhcp-keep-trying-after-send-failure-rh1806516.patch
+Patch1004: 1004-ovs-fail-enslavement-if-no-bridge-rh1797696.patch
+Patch1005: 1005-fix-leak-device-state-files-rh1810153.patch
+Patch1006: 1006-dhcp-nettools-clear-source-rh1810188.patch
 
 # The pregenerated docs contain default values and paths that depend
 # on the configure options when creating the source tarball.
@@ -1068,6 +1075,43 @@ fi
 
 
 %changelog
+* Fri Mar  6 2020 Thomas Haller <thaller@redhat.com> - 1:1.22.8-4
+- core: fix leaking device state files in /run (rh #1810153)
+- dhcp: fix crash in nettools client when leaking GSource (rh #1810188)
+
+* Mon Feb 24 2020 Beniamino Galvani <bgalvani@redhat.com> - 1:1.22.8-3
+- dhcp: keep trying after a send failure (rh #1806516)
+- ovs: fail port enslavement when the bridge is not found (rh #1797696)
+
+* Wed Feb 19 2020 Thomas Haller <thaller@redhat.com> - 1:1.22.8-2
+- bond: fix setting arp_validate option for other bonding modes (rh #1789437)
+
+* Tue Feb 18 2020 Antonio Cardace <acardace@redhat.com> - 1:1.22.8-1
+- Update to 1.22.8
+- Added configuration option to customize IPv6 RA timeout (rh #1801158)
+- Removed length limitation for OVS Bridge, Patches and Interfaces (only Patch types) names (rh #1788432)
+- Reworked asynchronous deactivation of OVS interfaces (rh #1787989, rh #1782701)
+- Fixed failure when creating team interfaces (rh #1798947)
+- ifcfg-rh: fix clearing ovs slave type from ifcfg-rh file (rh #1804167)
+- Fixed bug causing virtual devices to not be available after AddConnection()/Update() (rh #1804350)
+
+* Fri Jan 31 2020 Antonio Cardace <acardace@redhat.com> - 1:1.22.6-1
+- Update to 1.22.6
+- nm-device: add new pending action to keep the device busy when in between states (rh #1759956)
+- cloud-setup: avoid unsupported settings in systemd service unit (rh #1791758)
+- do not create virtual device if master is not present (rh #1795919)
+- allow IPv6 RA timeout to be set to a value higher than 120 seconds (rh #1795957)
+- fix behaviour when 'ipv4.dhcp-timeout' option is set to 'infinity' (rh #1791378)
+
+* Fri Jan 10 2020 Beniamino Galvani <bgalvani@redhat.com> - 1:1.22.4-1
+- Update to 1.22.4
+- dhcp: fix behavior of internal DHCP client when the server sends a NAK (rh #1787219)
+
+* Sat Dec 28 2019 Thomas Haller <thaller@redhat.com> - 1:1.22.2-1
+- Update to 1.22.2
+- core,libnm: expose capability for OVS support (rh #1785147)
+- dhcp: various bugfixes for nettools n-dhcp4 plugin
+
 * Tue Dec 17 2019 Thomas Haller <thaller@redhat.com> - 1:1.22.0-2
 - dhcp: fix parsing of DNS search domain with nettools plugin (rh #1783981)