diff --git a/SOURCES/openvswitch-2.16.0.patch b/SOURCES/openvswitch-2.16.0.patch
index c9bf905..e87630e 100644
--- a/SOURCES/openvswitch-2.16.0.patch
+++ b/SOURCES/openvswitch-2.16.0.patch
@@ -978,6 +978,37 @@ index 0000000000..6fae6f727c
 +
 +#endif /* __KERNEL__ || !HAVE_TCA_STATS_PKT64 */
 +#endif /* __LINUX_GEN_STATS_WRAPPER_H */
+diff --git a/include/openvswitch/flow.h b/include/openvswitch/flow.h
+index 3054015d93..df10cf579e 100644
+--- a/include/openvswitch/flow.h
++++ b/include/openvswitch/flow.h
+@@ -141,15 +141,14 @@ struct flow {
+     uint8_t nw_tos;             /* IP ToS (including DSCP and ECN). */
+     uint8_t nw_ttl;             /* IP TTL/Hop Limit. */
+     uint8_t nw_proto;           /* IP protocol or low 8 bits of ARP opcode. */
++    /* L4 (64-bit aligned) */
+     struct in6_addr nd_target;  /* IPv6 neighbor discovery (ND) target. */
+     struct eth_addr arp_sha;    /* ARP/ND source hardware address. */
+     struct eth_addr arp_tha;    /* ARP/ND target hardware address. */
+-    ovs_be16 tcp_flags;         /* TCP flags/ICMPv6 ND options type.
+-                                 * With L3 to avoid matching L4. */
++    ovs_be16 tcp_flags;         /* TCP flags/ICMPv6 ND options type. */
+     ovs_be16 pad2;              /* Pad to 64 bits. */
+     struct ovs_key_nsh nsh;     /* Network Service Header keys */
+ 
+-    /* L4 (64-bit aligned) */
+     ovs_be16 tp_src;            /* TCP/UDP/SCTP source port/ICMP type. */
+     ovs_be16 tp_dst;            /* TCP/UDP/SCTP destination port/ICMP code. */
+     ovs_be16 ct_tp_src;         /* CT original tuple source port/ICMP type. */
+@@ -179,7 +178,7 @@ BUILD_ASSERT_DECL(offsetof(struct flow, igmp_group_ip4) + sizeof(uint32_t)
+ enum {
+     FLOW_SEGMENT_1_ENDS_AT = offsetof(struct flow, dl_dst),
+     FLOW_SEGMENT_2_ENDS_AT = offsetof(struct flow, nw_src),
+-    FLOW_SEGMENT_3_ENDS_AT = offsetof(struct flow, tp_src),
++    FLOW_SEGMENT_3_ENDS_AT = offsetof(struct flow, nd_target),
+ };
+ BUILD_ASSERT_DECL(FLOW_SEGMENT_1_ENDS_AT % sizeof(uint64_t) == 0);
+ BUILD_ASSERT_DECL(FLOW_SEGMENT_2_ENDS_AT % sizeof(uint64_t) == 0);
 diff --git a/include/openvswitch/hmap.h b/include/openvswitch/hmap.h
 index 4e001cc692..68c284cf14 100644
 --- a/include/openvswitch/hmap.h
@@ -5228,7 +5259,7 @@ index 114aff8ea3..0fc6d2ea60 100644
      enum xc_type type;
      union {
 diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
-index a426fcfeb6..df44c18e7d 100644
+index a426fcfeb6..b8886105df 100644
 --- a/ofproto/ofproto-dpif-xlate.c
 +++ b/ofproto/ofproto-dpif-xlate.c
 @@ -460,7 +460,7 @@ static void xlate_commit_actions(struct xlate_ctx *ctx);
@@ -5582,6 +5613,19 @@ index a426fcfeb6..df44c18e7d 100644
              break;
          }
          }
+@@ -7623,6 +7690,12 @@ xlate_actions(struct xlate_in *xin, struct xlate_out *xout)
+         goto exit;
+     }
+ 
++    if (!xin->frozen_state
++        && xin->flow.ct_state
++        && xin->flow.ct_state & CS_TRACKED) {
++        ctx.conntracked = true;
++    }
++
+     /* Tunnel metadata in udpif format must be normalized before translation. */
+     if (flow->tunnel.flags & FLOW_TNL_F_UDPIF) {
+         const struct tun_table *tun_tab = ofproto_get_tun_tab(
 diff --git a/ofproto/ofproto-dpif-xlate.h b/ofproto/ofproto-dpif-xlate.h
 index 851088d794..2ba90e999c 100644
 --- a/ofproto/ofproto-dpif-xlate.h
@@ -8821,6 +8865,42 @@ index 903238fcb2..67eb14f473 100644
  AT_SETUP([ALB - PMD/RxQ assignment type])
  OVS_VSWITCHD_START([add-port br0 p0 \
                      -- set Interface p0 type=dummy-pmd options:n_rxq=3 \
+diff --git a/tests/classifier.at b/tests/classifier.at
+index cdcd72c156..f652b59837 100644
+--- a/tests/classifier.at
++++ b/tests/classifier.at
+@@ -129,6 +129,31 @@ Datapath actions: 3
+ OVS_VSWITCHD_STOP(["/'prefixes' with incompatible field: ipv6_label/d"])
+ AT_CLEANUP
+ 
++AT_SETUP([flow classifier - ipv6 ND dependency])
++OVS_VSWITCHD_START
++add_of_ports br0 1 2
++AT_DATA([flows.txt], [dnl
++ table=0,priority=100,ipv6,ipv6_src=1000::/10 actions=resubmit(,1)
++ table=0,priority=0 actions=NORMAL
++ table=1,priority=110,ipv6,ipv6_dst=1000::3 actions=resubmit(,2)
++ table=1,priority=100,ipv6,ipv6_dst=1000::4 actions=resubmit(,2)
++ table=1,priority=0 actions=NORMAL
++ table=2,priority=120,icmp6,nw_ttl=255,icmp_type=135,icmp_code=0,nd_target=1000::1 actions=NORMAL
++ table=2,priority=100,tcp actions=NORMAL
++ table=2,priority=100,icmp6 actions=NORMAL
++ table=2,priority=0 actions=NORMAL
++])
++AT_CHECK([ovs-ofctl add-flows br0 flows.txt])
++
++# test ICMPv6 echo request (which should have no nd_target field)
++AT_CHECK([ovs-appctl ofproto/trace br0 "in_port=1,eth_src=f6:d2:b0:19:5e:7b,eth_dst=d2:49:19:91:78:fe,dl_type=0x86dd,ipv6_src=1000::3,ipv6_dst=1000::4,nw_proto=58,icmpv6_type=128,icmpv6_code=0"], [0], [stdout])
++AT_CHECK([tail -2 stdout], [0],
++  [Megaflow: recirc_id=0,eth,icmp6,in_port=1,dl_src=f6:d2:b0:19:5e:7b,dl_dst=d2:49:19:91:78:fe,ipv6_src=1000::/10,ipv6_dst=1000::4,nw_ttl=0,nw_frag=no
++Datapath actions: 100,2
++])
++OVS_VSWITCHD_STOP
++AT_CLEANUP
++
+ AT_BANNER([conjunctive match])
+ 
+ AT_SETUP([single conjunctive match])
 diff --git a/tests/flowgen.py b/tests/flowgen.py
 index 7ef32d13cb..cb0e9df388 100755
 --- a/tests/flowgen.py
@@ -10391,7 +10471,7 @@ index 1714273e35..270956d13f 100644
  dnl Delete ip address.
  AT_CHECK([ip addr del 10.0.0.17/24 dev p1-route], [0], [stdout])
 diff --git a/tests/system-traffic.at b/tests/system-traffic.at
-index f400cfabc9..c6ff310013 100644
+index f400cfabc9..4c368eded4 100644
 --- a/tests/system-traffic.at
 +++ b/tests/system-traffic.at
 @@ -218,6 +218,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
@@ -10765,10 +10845,57 @@ index f400cfabc9..c6ff310013 100644
      echo Request $i
      NS_CHECK_EXEC([at_ns1], [wget 10.1.1.64 -t 5 -T 1 --retry-connrefused -v -o wget$i.log])
  done
-@@ -6106,6 +6315,85 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep table=2, | OFPROTO_CLEAR_DURATION_IDLE
+@@ -6106,6 +6315,132 @@ AT_CHECK([ovs-ofctl dump-flows br0 | grep table=2, | OFPROTO_CLEAR_DURATION_IDLE
  OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
++AT_SETUP([conntrack - can match and clear ct_state from outside OVS])
++CHECK_CONNTRACK_LOCAL_STACK()
++OVS_CHECK_TUNNEL_TSO()
++OVS_CHECK_GENEVE()
++
++OVS_TRAFFIC_VSWITCHD_START()
++ADD_BR([br-underlay], [set bridge br-underlay other-config:hwaddr=\"f0:00:00:01:01:02\"])
++
++AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
++AT_CHECK([ovs-ofctl add-flow br-underlay "priority=100,ct_state=+trk,actions=ct_clear,resubmit(,0)"])
++AT_CHECK([ovs-ofctl add-flow br-underlay "priority=10,actions=normal"])
++
++ADD_NAMESPACES(at_ns0)
++
++dnl Set up underlay link from host into the namespace using veth pair.
++ADD_VETH(p0, at_ns0, br-underlay, "172.31.1.1/24", "f0:00:00:01:01:01")
++AT_CHECK([ip addr add dev br-underlay "172.31.1.100/24"])
++AT_CHECK([ip link set dev br-underlay up])
++
++dnl Set up tunnel endpoints on OVS outside the namespace and with a native
++dnl linux device inside the namespace.
++ADD_OVS_TUNNEL([geneve], [br0], [at_gnv0], [172.31.1.1], [10.1.1.100/24])
++ADD_NATIVE_TUNNEL([geneve], [ns_gnv0], [at_ns0], [172.31.1.100], [10.1.1.1/24],
++                  [vni 0])
++
++dnl First, check the underlay
++NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 172.31.1.100 | FORMAT_PING], [0], [dnl
++3 packets transmitted, 3 received, 0% packet loss, time 0ms
++])
++
++dnl Okay, now check the overlay
++NS_CHECK_EXEC([at_ns0], [ping -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PING], [0], [dnl
++3 packets transmitted, 3 received, 0% packet loss, time 0ms
++])
++
++dnl Confirm that the ct_state and ct_clear action found its way to the dp
++AT_CHECK([ovs-appctl dpctl/dump-flows --names | grep ct_clear | sort | dnl
++          grep 'eth(src=f0:00:00:01:01:02,dst=f0:00:00:01:01:01)' | dnl
++          strip_stats | strip_used | dnl
++          sed 's/,packet_type(ns=[[0-9]]*,id=[[0-9]]*),/,/'],
++                     [0], [dnl
++recirc_id(0),in_port(br-underlay),ct_state(+trk),eth(src=f0:00:00:01:01:02,dst=f0:00:00:01:01:01),eth_type(0x0800),ipv4(frag=no), packets:0, bytes:0, used:0.0s, actions:ct_clear,ovs-p0
++])
++
++OVS_TRAFFIC_VSWITCHD_STOP
++AT_CLEANUP
++
 +AT_BANNER([IGMP])
 +
 +AT_SETUP([IGMP - flood under normal action])
diff --git a/SPECS/openvswitch2.16.spec b/SPECS/openvswitch2.16.spec
index 68ff286..32b845c 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: 79%{?dist}
+Release: 80%{?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
+* Tue Jun 07 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-80
+- Merging upstream branch-2.16 [RH git: 45dcf738b0]
+    Commit list:
+    87922569f3 ofproto-dpif-xlate: Fix internal CT state for non-recirc traffic.
+    51aa8dd106 classifier: Adjust segment boundary to execute prerequisite processing. (#2081773)
+
+
 * Tue May 31 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-79
 - Merging upstream branch-2.16 [RH git: c224775aed]
     Commit list: