diff --git a/SOURCES/openvswitch-2.16.0.patch b/SOURCES/openvswitch-2.16.0.patch
index 11b65d6..83d99b7 100644
--- a/SOURCES/openvswitch-2.16.0.patch
+++ b/SOURCES/openvswitch-2.16.0.patch
@@ -3581,10 +3581,23 @@ index a426fcfeb6..aeff3b2679 100644
          }
          }
 diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
-index cba49a99e1..c012cebae1 100644
+index cba49a99e1..3239defbdf 100644
 --- a/ofproto/ofproto-dpif.c
 +++ b/ofproto/ofproto-dpif.c
-@@ -6496,6 +6496,7 @@ ofproto_unixctl_dpif_show_dp_features(struct unixctl_conn *conn,
+@@ -2333,6 +2333,12 @@ set_ipfix(
+             dpif_ipfix_unref(di);
+             ofproto->ipfix = NULL;
+         }
++
++        /* TODO: need to consider ipfix option changes more than
++         * enable/disable */
++        if (new_di || !ofproto->ipfix) {
++            ofproto->backer->need_revalidate = REV_RECONFIGURE;
++        }
+     }
+ 
+     return 0;
+@@ -6496,6 +6502,7 @@ ofproto_unixctl_dpif_show_dp_features(struct unixctl_conn *conn,
  
      dpif_show_support(&ofproto->backer->bt_support, &ds);
      unixctl_command_reply(conn, ds_cstr(&ds));
@@ -6914,11 +6927,166 @@ index 0f74709f5a..5bca84351c 100644
  run
    should send probe
    in IDLE for 0 ms (1000 ms backoff)
+diff --git a/tests/system-common-macros.at b/tests/system-common-macros.at
+index 19a0b125b9..8b9f5c7525 100644
+--- a/tests/system-common-macros.at
++++ b/tests/system-common-macros.at
+@@ -281,6 +281,14 @@ m4_define([OVS_START_L7],
+ #
+ m4_define([OFPROTO_CLEAR_DURATION_IDLE], [[sed -e 's/duration=.*s,/duration=<cleared>,/g' -e 's/idle_age=[0-9]*,/idle_age=<cleared>,/g']])
+ 
++# OVS_CHECK_TUNNEL_TSO()
++#
++# Macro to be used in general tunneling tests that could be also
++# used by system-tso. In that case, tunneling is not supported and
++# the test should be skipped.
++m4_define([OVS_CHECK_TUNNEL_TSO],
++    [m4_ifdef([CHECK_SYSTEM_TSO], [AT_SKIP_IF(:)])])
++
+ # OVS_CHECK_VXLAN()
+ #
+ # Do basic check for vxlan functionality, skip the test if it's not there.
 diff --git a/tests/system-traffic.at b/tests/system-traffic.at
-index f400cfabc9..092de308be 100644
+index f400cfabc9..852e2520b4 100644
 --- a/tests/system-traffic.at
 +++ b/tests/system-traffic.at
-@@ -1981,6 +1981,111 @@ tcp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=<cleared>,dport=<cleared>),reply=(src=
+@@ -218,6 +218,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over vxlan tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_VXLAN()
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -259,6 +260,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over vxlan6 tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_VXLAN_UDP6ZEROCSUM()
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -302,6 +304,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over gre tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
+ OVS_CHECK_GRE()
+ 
+@@ -343,6 +346,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over ip6gre L2 tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
+ OVS_CHECK_GRE()
+ OVS_CHECK_ERSPAN()
+@@ -383,6 +387,7 @@ AT_CLEANUP
+ 
+ 
+ AT_SETUP([datapath - ping over erspan v1 tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
+ OVS_CHECK_GRE()
+ OVS_CHECK_ERSPAN()
+@@ -419,6 +424,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over erspan v2 tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
+ OVS_CHECK_GRE()
+ OVS_CHECK_ERSPAN()
+@@ -455,6 +461,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over ip6erspan v1 tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
+ OVS_CHECK_GRE()
+ OVS_CHECK_ERSPAN()
+@@ -494,6 +501,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over ip6erspan v2 tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
+ OVS_CHECK_GRE()
+ OVS_CHECK_ERSPAN()
+@@ -534,6 +542,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over geneve tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_GENEVE()
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -575,6 +584,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over geneve tunnel, delete flow regression])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_GENEVE()
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -629,6 +639,7 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/|ERR|/d
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - flow resume with geneve tun_metadata])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_GENEVE()
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -680,6 +691,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over geneve6 tunnel])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_GENEVE_UDP6ZEROCSUM()
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -723,6 +735,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over gre tunnel by simulated packets])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_MIN_KERNEL(3, 10)
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -769,6 +782,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over erspan v1 tunnel by simulated packets])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_MIN_KERNEL(3, 10)
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -817,6 +831,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over erspan v2 tunnel by simulated packets])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_MIN_KERNEL(3, 10)
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -870,6 +885,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over ip6erspan v1 tunnel by simulated packets])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_MIN_KERNEL(3, 10)
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -925,6 +941,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+ AT_CLEANUP
+ 
+ AT_SETUP([datapath - ping over ip6erspan v2 tunnel by simulated packets])
++OVS_CHECK_TUNNEL_TSO()
+ OVS_CHECK_MIN_KERNEL(3, 10)
+ 
+ OVS_TRAFFIC_VSWITCHD_START()
+@@ -1981,6 +1998,111 @@ tcp,orig=(src=10.1.1.3,dst=10.1.1.4,sport=<cleared>,dport=<cleared>),reply=(src=
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
@@ -7030,7 +7198,7 @@ index f400cfabc9..092de308be 100644
  AT_SETUP([conntrack - multiple bridges])
  CHECK_CONNTRACK()
  OVS_TRAFFIC_VSWITCHD_START(
-@@ -3305,6 +3410,46 @@ NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING
+@@ -3305,6 +3427,46 @@ NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
@@ -7077,6 +7245,16 @@ index f400cfabc9..092de308be 100644
  AT_SETUP([conntrack - resubmit to ct multiple times])
  CHECK_CONNTRACK()
  
+diff --git a/tests/system-tso-macros.at b/tests/system-tso-macros.at
+index 406334f3e0..1a80047619 100644
+--- a/tests/system-tso-macros.at
++++ b/tests/system-tso-macros.at
+@@ -29,3 +29,5 @@ m4_define([CONFIGURE_VETH_OFFLOADS],
+     [AT_CHECK([ethtool -K $1 sg on], [0], [ignore], [ignore])]
+     [AT_CHECK([ethtool -K $1 tso on], [0], [ignore], [ignore])]
+ )
++
++m4_define([CHECK_SYSTEM_TSO], [])
 diff --git a/tests/test-json.c b/tests/test-json.c
 index a7ee595e0b..072a537252 100644
 --- a/tests/test-json.c
diff --git a/SPECS/openvswitch2.16.spec b/SPECS/openvswitch2.16.spec
index ab93ddf..5911357 100644
--- a/SPECS/openvswitch2.16.spec
+++ b/SPECS/openvswitch2.16.spec
@@ -57,7 +57,7 @@ Summary: Open vSwitch
 Group: System Environment/Daemons daemon/database/utilities
 URL: http://www.openvswitch.org/
 Version: 2.16.0
-Release: 59%{?dist}
+Release: 60%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -699,6 +699,13 @@ exit 0
 %endif
 
 %changelog
+* Sat Mar 05 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-60
+- Merging upstream branch-2.16 [RH git: 67312d8bee]
+    Commit list:
+    43882d8372 ofproto-dpif: Trigger revalidation when ipfix config set.
+    218bb05fb2 system-tso: Skip encap tests when userspace TSO is enabled.
+
+
 * Fri Mar 04 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-59
 - Merging upstream branch-2.16 [RH git: 832e52bea7]
     Commit list: