diff --git a/.gitignore b/.gitignore
index acaa05c..8242f96 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/tuned-2.7.1.tar.bz2
+SOURCES/tuned-2.8.0.tar.bz2
diff --git a/.tuned.metadata b/.tuned.metadata
index a64257d..7104979 100644
--- a/.tuned.metadata
+++ b/.tuned.metadata
@@ -1 +1 @@
-a9201acb6811484e5566527d5fc7e5c1f078e97e SOURCES/tuned-2.7.1.tar.bz2
+ab82f13f867aeb64e83d2fd7dcea883ce4e66f34 SOURCES/tuned-2.8.0.tar.bz2
diff --git a/SOURCES/tuned-2.7.1-fixed-traceback.patch b/SOURCES/tuned-2.7.1-fixed-traceback.patch
deleted file mode 100644
index 6ab21da..0000000
--- a/SOURCES/tuned-2.7.1-fixed-traceback.patch
+++ /dev/null
@@ -1,31 +0,0 @@
-diff --git a/libexec/defirqaffinity.py b/libexec/defirqaffinity.py
-index 13768de..54d6499 100755
---- a/libexec/defirqaffinity.py
-+++ b/libexec/defirqaffinity.py
-@@ -59,7 +59,7 @@ def verify(shouldbemask):
- 		sys.exit(1)
- 
- 	# now verify each /proc/irq/$num/smp_affinity
--	interruptdirs = [ f for f in os.listdir(irqpath) if os.path.isdir(join(irqpath,f)) ]
-+	interruptdirs = [ f for f in os.listdir(irqpath) if os.path.isdir(os.path.join(irqpath,f)) ]
- 	# IRQ 2 - cascaded signals from IRQs 8-15 (any devices configured to use IRQ 2 will actually be using IRQ 9)
- 	interruptdirs.remove("2")
- 	# IRQ 0 - system timer (cannot be changed)
-@@ -73,7 +73,7 @@ def verify(shouldbemask):
- 			inplacemask = inplacemask | 1 << i;
- 		if (inplacemask & ~shouldbemask):
- 			sys.stderr.write("verify: failed: irqaffinity (%s) inplacemask=%x shouldbemask=%x\n" % (fname, inplacemask, shouldbemask))
--		sys.exit(1)
-+			sys.exit(1)
- 
- 	sys.exit(0)
- 
-@@ -105,7 +105,7 @@ fo.close()
- 
- # now adjust each /proc/irq/$num/smp_affinity
- 
--interruptdirs = [ f for f in os.listdir(irqpath) if os.path.isdir(join(irqpath,f)) ]
-+interruptdirs = [ f for f in os.listdir(irqpath) if os.path.isdir(os.path.join(irqpath,f)) ]
- 
- # IRQ 2 - cascaded signals from IRQs 8-15 (any devices configured to use IRQ 2 will actually be using IRQ 9)
- interruptdirs.remove("2")
diff --git a/SOURCES/tuned-2.7.1-gtk-3.8.patch b/SOURCES/tuned-2.7.1-gtk-3.8.patch
deleted file mode 100644
index 62b3dec..0000000
--- a/SOURCES/tuned-2.7.1-gtk-3.8.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-diff --git a/tuned-gui.glade b/tuned-gui.glade
-index 36e173a..30dd51a 100644
---- a/tuned-gui.glade
-+++ b/tuned-gui.glade
-@@ -1,7 +1,6 @@
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Generated with glade 3.16.1 -->
- <interface>
--  <requires lib="gtk+" version="3.10"/>
-   <object class="GtkAboutDialog" id="aboutdialog1">
-     <property name="can_focus">False</property>
-     <property name="type_hint">dialog</property>
-@@ -729,12 +728,6 @@
-                       <object class="GtkViewport" id="viewport1">
-                         <property name="visible">True</property>
-                         <property name="can_focus">False</property>
--                        <child>
--                          <object class="GtkListBox" id="listboxSummaryOfActiveProfile">
--                            <property name="visible">True</property>
--                            <property name="can_focus">False</property>
--                          </object>
--                        </child>
-                       </object>
-                       <packing>
-                         <property name="expand">False</property>
-diff --git a/tuned-gui.py b/tuned-gui.py
-index b169dec..2e76d0a 100755
---- a/tuned-gui.py
-+++ b/tuned-gui.py
-@@ -318,8 +318,6 @@ class Base(object):
- 		self.label_actual_profile.set_text(self.controller.active_profile())
- 		if self.config.get(consts.CFG_RECOMMEND_COMMAND):
- 			self.label_recommended_profile.set_text(self.controller.recommend_profile())
--		self.listbox_summary_of_active_profile = \
--			self.builder.get_object('listboxSummaryOfActiveProfile')
- 
- 		self.data_for_listbox_summary_of_active_profile()
- 		self.comboboxtext_fast_change_profile.set_model(self.treestore_profiles)
-@@ -444,9 +442,6 @@ class Base(object):
- 		This method is emited after change profile and on startup of app.
- 		"""
- 
--		for row in self.listbox_summary_of_active_profile:
--			self.listbox_summary_of_active_profile.remove(row)
--
- 		if self.is_tuned_connection_ok():
- 			self.active_profile = \
- 				self.manager.get_profile(self.controller.active_profile())
-@@ -462,51 +457,6 @@ class Base(object):
- 
- 			self.label_summary_included_profile.set_text('None')
- 
--		row = Gtk.ListBoxRow()
--		box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0)
--		plugin_name = Gtk.Label()
--		plugin_name.set_markup('<b>Plugin Name</b>')
--		plugin_option = Gtk.Label()
--		plugin_option.set_markup('<b>Plugin Options</b>')
--		box.pack_start(plugin_name, True, True, 0)
--		box.pack_start(plugin_option, True, True, 0)
--		row.add(box)
--
--		self.listbox_summary_of_active_profile.add(row)
--
--		sep = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)
--		self.listbox_summary_of_active_profile.add(sep)
--		sep.show()
--
--		for u in self.active_profile.units:
--			row = Gtk.ListBoxRow()
--			hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL,
--						   spacing=0)
--			hbox.set_homogeneous(True)
--			row.add(hbox)
--			label = Gtk.Label()
--			label.set_markup(u)
--			label.set_justify(Gtk.Justification.LEFT)
--			hbox.pack_start(label, False, True, 1)
--
--			grid = Gtk.Box(orientation=Gtk.Orientation.VERTICAL,
--						   spacing=0)
--			grid.set_homogeneous(True)
--			for o in self.active_profile.units[u].options:
--				label_option = Gtk.Label()
--				label_option.set_markup(o + ' = ' + '<b>'
--						+ self.active_profile.units[u].options[o]
--						+ '</b>')
--				grid.pack_start(label_option, False, True, 0)
--
--			hbox.pack_start(grid, False, True, 0)
--			self.listbox_summary_of_active_profile.add(row)
--			separator = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)
--			self.listbox_summary_of_active_profile.add(separator)
--			separator.show()
--
--		self.listbox_summary_of_active_profile.show_all()
--
- 	# def on_treeview_button_press_event(self, treeview, event):
- 	#	 popup = Gtk.Menu()
- 	#	 popup.append(Gtk.MenuItem('add'))
diff --git a/SOURCES/tuned-2.7.1-gui-daemon-restart-fix.patch b/SOURCES/tuned-2.7.1-gui-daemon-restart-fix.patch
deleted file mode 100644
index 2245e67..0000000
--- a/SOURCES/tuned-2.7.1-gui-daemon-restart-fix.patch
+++ /dev/null
@@ -1,13 +0,0 @@
-diff --git a/tuned-gui.py b/tuned-gui.py
-index 2e76d0a..29a0907 100755
---- a/tuned-gui.py
-+++ b/tuned-gui.py
-@@ -960,7 +960,7 @@ class Base(object):
- 		self._cmd.execute(['service', 'tuned', 'start'])
- 		time.sleep(10)
- 		self.controller = tuned.admin.DBusController(consts.DBUS_BUS,
--				consts.DBUS_OBJECT, consts.DBUS_INTERFACE)
-+				consts.DBUS_INTERFACE, consts.DBUS_OBJECT)
- 
- 
- if __name__ == '__main__':
diff --git a/SOURCES/tuned-2.7.1-non-existent-profile-timeout-fix.patch b/SOURCES/tuned-2.7.1-non-existent-profile-timeout-fix.patch
deleted file mode 100644
index b8f547b..0000000
--- a/SOURCES/tuned-2.7.1-non-existent-profile-timeout-fix.patch
+++ /dev/null
@@ -1,29 +0,0 @@
-From 8121ea9166d5f2828d97338811c5521c7a30489f Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Jaroslav=20=C5=A0karvada?= <jskarvad@redhat.com>
-Date: Tue, 23 Aug 2016 16:55:29 +0200
-Subject: tuned-adm: do not timeout if non-existent profile is requested
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
----
- tuned/admin/admin.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/tuned/admin/admin.py b/tuned/admin/admin.py
-index ddf6d9e..0c4caa5 100644
---- a/tuned/admin/admin.py
-+++ b/tuned/admin/admin.py
-@@ -186,7 +186,7 @@ class Admin(object):
- 			return False
- 		self._daemon_action_finished.clear()
- 		(ret, msg) = self._controller.switch_profile(profile_name)
--		if self._async:
-+		if self._async or not ret:
- 			return self._controller.exit(self._profile_print_status(ret, msg))
- 		else:
- 			self._timestamp = time.time()
--- 
-cgit v0.12
-
diff --git a/SOURCES/tuned-2.7.1-realtime-virtual-host-ktimersoftd.patch b/SOURCES/tuned-2.7.1-realtime-virtual-host-ktimersoftd.patch
deleted file mode 100644
index 96ceb5e..0000000
--- a/SOURCES/tuned-2.7.1-realtime-virtual-host-ktimersoftd.patch
+++ /dev/null
@@ -1,20 +0,0 @@
-diff --git a/profiles/realtime-virtual-host/tuned.conf b/profiles/realtime-virtual-host/tuned.conf
---- a/profiles/realtime-virtual-host/tuned.conf
-+++ b/profiles/realtime-virtual-host/tuned.conf
-@@ -38,10 +38,13 @@ assert=${f:assertion:isolated_cores contains present CPU(s):${isolated_cores_exp
- group.ksoftirqd=0:f:2:*:ksoftirqd.*
- 
- # for i in `pgrep rcuc` ; do grep Cpus_allowed_list /proc/$i/status ; done
--group.rcuc=0:f:3:*:rcuc.*
-+group.rcuc=0:f:4:*:rcuc.*
- 
- # for i in `pgrep rcub` ; do grep Cpus_allowed_list /proc/$i/status ; done
--group.rcub=0:f:3:*:rcub.*
-+group.rcub=0:f:4:*:rcub.*
-+
-+# for i in `pgrep ktimersoftd` ; do grep Cpus_allowed_list /proc/$i/status ; done
-+group.ktimersoftd=0:f:3:*:ktimersoftd.*
- 
- [script]
- script=script.sh
-
diff --git a/SOURCES/tuned-2.8.0-gtk-3.8.patch b/SOURCES/tuned-2.8.0-gtk-3.8.patch
new file mode 100644
index 0000000..cf54324
--- /dev/null
+++ b/SOURCES/tuned-2.8.0-gtk-3.8.patch
@@ -0,0 +1,100 @@
+diff --git a/tuned-gui.glade b/tuned-gui.glade
+index 36e173a..30dd51a 100644
+--- a/tuned-gui.glade
++++ b/tuned-gui.glade
+@@ -1,7 +1,6 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!-- Generated with glade 3.16.1 -->
+ <interface>
+-  <requires lib="gtk+" version="3.10"/>
+   <object class="GtkAboutDialog" id="aboutdialog1">
+     <property name="can_focus">False</property>
+     <property name="type_hint">dialog</property>
+@@ -729,12 +728,6 @@
+                       <object class="GtkViewport" id="viewport1">
+                         <property name="visible">True</property>
+                         <property name="can_focus">False</property>
+-                        <child>
+-                          <object class="GtkListBox" id="listboxSummaryOfActiveProfile">
+-                            <property name="visible">True</property>
+-                            <property name="can_focus">False</property>
+-                          </object>
+-                        </child>
+                       </object>
+                       <packing>
+                         <property name="expand">False</property>
+diff --git a/tuned-gui.py b/tuned-gui.py
+index e9c4628..a0514c1 100755
+--- a/tuned-gui.py
++++ b/tuned-gui.py
+@@ -319,8 +319,6 @@ class Base(object):
+ 		self.label_actual_profile.set_text(self.controller.active_profile())
+ 		if self.config.get(consts.CFG_RECOMMEND_COMMAND):
+ 			self.label_recommended_profile.set_text(self.controller.recommend_profile())
+-		self.listbox_summary_of_active_profile = \
+-			self.builder.get_object('listboxSummaryOfActiveProfile')
+ 
+ 		self.data_for_listbox_summary_of_active_profile()
+ 		self.comboboxtext_fast_change_profile.set_model(self.treestore_profiles)
+@@ -445,9 +443,6 @@ class Base(object):
+ 		This method is emited after change profile and on startup of app.
+ 		"""
+ 
+-		for row in self.listbox_summary_of_active_profile:
+-			self.listbox_summary_of_active_profile.remove(row)
+-
+ 		if self.is_tuned_connection_ok():
+ 			self.active_profile = \
+ 				self.manager.get_profile(self.controller.active_profile())
+@@ -463,51 +458,6 @@ class Base(object):
+ 
+ 			self.label_summary_included_profile.set_text('None')
+ 
+-		row = Gtk.ListBoxRow()
+-		box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=0)
+-		plugin_name = Gtk.Label()
+-		plugin_name.set_markup('<b>Plugin Name</b>')
+-		plugin_option = Gtk.Label()
+-		plugin_option.set_markup('<b>Plugin Options</b>')
+-		box.pack_start(plugin_name, True, True, 0)
+-		box.pack_start(plugin_option, True, True, 0)
+-		row.add(box)
+-
+-		self.listbox_summary_of_active_profile.add(row)
+-
+-		sep = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)
+-		self.listbox_summary_of_active_profile.add(sep)
+-		sep.show()
+-
+-		for u in self.active_profile.units:
+-			row = Gtk.ListBoxRow()
+-			hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL,
+-						   spacing=0)
+-			hbox.set_homogeneous(True)
+-			row.add(hbox)
+-			label = Gtk.Label()
+-			label.set_markup(u)
+-			label.set_justify(Gtk.Justification.LEFT)
+-			hbox.pack_start(label, False, True, 1)
+-
+-			grid = Gtk.Box(orientation=Gtk.Orientation.VERTICAL,
+-						   spacing=0)
+-			grid.set_homogeneous(True)
+-			for o in self.active_profile.units[u].options:
+-				label_option = Gtk.Label()
+-				label_option.set_markup(o + ' = ' + '<b>'
+-						+ self.active_profile.units[u].options[o]
+-						+ '</b>')
+-				grid.pack_start(label_option, False, True, 0)
+-
+-			hbox.pack_start(grid, False, True, 0)
+-			self.listbox_summary_of_active_profile.add(row)
+-			separator = Gtk.Separator.new(Gtk.Orientation.HORIZONTAL)
+-			self.listbox_summary_of_active_profile.add(separator)
+-			separator.show()
+-
+-		self.listbox_summary_of_active_profile.show_all()
+-
+ 	# def on_treeview_button_press_event(self, treeview, event):
+ 	#	 popup = Gtk.Menu()
+ 	#	 popup.append(Gtk.MenuItem('add'))
diff --git a/SOURCES/tuned-2.8.0-realtime-priorities-update.patch b/SOURCES/tuned-2.8.0-realtime-priorities-update.patch
new file mode 100644
index 0000000..bc75e39
--- /dev/null
+++ b/SOURCES/tuned-2.8.0-realtime-priorities-update.patch
@@ -0,0 +1,65 @@
+From 1ab378cc4a4372ca031bb765f656ab463b28af88 Mon Sep 17 00:00:00 2001
+From: Luiz Capitulino <lcapitulino@redhat.com>
+Date: Fri, 19 May 2017 15:10:19 -0400
+Subject: [PATCH] realtime-virtual-guest: re-assign kernel thread priorities
+
+From 63e5ebfe0c71c5e6d0613c4d8327b2a6f3fba7ba Mon Sep 17 00:00:00 2001
+From: Luiz Capitulino <lcapitulino@redhat.com>
+Date: Fri, 19 May 2017 14:42:06 -0400
+Subject:
+
+The realtime guest profile uses the RT kernel default priority
+assignment for the ksoftird, rcuc, and ktimersoftd kernel threads,
+which is:
+
+    17  FF   2  [rcuc/1] *
+    19  FF   1  [ktimersoftd/1] *
+    20  TS   -  [ksoftirqd/1] *
+
+This doesn't allow running a PMD thread with fifo:1 in the
+guest, since this will starve ktimersoftd and ksoftirqd if
+those threads ever become runnable.
+
+The solution is to use the same priority assigment we use
+in the host where we've been running PMD threads with
+fifo:1 priorities without problems. This assignment is:
+
+   151  FF   4  [rcuc/15] *
+   153  FF   3  [ktimersoftd/15] *
+   154  FF   2  [ksoftirqd/15] *
+
+This patch just copies the [scheduler] section from the
+host profile.
+
+Resolves: rhbz#1452357
+
+Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
+---
+ profiles/realtime-virtual-guest/tuned.conf | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/profiles/realtime-virtual-guest/tuned.conf b/profiles/realtime-virtual-guest/tuned.conf
+index 71085a8..0992fbd 100644
+--- a/profiles/realtime-virtual-guest/tuned.conf
++++ b/profiles/realtime-virtual-guest/tuned.conf
+@@ -20,6 +20,20 @@ isolated_cores_present_expanded=${f:cpulist_present:${isolated_cores}}
+ # Fail if isolated_cores contains CPUs which are not present
+ assert2=${f:assertion:isolated_cores contains present CPU(s):${isolated_cores_expanded}:${isolated_cores_present_expanded}}
+ 
++[scheduler]
++# group.group_name=rule_priority:scheduler_policy:scheduler_priority:core_affinity_in_hex:process_name_regex
++# for i in `pgrep ksoftirqd` ; do grep Cpus_allowed_list /proc/$i/status ; done
++group.ksoftirqd=0:f:2:*:ksoftirqd.*
++
++# for i in `pgrep rcuc` ; do grep Cpus_allowed_list /proc/$i/status ; done
++group.rcuc=0:f:4:*:rcuc.*
++
++# for i in `pgrep rcub` ; do grep Cpus_allowed_list /proc/$i/status ; done
++group.rcub=0:f:4:*:rcub.*
++
++# for i in `pgrep ktimersoftd` ; do grep Cpus_allowed_list /proc/$i/status ; done
++group.ktimersoftd=0:f:3:*:ktimersoftd.*
++
+ [script]
+ script=${i:PROFILE_DIR}/script.sh
+ 
diff --git a/SOURCES/tuned-2.8.0-realtime-skew-tick-and-inheritance.patch b/SOURCES/tuned-2.8.0-realtime-skew-tick-and-inheritance.patch
new file mode 100644
index 0000000..58706f8
--- /dev/null
+++ b/SOURCES/tuned-2.8.0-realtime-skew-tick-and-inheritance.patch
@@ -0,0 +1,37 @@
+diff --git a/profiles/realtime-virtual-guest/tuned.conf b/profiles/realtime-virtual-guest/tuned.conf
+index 04d7b5f..71085a8 100644
+--- a/profiles/realtime-virtual-guest/tuned.conf
++++ b/profiles/realtime-virtual-guest/tuned.conf
+@@ -24,4 +24,4 @@ assert2=${f:assertion:isolated_cores contains present CPU(s):${isolated_cores_ex
+ script=${i:PROFILE_DIR}/script.sh
+ 
+ [bootloader]
+-cmdline=isolcpus=${isolated_cores} nohz=on nohz_full=${isolated_cores} rcu_nocbs=${isolated_cores} intel_pstate=disable nosoftlockup
++cmdline_rvg+=nohz=on nohz_full=${isolated_cores} rcu_nocbs=${isolated_cores}
+diff --git a/profiles/realtime-virtual-host/tuned.conf b/profiles/realtime-virtual-host/tuned.conf
+index e01a99c..d7404d0 100644
+--- a/profiles/realtime-virtual-host/tuned.conf
++++ b/profiles/realtime-virtual-host/tuned.conf
+@@ -55,4 +55,4 @@ group.ktimersoftd=0:f:3:*:ktimersoftd.*
+ script=${i:PROFILE_DIR}/script.sh
+ 
+ [bootloader]
+-cmdline=isolcpus=${isolated_cores} nohz=on nohz_full=${isolated_cores} rcu_nocbs=${isolated_cores} intel_pstate=disable nosoftlockup
++cmdline_rvh+=nohz=on nohz_full=${isolated_cores} rcu_nocbs=${isolated_cores}
+diff --git a/profiles/realtime/tuned.conf b/profiles/realtime/tuned.conf
+index f152237..9794cd6 100644
+--- a/profiles/realtime/tuned.conf
++++ b/profiles/realtime/tuned.conf
+@@ -36,11 +36,7 @@ kernel.timer_migration = 0
+ /sys/devices/system/machinecheck/machinecheck*/ignore_ce = 1
+ 
+ [bootloader]
+-# lscpu | grep ^NUMA
+-# NUMA node0 CPU(s):     0,2,4,6,8,10,12,14,16,18,20,22
+-# NUMA node1 CPU(s):     1,3,5,7,9,11,13,15,17,19,21,23
+-
+-cmdline=isolcpus=${isolated_cores} intel_pstate=disable nosoftlockup
++cmdline=isolcpus=${isolated_cores} intel_pstate=disable nosoftlockup skew_tick=1
+ 
+ [script]
+ script = ${i:PROFILE_DIR}/script.sh
diff --git a/SOURCES/tuned-2.8.0-workaround-for-old-pyudev.patch b/SOURCES/tuned-2.8.0-workaround-for-old-pyudev.patch
new file mode 100644
index 0000000..eebcc1c
--- /dev/null
+++ b/SOURCES/tuned-2.8.0-workaround-for-old-pyudev.patch
@@ -0,0 +1,37 @@
+From 8af58432afeec89467699b36d5e3d9fcc2120cc9 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Jaroslav=20=C5=A0karvada?= <jskarvad@redhat.com>
+Date: Fri, 5 May 2017 13:51:05 +0200
+Subject: [PATCH] inventory: added workaround for pyudev < 0.18
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+This is needed for e.g. RHEL-7.4.
+
+Related: rhbz#1251240
+
+Signed-off-by: Jaroslav Škarvada <jskarvad@redhat.com>
+---
+ tuned/hardware/inventory.py | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/tuned/hardware/inventory.py b/tuned/hardware/inventory.py
+index 7a24348..8c5117d 100644
+--- a/tuned/hardware/inventory.py
++++ b/tuned/hardware/inventory.py
+@@ -30,7 +30,11 @@ class Inventory(object):
+ 
+ 	def get_device(self, subsystem, sys_name):
+ 		"""Get a pyudev.Device object for the sys_name (e.g. 'sda')."""
+-		return pyudev.Devices.from_name(self._udev_context, subsystem, sys_name)
++		try:
++			return pyudev.Devices.from_name(self._udev_context, subsystem, sys_name)
++		# workaround for pyudev < 0.18
++		except AttributeError:
++			return pyudev.Device.from_name(self._udev_context, subsystem, sys_name)
+ 
+ 	def get_devices(self, subsystem):
+ 		"""Get list of devices on a given subsystem."""
+-- 
+2.9.3
+
diff --git a/SPECS/tuned.spec b/SPECS/tuned.spec
index 4eec0d0..db2e543 100644
--- a/SPECS/tuned.spec
+++ b/SPECS/tuned.spec
@@ -1,10 +1,10 @@
 Summary: A dynamic adaptive system tuning daemon
 Name: tuned
-Version: 2.7.1
-Release: 3%{?dist}.2
+Version: 2.8.0
+Release: 5%{?dist}
 License: GPLv2+
-Source: https://fedorahosted.org/releases/t/u/tuned/tuned-%{version}.tar.bz2
-URL: https://fedorahosted.org/tuned/
+Source: https://jskarvad.fedorapeople.org/tuned/download/tuned-%{version}.tar.bz2
+URL: http://www.tuned-project.org/
 BuildArch: noarch
 BuildRequires: python, systemd, desktop-file-utils
 Requires(post): systemd, virt-what
@@ -14,11 +14,11 @@ Requires: python-decorator, dbus-python, pygobject3-base, python-pyudev
 # kernel-tools, hdparm dependencies are not met on s390
 Requires: virt-what, python-configobj, ethtool, gawk
 Requires: util-linux, python-perf, dbus, polkit
-Patch0: tuned-2.7.1-gtk-3.8.patch
-Patch1: tuned-2.7.1-gui-daemon-restart-fix.patch
-Patch2: tuned-2.7.1-fixed-traceback.patch
-Patch3: tuned-2.7.1-non-existent-profile-timeout-fix.patch
-Patch4: tuned-2.7.1-realtime-virtual-host-ktimersoftd.patch
+Requires: python-linux-procfs, python-schedutils
+Patch0: tuned-2.8.0-gtk-3.8.patch
+Patch1: tuned-2.8.0-workaround-for-old-pyudev.patch
+Patch2: tuned-2.8.0-realtime-skew-tick-and-inheritance.patch
+Patch3: tuned-2.8.0-realtime-priorities-update.patch
 
 %description
 The tuned package contains a daemon that tunes system settings dynamically.
@@ -66,52 +66,79 @@ instead of fewer large ones).
 
 %package profiles-sap
 Summary: Additional tuned profile(s) targeted to SAP NetWeaver loads
-Requires: %{name} = %{version}-%{release}
+Requires: %{name} = %{version}
 
 %description profiles-sap
 Additional tuned profile(s) targeted to SAP NetWeaver loads.
 
 %package profiles-oracle
 Summary: Additional tuned profile(s) targeted to Oracle loads
-Requires: %{name} = %{version}-%{release}
+Requires: %{name} = %{version}
 
 %description profiles-oracle
 Additional tuned profile(s) targeted to Oracle loads.
 
 %package profiles-sap-hana
 Summary: Additional tuned profile(s) targeted to SAP HANA loads
-Requires: %{name} = %{version}-%{release}
+Requires: %{name} = %{version}
 
 %description profiles-sap-hana
 Additional tuned profile(s) targeted to SAP HANA loads.
 
 %package profiles-atomic
 Summary: Additional tuned profile(s) targeted to Atomic
-Requires: %{name} = %{version}-%{release}
+Requires: %{name} = %{version}
 
 %description profiles-atomic
 Additional tuned profile(s) targeted to Atomic host and guest.
 
 %package profiles-realtime
 Summary: Additional tuned profile(s) targeted to realtime
-Requires: %{name} = %{version}-%{release}
+Requires: %{name} = %{version}
 Requires: tuna
 
 %description profiles-realtime
 Additional tuned profile(s) targeted to realtime.
 
+%package profiles-nfv-guest
+Summary: Additional tuned profile(s) targeted to Network Function Virtualization (NFV) guest
+Requires: %{name} = %{version}
+Requires: %{name}-profiles-realtime = %{version}
+Requires: tuna
+
+%description profiles-nfv-guest
+Additional tuned profile(s) targeted to Network Function Virtualization (NFV) guest.
+
+%package profiles-nfv-host
+Summary: Additional tuned profile(s) targeted to Network Function Virtualization (NFV) host
+Requires: %{name} = %{version}
+Requires: %{name}-profiles-realtime = %{version}
+Requires: tuna, qemu-kvm-tools-rhev
+
+%description profiles-nfv-host
+Additional tuned profile(s) targeted to Network Function Virtualization (NFV) host.
+
+# this is kept for backward compatibility, it should be dropped for RHEL-8
 %package profiles-nfv
 Summary: Additional tuned profile(s) targeted to Network Function Virtualization (NFV)
-Requires: %{name} = %{version}-%{release}
-Requires: %{name}-profiles-realtime = %{version}-%{release}
-Requires: tuna, qemu-kvm-tools-rhev
+Requires: %{name} = %{version}
+Requires: %{name}-profiles-nfv-guest = %{version}
+Requires: %{name}-profiles-nfv-host = %{version}
 
 %description profiles-nfv
 Additional tuned profile(s) targeted to Network Function Virtualization (NFV).
 
+%package profiles-cpu-partitioning
+Summary: Additional tuned profile(s) optimized for CPU partitioning
+Requires: %{name} = %{version}
+Requires: tuna
+
+%description profiles-cpu-partitioning
+Additional tuned profile(s) optimized for CPU partitioning.
+
 %package profiles-compat
 Summary: Additional tuned profiles mainly for backward compatibility with tuned 1.0
-Requires: %{name} = %{version}-%{release}
+Requires: %{name} = %{version}
 
 %description profiles-compat
 Additional tuned profiles mainly for backward compatibility with tuned 1.0.
@@ -123,7 +150,6 @@ It can be also used to fine tune your system for specific scenarios.
 %patch1 -p1
 %patch2 -p1
 %patch3 -p1
-%patch4 -p1
 
 %build
 
@@ -140,6 +166,9 @@ mkdir -p %{buildroot}%{_datadir}/tuned/grub2
 mv %{buildroot}%{_sysconfdir}/grub.d/00_tuned %{buildroot}%{_datadir}/tuned/grub2/00_tuned
 rmdir %{buildroot}%{_sysconfdir}/grub.d
 
+# ghost for persistent storage
+mkdir -p %{buildroot}%{_var}/lib/tuned
+
 # ghost for NFV
 mkdir -p %{buildroot}%{_sysconfdir}/modprobe.d
 touch %{buildroot}%{_sysconfdir}/modprobe.d/kvm.rt.tuned.conf
@@ -162,6 +191,10 @@ fi
 
 %preun
 %systemd_preun tuned.service
+if [ "$1" == 0 ]; then
+# clear persistent storage
+  rm -f %{_var}/lib/tuned/*
+fi
 
 
 %postun
@@ -189,7 +222,8 @@ fi
 # and tuned is noarch package, thus the following hack is needed
 if [ -d %{_sysconfdir}/grub.d ]; then
   cp -a %{_datadir}/tuned/grub2/00_tuned %{_sysconfdir}/grub.d/00_tuned
-  selinuxenabled && restorecon %{_sysconfdir}/grub.d/00_tuned || :
+  selinuxenabled &>/dev/null && \
+    restorecon %{_sysconfdir}/grub.d/00_tuned &>/dev/null || :
 fi
 
 
@@ -212,6 +246,7 @@ fi
 %defattr(-,root,root,-)
 %exclude %{docdir}/README.utils
 %exclude %{docdir}/README.scomes
+%exclude %{docdir}/README.NFV
 %doc %{docdir}
 %{_datadir}/bash-completion/completions/tuned-adm
 %exclude %{python_sitelib}/tuned/gtk
@@ -219,6 +254,9 @@ fi
 %{_sbindir}/tuned
 %{_sbindir}/tuned-adm
 %exclude %{_sysconfdir}/tuned/realtime-variables.conf
+%exclude %{_sysconfdir}/tuned/realtime-virtual-guest-variables.conf
+%exclude %{_sysconfdir}/tuned/realtime-virtual-host-variables.conf
+%exclude %{_sysconfdir}/tuned/cpu-partitioning-variables.conf
 %exclude %{_prefix}/lib/tuned/default
 %exclude %{_prefix}/lib/tuned/desktop-powersave
 %exclude %{_prefix}/lib/tuned/laptop-ac-powersave
@@ -235,9 +273,11 @@ fi
 %exclude %{_prefix}/lib/tuned/realtime
 %exclude %{_prefix}/lib/tuned/realtime-virtual-guest
 %exclude %{_prefix}/lib/tuned/realtime-virtual-host
+%exclude %{_prefix}/lib/tuned/cpu-partitioning
 %{_prefix}/lib/tuned
 %dir %{_sysconfdir}/tuned
 %dir %{_libexecdir}/tuned
+%{_libexecdir}/tuned/defirqaffinity*
 %config(noreplace) %verify(not size mtime md5) %{_sysconfdir}/tuned/active_profile
 %config(noreplace) %{_sysconfdir}/tuned/tuned-main.conf
 %config(noreplace) %verify(not size mtime md5) %{_sysconfdir}/tuned/bootcmdline
@@ -247,12 +287,14 @@ fi
 %{_unitdir}/tuned.service
 %dir %{_localstatedir}/log/tuned
 %dir /run/tuned
+%dir %{_var}/lib/tuned
 %{_mandir}/man5/tuned*
 %{_mandir}/man7/tuned-profiles.7*
 %{_mandir}/man8/tuned*
 %dir %{_datadir}/tuned
 %{_datadir}/tuned/grub2
 %{_datadir}/polkit-1/actions/com.redhat.tuned.policy
+%ghost %{_sysconfdir}/modprobe.d/kvm.rt.tuned.conf
 
 %files gtk
 %defattr(-,root,root,-)
@@ -310,15 +352,27 @@ fi
 %{_prefix}/lib/tuned/realtime
 %{_mandir}/man7/tuned-profiles-realtime.7*
 
-%files profiles-nfv
+%files profiles-nfv-guest
 %defattr(-,root,root,-)
 %config(noreplace) %{_sysconfdir}/tuned/realtime-virtual-guest-variables.conf
-%config(noreplace) %{_sysconfdir}/tuned/realtime-virtual-host-variables.conf
-%ghost %{_sysconfdir}/modprobe.d/kvm.rt.tuned.conf
 %{_prefix}/lib/tuned/realtime-virtual-guest
+%{_mandir}/man7/tuned-profiles-nfv-guest.7*
+
+%files profiles-nfv-host
+%defattr(-,root,root,-)
+%config(noreplace) %{_sysconfdir}/tuned/realtime-virtual-host-variables.conf
 %{_prefix}/lib/tuned/realtime-virtual-host
-%{_libexecdir}/tuned/defirqaffinity*
-%{_mandir}/man7/tuned-profiles-nfv.7*
+%{_mandir}/man7/tuned-profiles-nfv-host.7*
+
+%files profiles-nfv
+%defattr(-,root,root,-)
+%doc %{docdir}/README.NFV
+
+%files profiles-cpu-partitioning
+%defattr(-,root,root,-)
+%config(noreplace) %{_sysconfdir}/tuned/cpu-partitioning-variables.conf
+%{_prefix}/lib/tuned/cpu-partitioning
+%{_mandir}/man7/tuned-profiles-cpu-partitioning.7*
 
 %files profiles-compat
 %defattr(-,root,root,-)
@@ -332,13 +386,85 @@ fi
 %{_mandir}/man7/tuned-profiles-compat.7*
 
 %changelog
-* Mon Apr 10 2017 Jaroslav Škarvada <jskarvad@redhat.com> - 2.7.1-3.2
-- realtime-virtual-host: accommodate new ktimersoftd thread
-  resolves: rhbz#1440663
-
-* Tue Nov  8 2016 Jaroslav Škarvada <jskarvad@redhat.com> - 2.7.1-3.1
+* Mon Jun 12 2017 Jaroslav Škarvada <jskarvad@redhat.com> - 2.8.0-5
+- realtime: re-assigned kernel thread priorities
+  resolves: rhbz#1452357
+
+* Tue Jun  6 2017 Jaroslav Škarvada <jskarvad@redhat.com> - 2.8.0-4
+- added skew_tick=1 to realtime and simplified bootcmdline inheritance
+  resolves: rhbz#1447938
+
+* Fri May  5 2017 Jaroslav Škarvada <jskarvad@redhat.com> - 2.8.0-3
+- added workaround for old pyudev
+  related: rhbz#1251240
+
+* Thu Apr 13 2017 Jaroslav Škarvada <jskarvad@redhat.com> - 2.8.0-2
+- respin
+  related: rhbz#1388454
+- systemd: added support for older systemd CPUAffinity syntax
+  resolves: rhbz#1441791
+- scheduler: added workarounds for low level exceptions from
+  python-linux-procfs
+  resolves: rhbz#1441792
+- bootloader: workaround for adding tuned_initrd to new kernels on restart
+  resolves: rhbz#1441797
+- cpu-partitioning: use tuna for cores isolation
+  related: rhbz#1403309
+
+* Fri Apr  7 2017 Jaroslav Škarvada <jskarvad@redhat.com> - 2.8.0-1
+- new release
+  - rebase tuned to latest upstream
+    resolves: rhbz#1388454
+  - cpu-partitioning: enabled timer migration
+    resolves: rhbz#1408308
+  - cpu-partitioning: disabled kvmclock sync and ple
+    resolves: rhbz#1395855
+  - spec: muted error if there is no selinux support
+    resolves: rhbz#1404214
+  - units: implemented instance priority
+    resolves: rhbz#1246172
+  - bootloader: added support for initrd overlays
+    resolves: rhbz#1414098
+  - cpu-partitioning: set CPUAffinity early in initrd image
+    resolves: rhbz#1394965
+  - cpu-partitioning: set workqueue affinity early
+    resolves: rhbz#1395899
+  - scsi_host: fixed probing of ALPM, missing ALPM logged as info
+    resolves: rhbz#1416712
+  - added new profile cpu-partitioning
+    resolves: rhbz#1359956
+  - bootloader: improved inheritance
+    resolves: rhbz#1274464
+  - units: mplemented udev-based regexp device matching
+    resolves: rhbz#1251240
+  - units: introduced pre_script, post_script
+    resolves: rhbz#1246176
+  - realtime-virtual-host: accommodate new ktimersoftd thread
+    resolves: rhbz#1332563
+  - defirqaffinity: fixed traceback due to syntax error
+    resolves: rhbz#1369791
+  - variables: support inheritance of variables
+    resolves: rhbz#1433496
+  - scheduler: added support for cores isolation
+    resolves: rhbz#1403309
+  - tuned-profiles-nfv splitted to host/guest and dropped unneeded dependency
+    resolves: rhbz#1413111
+  - desktop: fixed typo in profile summary
+    resolves: rhbz#1421238
+  - with systemd don't do full rollback on shutdown / reboot
+    resolves: rhbz#1421286
+  - builtin functions: added virt_check function and support to include
+    resolves: rhbz#1426654
+  - cpulist_present: explicitly sorted present CPUs
+    resolves: rhbz#1432240
+  - plugin_scheduler: fixed initialization
+    resolves: rhbz#1433496
+  - log errors when applying a profile fails
+    resolves: rhbz#1434360
+
+* Tue Nov  8 2016 Jaroslav Škarvada <jskarvad@redhat.com> - 2.7.1-4
 - Fixed timeout if non-existent profile is requested
-  resolves: rhbz#1392942
+  resolves: rhbz#1369502
 
 * Mon Sep 12 2016 Ondřej Lysoněk <olysonek@redhat.com> - 2.7.1-3
 - Fixed a traceback