diff --git a/SOURCES/openvswitch-2.16.0.patch b/SOURCES/openvswitch-2.16.0.patch
index a1ce8d0..a2b6e28 100644
--- a/SOURCES/openvswitch-2.16.0.patch
+++ b/SOURCES/openvswitch-2.16.0.patch
@@ -1848,7 +1848,7 @@ index b30a11c24b..41835f6f4d 100644
      }
  
 diff --git a/ofproto/ofproto-dpif-xlate.c b/ofproto/ofproto-dpif-xlate.c
-index a426fcfeb6..1bab22aa5e 100644
+index a426fcfeb6..970f78bb52 100644
 --- a/ofproto/ofproto-dpif-xlate.c
 +++ b/ofproto/ofproto-dpif-xlate.c
 @@ -6177,11 +6177,32 @@ static void
@@ -1899,6 +1899,53 @@ index a426fcfeb6..1bab22aa5e 100644
  
      ct_offset = nl_msg_start_nested(ctx->odp_actions, OVS_ACTION_ATTR_CT);
      if (ofc->flags & NX_CT_F_COMMIT) {
+@@ -6333,6 +6349,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx,
+      * then ctx->exit would be true. Reset to false so that we can
+      * do flow translation for 'IF_LESS_EQUAL' case. finish_freezing()
+      * would have taken care of Undoing the changes done for freeze. */
++    bool old_exit = ctx->exit;
+     ctx->exit = false;
+ 
+     offset_attr = nl_msg_start_nested(
+@@ -6357,7 +6374,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx,
+     ctx->was_mpls = old_was_mpls;
+     ctx->conntracked = old_conntracked;
+     ctx->xin->flow = old_flow;
+-    ctx->exit = true;
++    ctx->exit = old_exit;
+ }
+ 
+ static void
+@@ -6738,6 +6755,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+         return;
+     }
+ 
++    bool exit = false;
+     OFPACT_FOR_EACH (a, ofpacts, ofpacts_len) {
+         struct ofpact_controller *controller;
+         const struct ofpact_metadata *metadata;
+@@ -6752,7 +6770,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+ 
+         recirc_for_mpls(a, ctx);
+ 
+-        if (ctx->exit) {
++        if (ctx->exit || exit) {
+             /* Check if need to store the remaining actions for later
+              * execution. */
+             if (ctx->freezing) {
+@@ -7160,6 +7178,12 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+                                                              ofpacts_len);
+             xlate_check_pkt_larger(ctx, ofpact_get_CHECK_PKT_LARGER(a),
+                                    remaining_acts, remaining_acts_len);
++            if (ctx->xbridge->support.check_pkt_len) {
++                /* If datapath supports check_pkt_len, then
++                 * xlate_check_pkt_larger() does the translation for the
++                 * ofpacts following 'a'. */
++                exit = true;
++            }
+             break;
+         }
+         }
 diff --git a/ovsdb/file.c b/ovsdb/file.c
 index 59220824fa..9f44007d97 100644
 --- a/ovsdb/file.c
@@ -4046,7 +4093,7 @@ index f5a520862c..ac5b0fd0c6 100644
      # Register SSL only if the OpenSSL module is available
      Stream.register_method("ssl", SSLStream)
 diff --git a/tests/ofproto-dpif.at b/tests/ofproto-dpif.at
-index 956a69e1fa..1dad6f62c6 100644
+index 956a69e1fa..0c127a6474 100644
 --- a/tests/ofproto-dpif.at
 +++ b/tests/ofproto-dpif.at
 @@ -9695,6 +9695,26 @@ OFPST_TABLE reply (OF1.3) (xid=0x2):
@@ -4076,6 +4123,30 @@ index 956a69e1fa..1dad6f62c6 100644
  AT_SETUP([ofproto-dpif - ICMPv6])
  OVS_VSWITCHD_START
  add_of_ports br0 1
+@@ -11404,6 +11424,23 @@ Megaflow: recirc_id=0x3,eth,ip,in_port=1,nw_frag=no
+ Datapath actions: 4
+ ])
+ 
++ovs-ofctl del-flows br0
++
++AT_DATA([flows.txt], [dnl
++table=0,in_port=1 actions=load:0x1->NXM_NX_REG1[[]],resubmit(,1),load:0x2->NXM_NX_REG1[[]],resubmit(,1),load:0x3->NXM_NX_REG1[[]],resubmit(,1)
++table=1,in_port=1,reg1=0x1 actions=check_pkt_larger(200)->NXM_NX_REG0[[0]],resubmit(,4)
++table=1,in_port=1,reg1=0x2 actions=output:2
++table=1,in_port=1,reg1=0x3 actions=output:4
++table=4,in_port=1 actions=output:3
++])
++
++AT_CHECK([ovs-ofctl --protocols=OpenFlow10 add-flows br0 flows.txt])
++AT_CHECK([ovs-appctl ofproto/trace ovs-dummy 'in_port(1),eth(src=50:54:00:00:00:09,dst=50:54:00:00:00:0a),eth_type(0x0800),ipv4(src=10.10.10.2,dst=10.10.10.1,proto=1,tos=1,ttl=128,frag=no),icmp(type=8,code=0)'], [0], [stdout])
++AT_CHECK([cat stdout | grep Datapath -B1], [0], [dnl
++Megaflow: recirc_id=0,eth,ip,in_port=1,nw_frag=no
++Datapath actions: check_pkt_len(size=200,gt(3),le(3)),2,4
++])
++
+ OVS_VSWITCHD_STOP
+ AT_CLEANUP
+ 
 diff --git a/tests/ovsdb-data.at b/tests/ovsdb-data.at
 index 8cd2a26cb3..25c6acdac6 100644
 --- a/tests/ovsdb-data.at
diff --git a/SPECS/openvswitch2.16.spec b/SPECS/openvswitch2.16.spec
index 8c2d9ab..5d4d334 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: 31%{?dist}
+Release: 32%{?dist}
 
 # Nearly all of openvswitch is ASL 2.0.  The bugtool is LGPLv2+, and the
 # lib/sflow*.[ch] files are SISSL
@@ -699,6 +699,12 @@ exit 0
 %endif
 
 %changelog
+* Thu Nov 18 2021 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-32
+- Merging upstream branch-2.16 [RH git: e90e06a818]
+    Commit list:
+    1d8e0f861f ofproto-dpif-xlate: Fix check_pkt_larger incomplete translation.
+
+
 * Mon Nov 15 2021 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-31
 - Merging upstream branch-2.16 [RH git: 77a249d38b]
     Commit list: