diff --git a/.gitignore b/.gitignore
index 9735bee..8f9b96c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1 @@
-SOURCES/tuned-2.15.0.tar.gz
+SOURCES/tuned-2.16.0.tar.gz
diff --git a/.tuned.metadata b/.tuned.metadata
index f880b6a..2d7f88a 100644
--- a/.tuned.metadata
+++ b/.tuned.metadata
@@ -1 +1 @@
-bfb3def0b687bbdae2b3e191d2fda46b3ffca1c0 SOURCES/tuned-2.15.0.tar.gz
+e20fcfb734f869fb175cb88dc7ef6e5eb3cd5946 SOURCES/tuned-2.16.0.tar.gz
diff --git a/SOURCES/tuned-2.16.0-rhel-8-profiles.patch b/SOURCES/tuned-2.16.0-rhel-8-profiles.patch
new file mode 100644
index 0000000..e357432
--- /dev/null
+++ b/SOURCES/tuned-2.16.0-rhel-8-profiles.patch
@@ -0,0 +1,83 @@
+diff --git a/profiles/latency-performance/tuned.conf b/profiles/latency-performance/tuned.conf
+index da1e357..66f06ae 100644
+--- a/profiles/latency-performance/tuned.conf
++++ b/profiles/latency-performance/tuned.conf
+@@ -32,3 +32,16 @@ vm.dirty_background_ratio=3
+ # 100 tells the kernel to aggressively swap processes out of physical memory
+ # and move them to swap cache
+ vm.swappiness=10
++
++[scheduler]
++# ktune sysctl settings for rhel6 servers, maximizing i/o throughput
++#
++# Minimal preemption granularity for CPU-bound tasks:
++# (default: 1 msec#  (1 + ilog(ncpus)), units: nanoseconds)
++sched_min_granularity_ns = 3000000
++sched_wakeup_granularity_ns = 4000000
++
++# The total time the scheduler will consider a migrated process
++# "cache hot" and thus less likely to be re-migrated
++# (system default is 500000, i.e. 0.5 ms)
++sched_migration_cost_ns = 5000000
+diff --git a/profiles/sap-hana/tuned.conf b/profiles/sap-hana/tuned.conf
+index 81d5930..c91a9ee 100644
+--- a/profiles/sap-hana/tuned.conf
++++ b/profiles/sap-hana/tuned.conf
+@@ -20,3 +20,7 @@ kernel.numa_balancing = 0
+ vm.dirty_ratio = 40
+ vm.dirty_background_ratio = 10
+ vm.swappiness = 10
++
++[scheduler]
++sched_min_granularity_ns = 3000000
++sched_wakeup_granularity_ns = 4000000
+diff --git a/profiles/throughput-performance/tuned.conf b/profiles/throughput-performance/tuned.conf
+index 98c6b26..ebb3f7d 100644
+--- a/profiles/throughput-performance/tuned.conf
++++ b/profiles/throughput-performance/tuned.conf
+@@ -58,9 +58,31 @@ vm.dirty_background_ratio = 10
+ # and move them to swap cache
+ vm.swappiness=10
+ 
++[scheduler]
++# ktune sysctl settings for rhel6 servers, maximizing i/o throughput
++#
++# Minimal preemption granularity for CPU-bound tasks:
++# (default: 1 msec#  (1 + ilog(ncpus)), units: nanoseconds)
++sched_min_granularity_ns = 10000000
++
++# SCHED_OTHER wake-up granularity.
++# (default: 1 msec#  (1 + ilog(ncpus)), units: nanoseconds)
++#
++# This option delays the preemption effects of decoupled workloads
++# and reduces their over-scheduling. Synchronous workloads will still
++# have immediate wakeup/sleep latencies.
++sched_wakeup_granularity_ns = 15000000
++
+ # Marvell ThunderX
+ [sysctl.thunderx]
+ type=sysctl
+ uname_regex=aarch64
+ cpuinfo_regex=${thunderx_cpuinfo_regex}
+ kernel.numa_balancing=0
++
++# AMD
++[scheduler.amd]
++type=scheduler
++uname_regex=x86_64
++cpuinfo_regex=${amd_cpuinfo_regex}
++sched_migration_cost_ns=5000000
+diff --git a/profiles/virtual-host/tuned.conf b/profiles/virtual-host/tuned.conf
+index c1942da..3358105 100644
+--- a/profiles/virtual-host/tuned.conf
++++ b/profiles/virtual-host/tuned.conf
+@@ -14,3 +14,9 @@ vm.dirty_background_ratio = 5
+ [cpu]
+ # Setting C3 state sleep mode/power savings
+ force_latency=cstate.id:3|70
++
++[scheduler]
++# The total time the scheduler will consider a migrated process
++# "cache hot" and thus less likely to be re-migrated
++# (system default is 500000, i.e. 0.5 ms)
++sched_migration_cost_ns = 5000000
diff --git a/SPECS/tuned.spec b/SPECS/tuned.spec
index 7dbef38..df515ab 100644
--- a/SPECS/tuned.spec
+++ b/SPECS/tuned.spec
@@ -33,7 +33,7 @@
 
 Summary: A dynamic adaptive system tuning daemon
 Name: tuned
-Version: 2.15.0
+Version: 2.16.0
 Release: 1%{?prerel1}%{?dist}
 License: GPLv2+
 Source0: https://github.com/redhat-performance/%{name}/archive/v%{version}%{?prerel2}/%{name}-%{version}%{?prerel2}.tar.gz
@@ -45,12 +45,13 @@ BuildRequires: systemd, desktop-file-utils
 Requires(post): systemd, virt-what
 Requires(preun): systemd
 Requires(postun): systemd
+BuildRequires: make
 BuildRequires: %{_py}, %{_py}-devel
 # BuildRequires for 'make test'
 BuildRequires: %{_py}-unittest2, %{_py}-configobj, %{_py}-mock
-BuildRequires: %{_py}-decorator, %{_py}-pyudev
-Requires: %{_py}-decorator, %{_py}-pyudev, %{_py}-configobj
-Requires: %{_py}-schedutils, %{_py}-linux-procfs, %{_py}-perf
+BuildRequires: %{_py}-pyudev
+Requires: %{_py}-pyudev, %{_py}-configobj
+Requires: %{_py}-linux-procfs, %{_py}-perf
 # requires for packages with inconsistent python2/3 names
 %if %{with python3}
 # BuildRequires for 'make test'
@@ -72,9 +73,16 @@ Recommends: hdparm
 Recommends: kernel-tools
 Recommends: kmod
 %endif
+# syspurpose
+%if 0%{?rhel} > 8
+Requires: subscription-manager
+%else
 %if 0%{?rhel} > 7
 Requires: python3-syspurpose
 %endif
+%endif
+# Revert upstream profiles changes which have not been approved for RHEL-8 (yet)
+Patch0: tuned-2.16.0-rhel-8-profiles.patch
 
 %description
 The tuned package contains a daemon that tunes system settings dynamically.
@@ -229,6 +237,7 @@ Additional tuned profile(s) targeted to PostgreSQL server loads.
 
 %prep
 %setup -q -n %{name}-%{version}%{?prerel2}
+%patch0 -p1
 
 # Replace the upstream recommend.conf with a RHEL-8-specific one
 rm -f recommend.conf
@@ -510,6 +519,48 @@ fi
 %{_mandir}/man7/tuned-profiles-postgresql.7*
 
 %changelog
+* Wed Jul 21 2021 Jaroslav Škarvada <jskarvad@redhat.com> - 2.16.0-1
+- new release
+  - rebased tuned to latest upstream
+    related: rhbz#1936426
+
+* Wed Jul  7 2021 Jaroslav Škarvada <jskarvad@redhat.com> - 2.16.0-0.1.rc1
+- new release
+  - rebased tuned to latest upstream
+    resolves: rhbz#1936426
+  - realtime: "isolate_managed_irq=Y" should be mentioned in
+    "/etc/tuned/realtime-virtual-*-variables.conf"
+    resolves: rhbz#1817827
+  - realtime: changed tuned default to "isolcpus=domain,managed_irq,X-Y"
+    resolves: rhbz#1820626
+  - applying a profile with multiple inheritance where parents include a common
+    ancestor fails
+    resolves: rhbz#1825882
+  - failure in moving i40e IRQ threads to housekeeping CPUs from isolated CPUs
+    resolves: rhbz#1933069
+  - sort network devices before matching by regex
+    resolves: rhbz#1939970
+  - net: fixed traceback while adjusting the netdev queue count
+    resolves: rhbz#1943291
+  - net: fixed traceback if the first listed device returns netlink error
+    resolves: rhbz#1944686
+  - realtime: improve verification
+    resolves: rhbz#1947858
+  - bootloader: add support for the rpm-ostree
+    resolves: rhbz#1950164
+  - net: fixed traceback if a device channel contains n/a
+    resolves: rhbz#1974071
+  - mssql: updated the profile
+    resolves: rhbz#1942733
+
+* Wed Apr 21 2021 Jaroslav Škarvada <jskarvad@redhat.com> - 2.15.0-3
+- updated mssql profile
+  resolves: rhbz#1942733
+
+* Fri Feb 19 2021 Jaroslav Škarvada <jskarvad@redhat.com> - 2.15.0-2
+- realtime: added support for netdev_queue_count and extended plugin_net
+  resolves: rhbz#1951992
+
 * Thu Dec 17 2020 Jaroslav Škarvada <jskarvad@redhat.com> - 2.15.0-1
 - new release
   - rebased tuned to latest upstream