diff --git a/SOURCES/openvswitch-2.16.0.patch b/SOURCES/openvswitch-2.16.0.patch
index 1558cc9..a4e81cc 100644
--- a/SOURCES/openvswitch-2.16.0.patch
+++ b/SOURCES/openvswitch-2.16.0.patch
@@ -4913,7 +4913,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..7cd59ef885 100644
+index a426fcfeb6..3a09500560 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);
@@ -5008,7 +5008,17 @@ index a426fcfeb6..7cd59ef885 100644
          return;
      }
  
-@@ -3598,7 +3619,7 @@ propagate_tunnel_data_to_flow(struct xlate_ctx *ctx, struct eth_addr dmac,
+@@ -3521,6 +3542,9 @@ propagate_tunnel_data_to_flow__(struct flow *dst_flow,
+     dst_flow->dl_dst = dmac;
+     dst_flow->dl_src = smac;
+ 
++    /* Clear VLAN entries which do not apply for tunnel flows. */
++    memset(dst_flow->vlans, 0, sizeof dst_flow->vlans);
++
+     dst_flow->packet_type = htonl(PT_ETH);
+     dst_flow->nw_dst = src_flow->tunnel.ip_dst;
+     dst_flow->nw_src = src_flow->tunnel.ip_src;
+@@ -3598,7 +3622,7 @@ propagate_tunnel_data_to_flow(struct xlate_ctx *ctx, struct eth_addr dmac,
  static int
  native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport,
                       const struct flow *flow, odp_port_t tunnel_odp_port,
@@ -5017,7 +5027,7 @@ index a426fcfeb6..7cd59ef885 100644
  {
      struct netdev_tnl_build_header_params tnl_params;
      struct ovs_action_push_tnl tnl_push_data;
-@@ -3728,7 +3749,7 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport,
+@@ -3728,7 +3752,7 @@ native_tunnel_output(struct xlate_ctx *ctx, const struct xport *xport,
          entry->tunnel_hdr.hdr_size = tnl_push_data.header_len;
          entry->tunnel_hdr.operation = ADD;
  
@@ -5026,7 +5036,7 @@ index a426fcfeb6..7cd59ef885 100644
  
          /* Similar to the stats update in revalidation, the x_cache entries
           * are populated by the previous translation are used to update the
-@@ -3822,7 +3843,7 @@ xlate_flow_is_protected(const struct xlate_ctx *ctx, const struct flow *flow, co
+@@ -3822,7 +3846,7 @@ xlate_flow_is_protected(const struct xlate_ctx *ctx, const struct flow *flow, co
   */
  static void
  patch_port_output(struct xlate_ctx *ctx, const struct xport *in_dev,
@@ -5035,7 +5045,7 @@ index a426fcfeb6..7cd59ef885 100644
  {
      struct flow *flow = &ctx->xin->flow;
      struct flow old_flow = ctx->xin->flow;
-@@ -3864,8 +3885,9 @@ patch_port_output(struct xlate_ctx *ctx, const struct xport *in_dev,
+@@ -3864,8 +3888,9 @@ patch_port_output(struct xlate_ctx *ctx, const struct xport *in_dev,
      if (!process_special(ctx, out_dev) && may_receive(out_dev, ctx)) {
          if (xport_stp_forward_state(out_dev) &&
              xport_rstp_forward_state(out_dev)) {
@@ -5046,7 +5056,7 @@ index a426fcfeb6..7cd59ef885 100644
              if (!ctx->freezing) {
                  xlate_action_set(ctx);
              }
-@@ -3880,7 +3902,7 @@ patch_port_output(struct xlate_ctx *ctx, const struct xport *in_dev,
+@@ -3880,7 +3905,7 @@ patch_port_output(struct xlate_ctx *ctx, const struct xport *in_dev,
              mirror_mask_t old_mirrors2 = ctx->mirrors;
  
              xlate_table_action(ctx, flow->in_port.ofp_port, 0, true, true,
@@ -5055,7 +5065,7 @@ index a426fcfeb6..7cd59ef885 100644
              ctx->mirrors = old_mirrors2;
              ctx->base_flow = old_base_flow;
              ctx->odp_actions->size = old_size;
-@@ -4097,7 +4119,21 @@ terminate_native_tunnel(struct xlate_ctx *ctx, struct flow *flow,
+@@ -4097,7 +4122,21 @@ terminate_native_tunnel(struct xlate_ctx *ctx, struct flow *flow,
              (flow->dl_type == htons(ETH_TYPE_ARP) ||
               flow->nw_proto == IPPROTO_ICMPV6) &&
               is_neighbor_reply_correct(ctx, flow)) {
@@ -5078,7 +5088,7 @@ index a426fcfeb6..7cd59ef885 100644
          }
      }
  
-@@ -4107,7 +4143,7 @@ terminate_native_tunnel(struct xlate_ctx *ctx, struct flow *flow,
+@@ -4107,7 +4146,7 @@ terminate_native_tunnel(struct xlate_ctx *ctx, struct flow *flow,
  static void
  compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
                          const struct xlate_bond_recirc *xr, bool check_stp,
@@ -5087,7 +5097,7 @@ index a426fcfeb6..7cd59ef885 100644
  {
      const struct xport *xport = get_ofp_port(ctx->xbridge, ofp_port);
      struct flow_wildcards *wc = ctx->wc;
-@@ -4137,6 +4173,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
+@@ -4137,6 +4176,10 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
          if (xport->pt_mode == NETDEV_PT_LEGACY_L3) {
              flow->packet_type = PACKET_TYPE_BE(OFPHTN_ETHERTYPE,
                                                 ntohs(flow->dl_type));
@@ -5098,7 +5108,7 @@ index a426fcfeb6..7cd59ef885 100644
          }
      }
  
-@@ -4144,7 +4184,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
+@@ -4144,7 +4187,7 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
         if (truncate) {
             xlate_report_error(ctx, "Cannot truncate output to patch port");
         }
@@ -5107,7 +5117,7 @@ index a426fcfeb6..7cd59ef885 100644
         return;
      }
  
-@@ -4239,7 +4279,8 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
+@@ -4239,7 +4282,8 @@ compose_output_action__(struct xlate_ctx *ctx, ofp_port_t ofp_port,
                             xr->recirc_id);
          } else if (is_native_tunnel) {
              /* Output to native tunnel port. */
@@ -5117,7 +5127,7 @@ index a426fcfeb6..7cd59ef885 100644
              flow->tunnel = flow_tnl; /* Restore tunnel metadata */
  
          } else if (terminate_native_tunnel(ctx, flow, wc,
-@@ -6177,11 +6218,32 @@ static void
+@@ -6177,11 +6221,32 @@ static void
  compose_conntrack_action(struct xlate_ctx *ctx, struct ofpact_conntrack *ofc,
                           bool is_last_action)
  {
@@ -5153,7 +5163,7 @@ index a426fcfeb6..7cd59ef885 100644
      /* Ensure that any prior actions are applied before composing the new
       * conntrack action. */
      xlate_commit_actions(ctx);
-@@ -6193,11 +6255,6 @@ compose_conntrack_action(struct xlate_ctx *ctx, struct ofpact_conntrack *ofc,
+@@ -6193,11 +6258,6 @@ compose_conntrack_action(struct xlate_ctx *ctx, struct ofpact_conntrack *ofc,
      do_xlate_actions(ofc->actions, ofpact_ct_get_action_len(ofc), ctx,
                       is_last_action, false);
  
@@ -5165,7 +5175,7 @@ index a426fcfeb6..7cd59ef885 100644
  
      ct_offset = nl_msg_start_nested(ctx->odp_actions, OVS_ACTION_ATTR_CT);
      if (ofc->flags & NX_CT_F_COMMIT) {
-@@ -6333,6 +6390,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx,
+@@ -6333,6 +6393,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. */
@@ -5173,7 +5183,7 @@ index a426fcfeb6..7cd59ef885 100644
      ctx->exit = false;
  
      offset_attr = nl_msg_start_nested(
-@@ -6357,7 +6415,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx,
+@@ -6357,7 +6418,7 @@ xlate_check_pkt_larger(struct xlate_ctx *ctx,
      ctx->was_mpls = old_was_mpls;
      ctx->conntracked = old_conntracked;
      ctx->xin->flow = old_flow;
@@ -5182,7 +5192,7 @@ index a426fcfeb6..7cd59ef885 100644
  }
  
  static void
-@@ -6738,13 +6796,14 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+@@ -6738,13 +6799,14 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
          return;
      }
  
@@ -5198,7 +5208,7 @@ index a426fcfeb6..7cd59ef885 100644
  
          if (ctx->error) {
              break;
-@@ -6752,7 +6811,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+@@ -6752,7 +6814,7 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
  
          recirc_for_mpls(a, ctx);
  
@@ -5207,7 +5217,7 @@ index a426fcfeb6..7cd59ef885 100644
              /* Check if need to store the remaining actions for later
               * execution. */
              if (ctx->freezing) {
-@@ -7149,17 +7208,18 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
+@@ -7149,17 +7211,18 @@ do_xlate_actions(const struct ofpact *ofpacts, size_t ofpacts_len,
              break;
  
          case OFPACT_CHECK_PKT_LARGER: {
@@ -9276,7 +9286,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..638501fcdc 100644
+index f400cfabc9..ea3078e3e4 100644
 --- a/tests/system-traffic.at
 +++ b/tests/system-traffic.at
 @@ -218,6 +218,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
@@ -9287,15 +9297,63 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_VXLAN()
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -259,6 +260,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -258,7 +259,55 @@ NS_CHECK_EXEC([at_ns0], [ping -s 3200 -q -c 3 -i 0.3 -w 2 10.1.1.100 | FORMAT_PI
+ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
++AT_SETUP([datapath - ping vlan over vxlan tunnel])
++OVS_CHECK_TUNNEL_TSO()
++OVS_CHECK_VXLAN()
++
++OVS_TRAFFIC_VSWITCHD_START()
++ADD_BR([br-underlay])
++
++AT_CHECK([ovs-ofctl add-flow br0 "actions=normal"])
++AT_CHECK([ovs-ofctl add-flow br-underlay "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.2.1/24")
++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([vxlan], [br0], [at_vxlan0], [172.31.1.1], [10.1.1.100/24])
++ADD_NATIVE_TUNNEL([vxlan], [at_vxlan1], [at_ns0], [172.31.1.100], [10.2.1.1/24],
++                  [id 0 dstport 4789])
++
++AT_CHECK([ovs-vsctl set port br0 tag=100])
++AT_CHECK([ovs-vsctl set port br-underlay tag=42])
++
++ADD_VLAN(at_vxlan1, at_ns0, 100, "10.1.1.1/24")
++ADD_VLAN(p0, at_ns0, 42, "172.31.1.1/24")
++
++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 with different packet sizes
++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
++])
++NS_CHECK_EXEC([at_ns0], [ping -s 1600 -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
++])
++NS_CHECK_EXEC([at_ns0], [ping -s 3200 -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
++])
++
++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
+@@ -302,6 +351,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over gre tunnel])
@@ -9303,7 +9361,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
  OVS_CHECK_GRE()
  
-@@ -343,6 +346,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -343,6 +393,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over ip6gre L2 tunnel])
@@ -9311,7 +9369,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
  OVS_CHECK_GRE()
  OVS_CHECK_ERSPAN()
-@@ -383,6 +387,7 @@ AT_CLEANUP
+@@ -383,6 +434,7 @@ AT_CLEANUP
  
  
  AT_SETUP([datapath - ping over erspan v1 tunnel])
@@ -9319,7 +9377,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
  OVS_CHECK_GRE()
  OVS_CHECK_ERSPAN()
-@@ -419,6 +424,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -419,6 +471,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over erspan v2 tunnel])
@@ -9327,7 +9385,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
  OVS_CHECK_GRE()
  OVS_CHECK_ERSPAN()
-@@ -455,6 +461,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -455,6 +508,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over ip6erspan v1 tunnel])
@@ -9335,7 +9393,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
  OVS_CHECK_GRE()
  OVS_CHECK_ERSPAN()
-@@ -494,6 +501,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -494,6 +548,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over ip6erspan v2 tunnel])
@@ -9343,7 +9401,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_KERNEL_EXCL(3, 10, 4, 15)
  OVS_CHECK_GRE()
  OVS_CHECK_ERSPAN()
-@@ -534,6 +542,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -534,6 +589,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over geneve tunnel])
@@ -9351,7 +9409,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_GENEVE()
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -575,6 +584,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -575,6 +631,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over geneve tunnel, delete flow regression])
@@ -9359,7 +9417,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_GENEVE()
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -629,6 +639,7 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/|ERR|/d
+@@ -629,6 +686,7 @@ OVS_TRAFFIC_VSWITCHD_STOP(["/|ERR|/d
  AT_CLEANUP
  
  AT_SETUP([datapath - flow resume with geneve tun_metadata])
@@ -9367,7 +9425,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_GENEVE()
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -680,6 +691,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -680,6 +738,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over geneve6 tunnel])
@@ -9375,7 +9433,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_GENEVE_UDP6ZEROCSUM()
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -723,6 +735,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -723,6 +782,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over gre tunnel by simulated packets])
@@ -9383,7 +9441,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -769,6 +782,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -769,6 +829,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over erspan v1 tunnel by simulated packets])
@@ -9391,7 +9449,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -817,6 +831,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -817,6 +878,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over erspan v2 tunnel by simulated packets])
@@ -9399,7 +9457,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -870,6 +885,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -870,6 +932,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over ip6erspan v1 tunnel by simulated packets])
@@ -9407,7 +9465,7 @@ index f400cfabc9..638501fcdc 100644
  OVS_CHECK_MIN_KERNEL(3, 10)
  
  OVS_TRAFFIC_VSWITCHD_START()
-@@ -925,6 +941,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
+@@ -925,6 +988,7 @@ OVS_TRAFFIC_VSWITCHD_STOP
  AT_CLEANUP
  
  AT_SETUP([datapath - ping over ip6erspan v2 tunnel by simulated packets])
@@ -9415,7 +9473,7 @@ index f400cfabc9..638501fcdc 100644
  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=
+@@ -1981,6 +2045,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
  
@@ -9527,7 +9585,7 @@ index f400cfabc9..638501fcdc 100644
  AT_SETUP([conntrack - multiple bridges])
  CHECK_CONNTRACK()
  OVS_TRAFFIC_VSWITCHD_START(
-@@ -3305,6 +3427,46 @@ NS_CHECK_EXEC([at_ns0], [ping6 -s 3200 -q -c 3 -i 0.3 -w 2 fc00::2 | FORMAT_PING
+@@ -3305,6 +3474,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
  
@@ -9574,7 +9632,7 @@ index f400cfabc9..638501fcdc 100644
  AT_SETUP([conntrack - resubmit to ct multiple times])
  CHECK_CONNTRACK()
  
-@@ -3464,15 +3626,15 @@ action=normal
+@@ -3464,15 +3673,15 @@ action=normal
  
  AT_CHECK([ovs-ofctl --bundle add-flows br0 flows.txt])
  
@@ -9593,7 +9651,7 @@ index f400cfabc9..638501fcdc 100644
  "1616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161616161610a, actions=ct(table=1)"])
  
  AT_CHECK([ovs-appctl dpctl/dump-flows | head -2 | tail -1 | grep -q -e ["]udp[(]src=5001["]])
-@@ -5817,7 +5979,7 @@ on_exit 'ovs-appctl revalidator/purge'
+@@ -5817,7 +6026,7 @@ on_exit 'ovs-appctl revalidator/purge'
  on_exit 'ovs-appctl dpif/dump-flows br0'
  
  dnl Should work with the virtual IP address through NAT
@@ -10376,7 +10434,7 @@ index 59723e63b8..c7665a1aeb 100644
  
  AT_CHECK([ovs-vsctl del-port int-br t3 \
 diff --git a/tests/tunnel-push-pop.at b/tests/tunnel-push-pop.at
-index 48c5de9d19..61d30d05bc 100644
+index 48c5de9d19..a441de3ef2 100644
 --- a/tests/tunnel-push-pop.at
 +++ b/tests/tunnel-push-pop.at
 @@ -499,6 +499,28 @@ AT_CHECK([ovs-ofctl dump-ports int-br | grep 'port  [[37]]' | sort], [0], [dnl
@@ -10519,6 +10577,61 @@ index 48c5de9d19..61d30d05bc 100644
  AT_SETUP([tunnel_push_pop - underlay bridge match])
  
  OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=dummy ofport_request=1 other-config:hwaddr=aa:55:aa:55:00:00])
+@@ -645,3 +760,54 @@ NXST_FLOW reply:
+ 
+ OVS_VSWITCHD_STOP
+ AT_CLEANUP
++
++AT_SETUP([tunnel_push_pop - VXLAN access port])
++
++dnl Create bridge that has a MAC address.
++OVS_VSWITCHD_START([set bridge br0 datapath_type=dummy dnl
++                    -- set Interface br0 other-config:hwaddr=aa:55:aa:55:00:00])
++AT_CHECK([ovs-vsctl add-port br0 p8 dnl
++                    -- set Interface p8 type=dummy ofport_request=8])
++
++dnl Create another bridge.
++AT_CHECK([ovs-vsctl add-br ovs-tun0 -- set bridge ovs-tun0 datapath_type=dummy])
++
++dnl Add VXLAN port to this bridge.
++AT_CHECK([ovs-vsctl add-port ovs-tun0 tun0 dnl
++            -- set int tun0 type=vxlan options:remote_ip=10.0.0.11 dnl
++            -- add-port ovs-tun0 p7 dnl
++            -- set interface p7 type=dummy ofport_request=7])
++
++dnl Set VLAN tags, so that br0 and its port p8 have the same tag,
++dnl but ovs-tun0's port p7 has a different tag.
++AT_CHECK([ovs-vsctl set port p8  tag=42 dnl
++                 -- set port br0 tag=42 dnl
++                 -- set port p7  tag=200])
++
++dnl Set IP address and route for br0.
++AT_CHECK([ovs-appctl netdev-dummy/ip4addr br0 10.0.0.2/24], [0], [OK
++])
++AT_CHECK([ovs-appctl ovs/route/add 10.0.0.11/24 br0], [0], [OK
++])
++
++dnl Send an ARP reply to port b8 on br0, so that packets will be forwarded
++dnl to learned port.
++AT_CHECK([ovs-ofctl add-flow br0 action=normal])
++
++AT_CHECK([ovs-appctl netdev-dummy/receive p8 'in_port(8),dnl
++   eth(src=aa:55:aa:66:00:00,dst=ff:ff:ff:ff:ff:ff),eth_type(0x0806),dnl
++   arp(sip=10.0.0.11,tip=10.0.0.2,op=2,sha=aa:55:aa:66:00:00,tha=00:00:00:00:00:00)'])
++
++AT_CHECK([ovs-appctl ofproto/trace ovs-tun0 in_port=p7], [0], [stdout])
++AT_CHECK([tail -2 stdout], [0], [dnl
++Megaflow: recirc_id=0,eth,in_port=7,dl_src=00:00:00:00:00:00,dnl
++dl_dst=00:00:00:00:00:00,dl_type=0x0000
++Datapath actions: push_vlan(vid=200,pcp=0),1,clone(tnl_push(tnl_port(4789),dnl
++header(size=50,type=4,eth(dst=aa:55:aa:66:00:00,src=aa:55:aa:55:00:00,dnl
++dl_type=0x0800),ipv4(src=10.0.0.2,dst=10.0.0.11,proto=17,tos=0,ttl=64,dnl
++frag=0x4000),udp(src=0,dst=4789,csum=0x0),vxlan(flags=0x8000000,vni=0x0)),dnl
++out_port(100)),8)
++])
++
++OVS_VSWITCHD_STOP
++AT_CLEANUP
 diff --git a/tests/tunnel.at b/tests/tunnel.at
 index b8ae7caa9b..fd482aa872 100644
 --- a/tests/tunnel.at
diff --git a/SPECS/openvswitch2.16.spec b/SPECS/openvswitch2.16.spec
index cefca28..bc763ac 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: 71%{?dist}
+Release: 72%{?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
+* Wed Apr 27 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-72
+- Merging upstream branch-2.16 [RH git: 1c2e3ff275]
+    Commit list:
+    a51dd4685d ofproto-dpif-xlate: Clear out vlan flow fields while processing native tunnel. (#393566
+    2060552)
+
+
 * Tue Apr 26 2022 Open vSwitch CI <ovs-ci@redhat.com> - 2.16.0-71
 - Merging upstream branch-2.16 [RH git: a0490a292c]
     Commit list: