diff --git a/SOURCES/0008-rh1224366-fix-valid-path-assertion.patch b/SOURCES/0008-rh1224366-fix-valid-path-assertion.patch
new file mode 100644
index 0000000..183685d
--- /dev/null
+++ b/SOURCES/0008-rh1224366-fix-valid-path-assertion.patch
@@ -0,0 +1,347 @@
+From 5eb7b04a6fb0affd7444255a7d668a44338f795d Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Wed, 27 May 2015 11:20:31 +0200
+Subject: [PATCH 1/4] device: trivial: fix a copy/paste error in comment
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
+---
+ src/devices/nm-device.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
+index a352783..c455e45 100644
+--- a/src/devices/nm-device.c
++++ b/src/devices/nm-device.c
+@@ -546,7 +546,7 @@ nm_device_get_ip_ifindex (NMDevice *self)
+ 	g_return_val_if_fail (self != NULL, 0);
+ 
+ 	priv = NM_DEVICE_GET_PRIVATE (self);
+-	/* If it's not set, default to iface */
++	/* If it's not set, default to ifindex */
+ 	return priv->ip_iface ? priv->ip_ifindex : priv->ifindex;
+ }
+ 
+-- 
+2.1.0
+
+
+From a32d216fcbebe9652cb5e5b7627ffdd9d50d1c51 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Ji=C5=99=C3=AD=20Klime=C5=A1?= <jklimes@redhat.com>
+Date: Fri, 12 Jun 2015 21:46:46 +0200
+Subject: [PATCH 2/4] utils: fix error logging in ASSERT_VALID_PATH_COMPONENT()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
+---
+ src/NetworkManagerUtils.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/src/NetworkManagerUtils.c b/src/NetworkManagerUtils.c
+index 6747b65..231031a 100644
+--- a/src/NetworkManagerUtils.c
++++ b/src/NetworkManagerUtils.c
+@@ -2254,10 +2254,7 @@ ASSERT_VALID_PATH_COMPONENT (const char *name)
+ 
+ 	return name;
+ fail:
+-	if (name)
+-		nm_log_err (LOGD_CORE, "Failed asserting path component: NULL");
+-	else
+-		nm_log_err (LOGD_CORE, "Failed asserting path component: \"%s\"", name);
++	nm_log_err (LOGD_CORE, "Failed asserting path component: \"%s\"", name ? name : "(null)");
+ 	g_error ("FATAL: Failed asserting path component: %s", name ? name : "(null)");
+ 	g_assert_not_reached ();
+ }
+-- 
+2.1.0
+
+
+From bd987c7895f1c7edcbc55c9c3ddf13007926a58e Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Tue, 28 Apr 2015 17:59:07 +0200
+Subject: [PATCH 3/4] utils: add nm_clear_g_source() helper
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Utility function to simplify the following common code:
+
+    if (priv->timeout_id) {
+        g_source_remove (priv->timeout_id);
+        priv->timeout_id = 0;
+    }
+
+to
+
+    nm_clear_g_source (&priv->timeout_id);
+
+Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
+---
+ include/nm-utils-internal.h | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/include/nm-utils-internal.h b/include/nm-utils-internal.h
+index c002b6c..49fdb0c 100644
+--- a/include/nm-utils-internal.h
++++ b/include/nm-utils-internal.h
+@@ -100,4 +100,19 @@
+         _found;                                                 \
+     })
+ 
++/*****************************************************************************/
++
++static inline gboolean
++nm_clear_g_source (guint *id)
++{
++	if (id && *id) {
++		g_source_remove (*id);
++		*id = 0;
++		return TRUE;
++	}
++	return FALSE;
++}
++
++/*****************************************************************************/
++
+ #endif
+-- 
+2.1.0
+
+
+From b663b43890efd1c0965cde7eaf1d136ff754db23 Mon Sep 17 00:00:00 2001
+From: Thomas Haller <thaller@redhat.com>
+Date: Tue, 7 Jul 2015 17:33:38 +0200
+Subject: [PATCH 4/4] device: delay handling of link-changed platform event
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+When inside a state-change, we set for example the device up.
+This triggers a link-changed event, which then causes further
+state-changes of the devices.
+A state-change in process of a device is not reentrant, so we must
+delay the handling of the link-changed event.
+
+(cherry picked from commit 04caae735fabe00e19a05d49e065514114b59d40)
+Signed-off-by: Jiří Klimeš <jklimes@redhat.com>
+---
+ src/devices/nm-device.c | 94 ++++++++++++++++++++++++++++++++++---------------
+ 1 file changed, 65 insertions(+), 29 deletions(-)
+
+diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
+index c455e45..834360a 100644
+--- a/src/devices/nm-device.c
++++ b/src/devices/nm-device.c
+@@ -180,6 +180,9 @@ typedef struct {
+ 	gboolean in_state_changed;
+ 	gboolean initialized;
+ 
++	guint device_link_changed_id;
++	guint device_ip_link_changed_id;
++
+ 	NMDeviceState state;
+ 	NMDeviceStateReason state_reason;
+ 	QueuedState   queued_state;
+@@ -1206,31 +1209,39 @@ device_set_master (NMDevice *self, int ifindex)
+ 	}
+ }
+ 
+-static void
+-device_link_changed (NMDevice *self, NMPlatformLink *info)
++static gboolean
++device_link_changed (NMDevice *self)
+ {
+ 	NMDeviceClass *klass = NM_DEVICE_GET_CLASS (self);
+ 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ 	gboolean ip_ifname_changed = FALSE;
++	NMPlatformLink info;
++	int ifindex;
+ 
+-	if (info->udi && g_strcmp0 (info->udi, priv->udi)) {
++	priv->device_link_changed_id = 0;
++
++	ifindex = nm_device_get_ifindex (self);
++	if (!nm_platform_link_get (ifindex, &info))
++		return G_SOURCE_REMOVE;
++
++	if (info.udi && g_strcmp0 (info.udi, priv->udi)) {
+ 		/* Update UDI to what udev gives us */
+ 		g_free (priv->udi);
+-		priv->udi = g_strdup (info->udi);
++		priv->udi = g_strdup (info.udi);
+ 		g_object_notify (G_OBJECT (self), NM_DEVICE_UDI);
+ 	}
+ 
+ 	/* Update MTU if it has changed. */
+-	if (priv->mtu != info->mtu) {
+-		priv->mtu = info->mtu;
++	if (priv->mtu != info.mtu) {
++		priv->mtu = info.mtu;
+ 		g_object_notify (G_OBJECT (self), NM_DEVICE_MTU);
+ 	}
+ 
+-	if (info->name[0] && strcmp (priv->iface, info->name) != 0) {
++	if (info.name[0] && strcmp (priv->iface, info.name) != 0) {
+ 		_LOGI (LOGD_DEVICE, "interface index %d renamed iface from '%s' to '%s'",
+-		       priv->ifindex, priv->iface, info->name);
++		       priv->ifindex, priv->iface, info.name);
+ 		g_free (priv->iface);
+-		priv->iface = g_strdup (info->name);
++		priv->iface = g_strdup (info.name);
+ 
+ 		/* If the device has no explicit ip_iface, then changing iface changes ip_iface too. */
+ 		ip_ifname_changed = !priv->ip_iface;
+@@ -1249,30 +1260,30 @@ device_link_changed (NMDevice *self, NMPlatformLink *info)
+ 	}
+ 
+ 	/* Update slave status for external changes */
+-	if (priv->enslaved && info->master != nm_device_get_ifindex (priv->master))
++	if (priv->enslaved && info.master != nm_device_get_ifindex (priv->master))
+ 		nm_device_release_one_slave (priv->master, self, FALSE, NM_DEVICE_STATE_REASON_NONE);
+-	if (info->master && !priv->enslaved) {
+-		device_set_master (self, info->master);
++	if (info.master && !priv->enslaved) {
++		device_set_master (self, info.master);
+ 		if (priv->master)
+ 			nm_device_enslave_slave (priv->master, self, NULL);
+ 	}
+ 
+ 	if (klass->link_changed)
+-		klass->link_changed (self, info);
++		klass->link_changed (self, &info);
+ 
+ 	/* Update DHCP, etc, if needed */
+ 	if (ip_ifname_changed)
+ 		update_for_ip_ifname_change (self);
+ 
+-	if (priv->up != info->up) {
+-		priv->up = info->up;
++	if (priv->up != info.up) {
++		priv->up = info.up;
+ 
+ 		/* Manage externally-created software interfaces only when they are IFF_UP */
+ 		g_assert (priv->ifindex > 0);
+ 		if (is_software_external (self)) {
+ 			gboolean external_down = nm_device_get_unmanaged_flag (self, NM_UNMANAGED_EXTERNAL_DOWN);
+ 
+-			if (external_down && info->up) {
++			if (external_down && info.up) {
+ 				if (nm_device_get_state (self) < NM_DEVICE_STATE_DISCONNECTED) {
+ 					/* Ensure the assume check is queued before any queued state changes
+ 					 * from the transition to UNAVAILABLE.
+@@ -1295,7 +1306,7 @@ device_link_changed (NMDevice *self, NMPlatformLink *info)
+ 					 */
+ 					priv->unmanaged_flags &= ~NM_UNMANAGED_EXTERNAL_DOWN;
+ 				}
+-			} else if (!external_down && !info->up && nm_device_get_state (self) <= NM_DEVICE_STATE_DISCONNECTED) {
++			} else if (!external_down && !info.up && nm_device_get_state (self) <= NM_DEVICE_STATE_DISCONNECTED) {
+ 				/* If the device is already disconnected and is set !IFF_UP,
+ 				 * unmanage it.
+ 				 */
+@@ -1306,23 +1317,34 @@ device_link_changed (NMDevice *self, NMPlatformLink *info)
+ 			}
+ 		}
+ 	}
++
++	return G_SOURCE_REMOVE;
+ }
+ 
+-static void
+-device_ip_link_changed (NMDevice *self, NMPlatformLink *info)
++static gboolean
++device_ip_link_changed (NMDevice *self)
+ {
+ 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
++	NMPlatformLink info;
++	int ip_ifindex;
++
++	priv->device_ip_link_changed_id = 0;
+ 
+-	if (info->name[0] && g_strcmp0 (priv->ip_iface, info->name)) {
++	ip_ifindex = nm_device_get_ip_ifindex (self);
++	if (!nm_platform_link_get (ip_ifindex, &info))
++		return G_SOURCE_REMOVE;
++
++	if (info.name[0] && g_strcmp0 (priv->ip_iface, info.name)) {
+ 		_LOGI (LOGD_DEVICE, "interface index %d renamed ip_iface (%d) from '%s' to '%s'",
+ 		       priv->ifindex, nm_device_get_ip_ifindex (self),
+-		       priv->ip_iface, info->name);
++		       priv->ip_iface, info.name);
+ 		g_free (priv->ip_iface);
+-		priv->ip_iface = g_strdup (info->name);
++		priv->ip_iface = g_strdup (info.name);
+ 
+ 		g_object_notify (G_OBJECT (self), NM_DEVICE_IP_IFACE);
+ 		update_for_ip_ifname_change (self);
+ 	}
++	return G_SOURCE_REMOVE;
+ }
+ 
+ static void
+@@ -1333,19 +1355,30 @@ link_changed_cb (NMPlatform *platform,
+                  NMPlatformReason reason,
+                  NMDevice *self)
+ {
++	NMDevicePrivate *priv;
++
+ 	if (change_type != NM_PLATFORM_SIGNAL_CHANGED)
+ 		return;
+ 
++	priv = NM_DEVICE_GET_PRIVATE (self);
++
+ 	/* We don't filter by 'reason' because we are interested in *all* link
+ 	 * changes. For example a call to nm_platform_link_set_up() may result
+ 	 * in an internal carrier change (i.e. we ask the kernel to set IFF_UP
+ 	 * and it results in also setting IFF_LOWER_UP.
+ 	 */
+ 
+-	if (ifindex == nm_device_get_ifindex (self))
+-		device_link_changed (self, info);
+-	else if (ifindex == nm_device_get_ip_ifindex (self))
+-		device_ip_link_changed (self, info);
++	if (ifindex == nm_device_get_ifindex (self)) {
++		if (!priv->device_link_changed_id) {
++			priv->device_link_changed_id = g_idle_add ((GSourceFunc) device_link_changed, self);
++			_LOGD (LOGD_DEVICE, "queued link change for ifindex %d", ifindex);
++		}
++	} else if (ifindex == nm_device_get_ip_ifindex (self)) {
++		if (!priv->device_ip_link_changed_id) {
++			priv->device_ip_link_changed_id = g_idle_add ((GSourceFunc) device_ip_link_changed, self);
++			_LOGD (LOGD_DEVICE, "queued link change for ip-ifindex %d", ifindex);
++		}
++	}
+ }
+ 
+ static void
+@@ -6677,10 +6710,10 @@ device_ip_changed (NMPlatform *platform,
+ 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ 
+ 	if (nm_device_get_ip_ifindex (self) == ifindex) {
+-		if (!priv->queued_ip_config_id)
++		if (!priv->queued_ip_config_id) {
+ 			priv->queued_ip_config_id = g_idle_add (queued_ip_config_change, self);
+-
+-		_LOGD (LOGD_DEVICE, "queued IP config change");
++			_LOGD (LOGD_DEVICE, "queued IP config change");
++		}
+ 	}
+ }
+ 
+@@ -8257,6 +8290,9 @@ dispose (GObject *object)
+ 	g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (device_ip_changed), self);
+ 	g_signal_handlers_disconnect_by_func (platform, G_CALLBACK (link_changed_cb), self);
+ 
++	nm_clear_g_source (&priv->device_link_changed_id);
++	nm_clear_g_source (&priv->device_ip_link_changed_id);
++
+ 	G_OBJECT_CLASS (nm_device_parent_class)->dispose (object);
+ }
+ 
+-- 
+2.1.0
+
diff --git a/SOURCES/0009-rh1128581-respawn-ping-on-error.patch b/SOURCES/0009-rh1128581-respawn-ping-on-error.patch
new file mode 100644
index 0000000..264f544
--- /dev/null
+++ b/SOURCES/0009-rh1128581-respawn-ping-on-error.patch
@@ -0,0 +1,239 @@
+From 8b53b4ee75f17341901b8f95f27a99fdbb771dba Mon Sep 17 00:00:00 2001
+From: Beniamino Galvani <bgalvani@redhat.com>
+Date: Tue, 14 Jul 2015 18:59:10 +0200
+Subject: [PATCH] device: restart ping process when it exits with an error
+
+When ping is launched to check the connectivity to the gateway it may
+return earlier than the given timeout in case of error. When this
+happens we need to respawn it until the timeout is reached.
+
+While at it, increase maximum timeout value to 600 seconds.
+
+https://bugzilla.redhat.com/show_bug.cgi?id=1128581
+
+(cherry picked from commit e86f8354a7aa5f8ba95b319f54f70e3e8aa9dbb7)
+---
+ libnm-core/nm-setting-connection.c |   2 +-
+ src/devices/nm-device.c            | 126 +++++++++++++++++++++++++------------
+ 2 files changed, 86 insertions(+), 42 deletions(-)
+
+diff --git a/libnm-core/nm-setting-connection.c b/libnm-core/nm-setting-connection.c
+index 01f5d42..541ef87 100644
+--- a/libnm-core/nm-setting-connection.c
++++ b/libnm-core/nm-setting-connection.c
+@@ -1562,7 +1562,7 @@ nm_setting_connection_class_init (NMSettingConnectionClass *setting_class)
+ 	g_object_class_install_property
+ 		(object_class, PROP_GATEWAY_PING_TIMEOUT,
+ 		 g_param_spec_uint (NM_SETTING_CONNECTION_GATEWAY_PING_TIMEOUT, "", "",
+-		                    0, 30, 0,
++		                    0, 600, 0,
+ 		                    G_PARAM_READWRITE |
+ 		                    G_PARAM_CONSTRUCT |
+ 		                    G_PARAM_STATIC_STRINGS));
+diff --git a/src/devices/nm-device.c b/src/devices/nm-device.c
+index 1295dc2..f753843 100644
+--- a/src/devices/nm-device.c
++++ b/src/devices/nm-device.c
+@@ -76,6 +76,7 @@ _LOG_DECLARE_SELF (NMDevice);
+ 
+ static void impl_device_disconnect (NMDevice *self, DBusGMethodInvocation *context);
+ static void impl_device_delete     (NMDevice *self, DBusGMethodInvocation *context);
++static void ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data);
+ 
+ #include "nm-device-glue.h"
+ 
+@@ -164,6 +165,9 @@ typedef struct {
+ 	guint timeout;
+ 	guint watch;
+ 	GPid pid;
++	const char *binary;
++	const char *address;
++	guint deadline;
+ } PingInfo;
+ 
+ typedef struct {
+@@ -6108,19 +6112,67 @@ ip_check_gw_ping_cleanup (NMDevice *self)
+ {
+ 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ 
+-	if (priv->gw_ping.watch) {
+-		g_source_remove (priv->gw_ping.watch);
+-		priv->gw_ping.watch = 0;
+-	}
+-	if (priv->gw_ping.timeout) {
+-		g_source_remove (priv->gw_ping.timeout);
+-		priv->gw_ping.timeout = 0;
+-	}
++	nm_clear_g_source (&priv->gw_ping.watch);
++	nm_clear_g_source (&priv->gw_ping.timeout);
+ 
+ 	if (priv->gw_ping.pid) {
+ 		nm_utils_kill_child_async (priv->gw_ping.pid, SIGTERM, priv->gw_ping.log_domain, "ping", 1000, NULL, NULL);
+ 		priv->gw_ping.pid = 0;
+ 	}
++
++	g_clear_pointer (&priv->gw_ping.binary, g_free);
++	g_clear_pointer (&priv->gw_ping.address, g_free);
++}
++
++static gboolean
++spawn_ping (NMDevice *self)
++{
++	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
++	gs_free char *str_timeout = NULL;
++	gs_free char *tmp_str = NULL;
++	const char *args[] = { priv->gw_ping.binary, "-I", nm_device_get_ip_iface (self),
++	                       "-c", "1", "-w", NULL, priv->gw_ping.address, NULL };
++	gs_free_error GError *error = NULL;
++	gboolean ret;
++
++	args[6] = str_timeout = g_strdup_printf ("%u", priv->gw_ping.deadline);
++	tmp_str = g_strjoinv (" ", (gchar **) args);
++	_LOGD (priv->gw_ping.log_domain, "ping: running '%s'", tmp_str);
++
++	ret = g_spawn_async ("/",
++	                     (gchar **) args,
++	                      NULL,
++	                      G_SPAWN_DO_NOT_REAP_CHILD,
++	                      NULL,
++	                      NULL,
++	                      &priv->gw_ping.pid,
++	                      &error);
++
++	if (!ret) {
++		_LOGW (priv->gw_ping.log_domain, "ping: could not spawn %s: %s",
++		       priv->gw_ping.binary, error->message);
++	}
++
++	return ret;
++}
++
++static gboolean
++respawn_ping_cb (gpointer user_data)
++{
++	NMDevice *self = NM_DEVICE (user_data);
++	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
++
++	priv->gw_ping.watch = 0;
++
++	if (spawn_ping (self)) {
++		priv->gw_ping.watch = g_child_watch_add (priv->gw_ping.pid,
++		                                         ip_check_ping_watch_cb, self);
++	} else {
++		ip_check_gw_ping_cleanup (self);
++		ip_check_pre_up (self);
++	}
++
++	return FALSE;
+ }
+ 
+ static void
+@@ -6129,6 +6181,7 @@ ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data)
+ 	NMDevice *self = NM_DEVICE (user_data);
+ 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+ 	guint log_domain = priv->gw_ping.log_domain;
++	gboolean success = FALSE;
+ 
+ 	if (!priv->gw_ping.watch)
+ 		return;
+@@ -6136,18 +6189,25 @@ ip_check_ping_watch_cb (GPid pid, gint status, gpointer user_data)
+ 	priv->gw_ping.pid = 0;
+ 
+ 	if (WIFEXITED (status)) {
+-		if (WEXITSTATUS (status) == 0)
++		if (WEXITSTATUS (status) == 0) {
+ 			_LOGD (log_domain, "ping: gateway ping succeeded");
+-		else {
++			success = TRUE;
++		} else {
+ 			_LOGW (log_domain, "ping: gateway ping failed with error code %d",
+ 			       WEXITSTATUS (status));
+ 		}
+ 	} else
+ 		_LOGW (log_domain, "ping: stopped unexpectedly with status %d", status);
+ 
+-	/* We've got connectivity, proceed to pre_up */
+-	ip_check_gw_ping_cleanup (self);
+-	ip_check_pre_up (self);
++	if (success) {
++		/* We've got connectivity, proceed to pre_up */
++		ip_check_gw_ping_cleanup (self);
++		ip_check_pre_up (self);
++	} else {
++		/* If ping exited with an error it may have returned early,
++		 * wait 1 second and restart it */
++		priv->gw_ping.watch = g_timeout_add_seconds (1, respawn_ping_cb, self);
++	}
+ }
+ 
+ static gboolean
+@@ -6166,46 +6226,30 @@ ip_check_ping_timeout_cb (gpointer user_data)
+ }
+ 
+ static gboolean
+-spawn_ping (NMDevice *self,
+-            guint log_domain,
++start_ping (NMDevice *self,
++            NMLogDomain log_domain,
+             const char *binary,
+             const char *address,
+             guint timeout)
+ {
+ 	NMDevicePrivate *priv = NM_DEVICE_GET_PRIVATE (self);
+-	const char *args[] = { binary, "-I", nm_device_get_ip_iface (self), "-c", "1", "-w", NULL, address, NULL };
+-	GError *error = NULL;
+-	char *str_timeout;
+-	gs_free char *tmp_str = NULL;
+-	gboolean success;
+ 
+ 	g_return_val_if_fail (priv->gw_ping.watch == 0, FALSE);
+ 	g_return_val_if_fail (priv->gw_ping.timeout == 0, FALSE);
+ 
+-	args[6] = str_timeout = g_strdup_printf ("%u", timeout);
+-
+-	_LOGD (log_domain, "ping: running '%s'",
+-	       (tmp_str = g_strjoinv (" ", (gchar **) args)));
++	priv->gw_ping.log_domain = log_domain;
++	priv->gw_ping.address = g_strdup (address);
++	priv->gw_ping.binary = g_strdup (binary);
++	priv->gw_ping.deadline = timeout + 10;	/* the proper termination is enforced by a timer */
+ 
+-	success = g_spawn_async ("/",
+-	                         (gchar **) args,
+-	                         NULL,
+-	                         G_SPAWN_DO_NOT_REAP_CHILD,
+-	                         nm_unblock_posix_signals,
+-	                         NULL,
+-	                         &priv->gw_ping.pid,
+-	                         &error);
+-	if (success) {
+-		priv->gw_ping.log_domain = log_domain;
++	if (spawn_ping (self)) {
+ 		priv->gw_ping.watch = g_child_watch_add (priv->gw_ping.pid, ip_check_ping_watch_cb, self);
+-		priv->gw_ping.timeout = g_timeout_add_seconds (timeout + 1, ip_check_ping_timeout_cb, self);
+-	} else {
+-		_LOGW (log_domain, "ping: could not spawn %s: %s", binary, error->message);
+-		g_clear_error (&error);
++		priv->gw_ping.timeout = g_timeout_add_seconds (timeout, ip_check_ping_timeout_cb, self);
++		return TRUE;
+ 	}
+ 
+-	g_free (str_timeout);
+-	return success;
++	ip_check_gw_ping_cleanup (self);
++	return FALSE;
+ }
+ 
+ static void
+@@ -6258,7 +6302,7 @@ nm_device_start_ip_check (NMDevice *self)
+ 	}
+ 
+ 	if (buf[0])
+-		spawn_ping (self, log_domain, ping_binary, buf, timeout);
++		start_ping (self, log_domain, ping_binary, buf, timeout);
+ 
+ 	/* If no ping was started, just advance to pre_up */
+ 	if (!priv->gw_ping.pid)
+-- 
+2.4.3
+
diff --git a/SPECS/NetworkManager.spec b/SPECS/NetworkManager.spec
index 4e1b5c9..8c0b35a 100644
--- a/SPECS/NetworkManager.spec
+++ b/SPECS/NetworkManager.spec
@@ -10,7 +10,7 @@
 %define snapshot .git20150121
 %define git_sha b4ea599c
 %define realversion 1.0.0
-%define release_version 14
+%define release_version 16
 %define epoch_version 1
 
 %define obsoletes_nmver 1:1.0.0-1
@@ -83,6 +83,8 @@ Patch4: 0004-bridge-route-metric.patch
 Patch5: 0005-schedule-early-config.patch
 Patch6: 0006-rh1184997-ip6ll-flush.patch
 Patch7: 0007-rh1160013-rules-subpackage.patch
+Patch8: 0008-rh1224366-fix-valid-path-assertion.patch
+Patch9: 0009-rh1128581-respawn-ping-on-error.patch
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 
@@ -369,6 +371,8 @@ by nm-connection-editor and nm-applet in a non-graphical environment.
 %patch5 -p1 -b .0005-schedule-early-config.orig
 %patch6 -p1 -b .0006-rh1184997-ip6ll-flush.orig
 %patch7 -p1 -b .0007.rh1160013.rules-subpackage.orig
+%patch8 -p1 -b .0008-rh1224366-fix-valid-path-assertion.orig
+%patch9 -p1 -b .0009-rh1128581-respawn-ping-on-error.orig
 
 %build
 
@@ -670,6 +674,12 @@ fi
 %endif
 
 %changelog
+* Tue Jul 14 2015 Beniamino Galvani <bgalvani@redhat.com> - 1:1.0.0-16.git20150121.b4ea599c
+- device: restart ping process when it exits with an error (rh #1128581)
+
+* Tue Jul  7 2015 Jiří Klimeš <jklimes@redhat.com> - 1:1.0.0-15.git20150121.b4ea599c
+- device: call device_link_changed in an idle handler to fix a potential crash (rh #1224366)
+
 * Thu Jan 29 2015 Dan Winship <danw@redhat.com> - 1:1.0.0-14.git20150121.b4ea599c
 - dispatcher: split routing rules script into a subpackage (rh #1160013)