diff --git a/pipelines/fabric/src/main/resources/include/action.p4 b/pipelines/fabric/src/main/resources/include/action.p4
deleted file mode 100644
index dc7b99e..0000000
--- a/pipelines/fabric/src/main/resources/include/action.p4
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 2017-present Open Networking Foundation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __ACTION__
-#define __ACTION__
-#include "header.p4"
-action nop() {
-}
-
-action drop_now() {
-    mark_to_drop();
-    exit;
-}
-#endif
diff --git a/pipelines/fabric/src/main/resources/include/control/acl.p4 b/pipelines/fabric/src/main/resources/include/control/acl.p4
new file mode 100644
index 0000000..9eece9a
--- /dev/null
+++ b/pipelines/fabric/src/main/resources/include/control/acl.p4
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017-present Open Networking Foundation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <core.p4>
+#include <v1model.p4>
+
+#include "../define.p4"
+#include "../header.p4"
+
+control Acl (inout parsed_headers_t hdr,
+             inout fabric_metadata_t fabric_metadata,
+             inout standard_metadata_t standard_metadata) {
+
+    /*
+     * ACL Table.
+     */
+    direct_counter(CounterType.packets_and_bytes) acl_counter;
+
+    action set_next_id_acl(next_id_t next_id) {
+        fabric_metadata.next_id = next_id;
+        acl_counter.count();
+    }
+
+    // Send immendiatelly to CPU - skip the rest of ingress.
+    action punt_to_cpu() {
+        standard_metadata.egress_spec = CPU_PORT;
+        fabric_metadata.skip_next = _TRUE;
+        acl_counter.count();
+    }
+
+    action clone_to_cpu() {
+        // FIXME: works only if pkt will be replicated via PRE multicast group.
+        fabric_metadata.clone_to_cpu = _TRUE;
+        acl_counter.count();
+    }
+
+    action drop() {
+        mark_to_drop();
+        fabric_metadata.skip_next = _TRUE;
+        acl_counter.count();
+    }
+
+    action nop_acl() {
+        acl_counter.count();
+    }
+
+    table acl {
+        key = {
+            standard_metadata.ingress_port: ternary @name("ig_port"); // 9
+            fabric_metadata.ip_proto: ternary @name("ip_proto"); // 8
+            fabric_metadata.l4_sport: ternary @name("l4_sport"); // 16
+            fabric_metadata.l4_dport: ternary @name("l4_dport"); // 16
+            hdr.ethernet.dst_addr: ternary @name("eth_src"); // 48
+            hdr.ethernet.src_addr: ternary @name("eth_dst"); // 48
+            hdr.vlan_tag.vlan_id: ternary @name("vlan_id"); // 12
+            fabric_metadata.eth_type: ternary @name("eth_type"); //16
+            hdr.ipv4.src_addr: ternary @name("ipv4_src"); // 32
+            hdr.ipv4.dst_addr: ternary @name("ipv4_dst"); // 32
+            hdr.icmp.icmp_type: ternary @name("icmp_type"); // 8
+            hdr.icmp.icmp_code: ternary @name("icmp_code"); // 8
+        }
+
+        actions = {
+            set_next_id_acl;
+            punt_to_cpu;
+            clone_to_cpu;
+            drop;
+            nop_acl;
+        }
+
+        const default_action = nop_acl();
+        size = 128;
+        counters = acl_counter;
+    }
+
+    apply {
+        acl.apply();
+    }
+}
diff --git a/pipelines/fabric/src/main/resources/include/control/filtering.p4 b/pipelines/fabric/src/main/resources/include/control/filtering.p4
index 3c5bfcb..638d9a1 100644
--- a/pipelines/fabric/src/main/resources/include/control/filtering.p4
+++ b/pipelines/fabric/src/main/resources/include/control/filtering.p4
@@ -18,80 +18,63 @@
 #include <v1model.p4>
 
 #include "../header.p4"
-#include "../action.p4"
 
-control Filtering (
-    inout parsed_headers_t hdr,
-    inout fabric_metadata_t fabric_metadata,
-    inout standard_metadata_t standard_metadata) {
+control Filtering (inout parsed_headers_t hdr,
+                   inout fabric_metadata_t fabric_metadata,
+                   inout standard_metadata_t standard_metadata) {
 
     /*
      * Ingress Port VLAN Table.
-     * Process packets for different interfaces (Port number + VLAN).
-     * For example, an untagged packet will be tagged when it entered to an
-     * interface with untagged VLAN configuration.
+     *
+     * Filter packets based on ingress port and VLAN tag.
      */
     direct_counter(CounterType.packets_and_bytes) ingress_port_vlan_counter;
 
-    action drop() {
-        mark_to_drop();
+    action deny() {
+        // Packet from unconfigured port. Skip forwarding and next block.
+        // Do ACL table in case we want to punt to cpu.
+        fabric_metadata.skip_forwarding = _TRUE;
+        fabric_metadata.skip_next = _TRUE;
         ingress_port_vlan_counter.count();
     }
 
-    action set_vlan(vlan_id_t new_vlan_id) {
-        hdr.vlan_tag.vlan_id = new_vlan_id;
+    action permit() {
+        // Allow packet as is.
         ingress_port_vlan_counter.count();
     }
 
-    action push_internal_vlan(vlan_id_t new_vlan_id) {
-        // Add internal VLAN header, will be removed before packet emission.
-        // cfi and pri values are dummy.
-        hdr.vlan_tag.setValid();
-        hdr.vlan_tag.cfi = 0;
-        hdr.vlan_tag.pri = 0;
-        hdr.vlan_tag.ether_type = hdr.ethernet.ether_type;
-        hdr.ethernet.ether_type = ETHERTYPE_VLAN;
-        hdr.vlan_tag.vlan_id = new_vlan_id;
-
-        // pop internal vlan before packet in
-        fabric_metadata.pop_vlan_when_packet_in = _TRUE;
-        ingress_port_vlan_counter.count();
-    }
-
-    action nop_ingress_port_vlan() {
-        nop();
+    action permit_with_internal_vlan(vlan_id_t vlan_id) {
+        fabric_metadata.vlan_id = vlan_id;
         ingress_port_vlan_counter.count();
     }
 
     table ingress_port_vlan {
         key = {
-            standard_metadata.ingress_port: exact;
-            hdr.vlan_tag.isValid(): exact @name("hdr.vlan_tag.is_valid");
-            hdr.vlan_tag.vlan_id: ternary;
+            standard_metadata.ingress_port: exact @name("ig_port");
+            hdr.vlan_tag.isValid(): exact @name("vlan_is_valid");
+            hdr.vlan_tag.vlan_id: ternary @name("vlan_id");
         }
-
         actions = {
-            push_internal_vlan;
-            set_vlan;
-            drop;
-            nop_ingress_port_vlan();
+            deny();
+            permit();
+            permit_with_internal_vlan();
         }
-
-        const default_action = push_internal_vlan(DEFAULT_VLAN_ID);
+        const default_action = deny();
         counters = ingress_port_vlan_counter;
     }
 
     /*
      * Forwarding Classifier.
-     * Setup Forwarding Type metadata for Forwarding control block.
+     *
+     * Set which type of forwarding behavior to execute in the next control block.
      * There are six types of tables in Forwarding control block:
      * - Bridging: default forwarding type
      * - MPLS: destination mac address is the router mac and ethernet type is
-     *         MPLS(0x8847)
+     *   MPLS(0x8847)
      * - IP Multicast: destination mac address is multicast address and ethernet
-     *                 type is IP(0x0800 or 0x86dd)
+     *   type is IP(0x0800 or 0x86dd)
      * - IP Unicast: destination mac address is router mac and ethernet type is
-     *               IP(0x0800 or 0x86dd)
+     *   IP(0x0800 or 0x86dd)
      */
     direct_counter(CounterType.packets_and_bytes) fwd_classifier_counter;
 
@@ -102,26 +85,35 @@
 
     table fwd_classifier {
         key = {
-            standard_metadata.ingress_port: exact;
-            hdr.ethernet.dst_addr: ternary;
-            hdr.vlan_tag.ether_type: exact;
+            standard_metadata.ingress_port: exact @name("ig_port");
+            hdr.ethernet.dst_addr: ternary @name("eth_dst");
+            fabric_metadata.eth_type: exact @name("eth_type");
         }
-
         actions = {
             set_forwarding_type;
         }
-
         const default_action = set_forwarding_type(FWD_BRIDGING);
         counters = fwd_classifier_counter;
     }
 
     apply {
-        if (ingress_port_vlan.apply().hit) {
-            fwd_classifier.apply();
-        } else {
-            // Packet from unconfigured port. Skip forwarding processing,
-            // except for ACL table in case we want to punt to cpu.
-            fabric_metadata.fwd_type = FWD_UNKNOWN;
+        // Initialize lookup metadata. Packets without a VLAN header will be
+        // treated as belonging to a default VLAN ID (see parser).
+        if (hdr.vlan_tag.isValid()) {
+            fabric_metadata.eth_type = hdr.vlan_tag.eth_type;
+            fabric_metadata.vlan_id = hdr.vlan_tag.vlan_id;
+            fabric_metadata.vlan_pri = hdr.vlan_tag.pri;
+            fabric_metadata.vlan_cfi = hdr.vlan_tag.cfi;
         }
+        if (!hdr.mpls.isValid()) {
+            // Packets with a valid MPLS header will have
+            // fabric_metadata.mpls_ttl set to the packet's MPLS ttl value (see
+            // parser). In any case, if we are forwarding via MPLS, ttl will be
+            // decremented in egress.
+            fabric_metadata.mpls_ttl = DEFAULT_MPLS_TTL + 1;
+        }
+
+        ingress_port_vlan.apply();
+        fwd_classifier.apply();
     }
 }
diff --git a/pipelines/fabric/src/main/resources/include/control/forwarding.p4 b/pipelines/fabric/src/main/resources/include/control/forwarding.p4
index 7c69092..e5f89cb 100644
--- a/pipelines/fabric/src/main/resources/include/control/forwarding.p4
+++ b/pipelines/fabric/src/main/resources/include/control/forwarding.p4
@@ -19,68 +19,70 @@
 
 #include "../define.p4"
 #include "../header.p4"
-#include "../action.p4"
 
 
-control Forwarding (
-    inout parsed_headers_t hdr,
-    inout fabric_metadata_t fabric_metadata,
-    inout standard_metadata_t standard_metadata) {
+control Forwarding (inout parsed_headers_t hdr,
+                    inout fabric_metadata_t fabric_metadata,
+                    inout standard_metadata_t standard_metadata) {
+
+    @hidden
+    action set_next_id(next_id_t next_id) {
+        fabric_metadata.next_id = next_id;
+    }
 
     /*
      * Bridging Table.
-     * Matches destination mac address and VLAN Id and make egress decision.
      */
     direct_counter(CounterType.packets_and_bytes) bridging_counter;
 
     action set_next_id_bridging(next_id_t next_id) {
-        fabric_metadata.next_id = next_id;
+        set_next_id(next_id);
         bridging_counter.count();
     }
 
     table bridging {
         key = {
-            hdr.vlan_tag.vlan_id: exact;
-            hdr.ethernet.dst_addr: ternary;
+            fabric_metadata.vlan_id: exact @name("vlan_id");
+            hdr.ethernet.dst_addr: ternary @name("eth_dst");
         }
-
         actions = {
             set_next_id_bridging;
+            @defaultonly nop;
         }
+        const default_action = nop();
         counters = bridging_counter;
     }
 
     /*
      * MPLS Table.
-     * Matches MPLS label and make egress decision.
      */
     direct_counter(CounterType.packets_and_bytes) mpls_counter;
 
     action pop_mpls_and_next(next_id_t next_id) {
-        hdr.mpls.setInvalid();
-        fabric_metadata.next_id = next_id;
+        fabric_metadata.mpls_label = 0;
+        set_next_id(next_id);
         mpls_counter.count();
     }
 
     table mpls {
         key = {
-            hdr.mpls.label: exact;
+            fabric_metadata.mpls_label: exact @name("mpls_label");
         }
-
         actions = {
             pop_mpls_and_next;
+            @defaultonly nop;
         }
+        const default_action = nop();
         counters = mpls_counter;
     }
 
     /*
      * IPv4 Routing Table.
-     * Matches IPv4 prefix and make egress decision.
      */
     direct_counter(CounterType.packets_and_bytes) routing_v4_counter;
 
     action set_next_id_routing_v4(next_id_t next_id) {
-        fabric_metadata.next_id = next_id;
+        set_next_id(next_id);
         routing_v4_counter.count();
     }
 
@@ -90,115 +92,47 @@
 
     table routing_v4 {
         key = {
-            hdr.ipv4.dst_addr: lpm;
+            hdr.ipv4.dst_addr: lpm @name("ipv4_dst");
         }
-
         actions = {
             set_next_id_routing_v4;
             nop_routing_v4;
+            @defaultonly nop;
         }
+        const default_action = nop();
         counters = routing_v4_counter;
     }
 
-    /*
-     * ACL Table.
-     * Make final egress decision based on general metch fields.
-     */
-    direct_counter(CounterType.packets_and_bytes) acl_counter;
-
-    action set_next_id_acl(next_id_t next_id) {
-        fabric_metadata.next_id = next_id;
-        acl_counter.count();
-    }
-
-    // Send immendiatelly to CPU - skip the rest of pipeline.
-    action punt_to_cpu() {
-        standard_metadata.egress_spec = CPU_PORT;
-        acl_counter.count();
-        exit;
-    }
-
-    action clone_to_cpu() {
-        // FIXME: works only if pkt will be replicated via PRE multicast group.
-        fabric_metadata.clone_to_cpu = _TRUE;
-        acl_counter.count();
-    }
-
-    action drop() {
-        mark_to_drop();
-        acl_counter.count();
-    }
-
-    action nop_acl() {
-        acl_counter.count();
-    }
-
-    table acl {
-        key = {
-            standard_metadata.ingress_port: ternary; // 9
-            fabric_metadata.ip_proto: ternary; // 8
-            fabric_metadata.l4_src_port: ternary; // 16
-            fabric_metadata.l4_dst_port: ternary; // 16
-
-            hdr.ethernet.dst_addr: ternary; // 48
-            hdr.ethernet.src_addr: ternary; // 48
-            hdr.vlan_tag.vlan_id: ternary; // 12
-            hdr.vlan_tag.ether_type: ternary; //16
-            hdr.ipv4.src_addr: ternary; // 32
-            hdr.ipv4.dst_addr: ternary; // 32
-            hdr.icmp.icmp_type: ternary; // 8
-            hdr.icmp.icmp_code: ternary; // 8
-        }
-
-        actions = {
-            set_next_id_acl;
-            punt_to_cpu;
-            clone_to_cpu;
-            drop;
-            nop_acl;
-        }
-
-        const default_action = nop_acl();
-        size = 128;
-        counters = acl_counter;
-    }
-
 #ifdef WITH_IPV6
     /*
      * IPv6 Routing Table.
-     * Matches IPv6 prefix and make egress decision.
      */
     direct_counter(CounterType.packets_and_bytes) routing_v6_counter;
 
     action set_next_id_routing_v6(next_id_t next_id) {
-        fabric_metadata.next_id = next_id;
+        set_next_id(next_id);
         routing_v6_counter.count();
     }
 
     table routing_v6 {
         key = {
-            hdr.ipv6.dst_addr: lpm;
+            hdr.ipv6.dst_addr: lpm @name("ipv6_dst");
         }
-
         actions = {
             set_next_id_routing_v6;
+            @defaultonly nop;
         }
+        const default_action = nop();
         counters = routing_v6_counter;
     }
 #endif // WITH_IPV6
 
     apply {
-        if(fabric_metadata.fwd_type == FWD_BRIDGING) bridging.apply();
-        else if (fabric_metadata.fwd_type == FWD_MPLS) {
-            mpls.apply();
-
-            // TODO: IPv6
-            hdr.vlan_tag.ether_type = ETHERTYPE_IPV4;
-        }
+        if (fabric_metadata.fwd_type == FWD_BRIDGING) bridging.apply();
+        else if (fabric_metadata.fwd_type == FWD_MPLS) mpls.apply();
         else if (fabric_metadata.fwd_type == FWD_IPV4_UNICAST) routing_v4.apply();
 #ifdef WITH_IPV6
         else if (fabric_metadata.fwd_type == FWD_IPV6_UNICAST) routing_v6.apply();
 #endif // WITH_IPV6
-        acl.apply();
     }
 }
diff --git a/pipelines/fabric/src/main/resources/include/control/next.p4 b/pipelines/fabric/src/main/resources/include/control/next.p4
index 69e622b..98b3812 100644
--- a/pipelines/fabric/src/main/resources/include/control/next.p4
+++ b/pipelines/fabric/src/main/resources/include/control/next.p4
@@ -18,63 +18,104 @@
 #include <v1model.p4>
 
 #include "../header.p4"
-#include "../action.p4"
 
-control Next (
-    inout parsed_headers_t hdr,
-    inout fabric_metadata_t fabric_metadata,
-    inout standard_metadata_t standard_metadata) {
+control Next (inout parsed_headers_t hdr,
+              inout fabric_metadata_t fabric_metadata,
+              inout standard_metadata_t standard_metadata) {
 
     /*
      * General actions.
      */
-    action pop_vlan() {
-        hdr.ethernet.ether_type = hdr.vlan_tag.ether_type;
-        hdr.vlan_tag.setInvalid();
+    @hidden
+    action output(port_num_t port_num) {
+     standard_metadata.egress_spec = port_num;
     }
 
+    @hidden
     action rewrite_smac(mac_addr_t smac) {
         hdr.ethernet.src_addr = smac;
     }
 
+    @hidden
     action rewrite_dmac(mac_addr_t dmac) {
         hdr.ethernet.dst_addr = dmac;
     }
 
-    action push_mpls (mpls_label_t label, bit<3> tc) {
-        // Suppose that the maximum number of label is one.
-        hdr.mpls.setValid();
-        hdr.vlan_tag.ether_type = ETHERTYPE_MPLS;
-        hdr.mpls.label = label;
-        hdr.mpls.tc = tc;
-        hdr.mpls.bos = 1w1; // BOS = TRUE
-        hdr.mpls.ttl = DEFAULT_MPLS_TTL;
+    @hidden
+    action set_mpls_label(mpls_label_t label) {
+        fabric_metadata.mpls_label = label;
+    }
+
+    @hidden
+    action routing(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac) {
+        rewrite_smac(smac);
+        rewrite_dmac(dmac);
+        output(port_num);
+    }
+
+    @hidden
+    action mpls_routing(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
+                        mpls_label_t label) {
+        set_mpls_label(label);
+        routing(port_num, smac, dmac);
     }
 
     /*
-     * VLAN Metadata Table.
-     * Modify VLAN Id according to metadata from NextObjective(next id).
+     * Next VLAN table.
+     * Modify VLAN ID based on next ID.
      */
-    direct_counter(CounterType.packets_and_bytes) vlan_meta_counter;
+    direct_counter(CounterType.packets_and_bytes) next_vlan_counter;
 
-    action set_vlan(vlan_id_t new_vlan_id) {
-        hdr.vlan_tag.vlan_id = new_vlan_id;
-        vlan_meta_counter.count();
+    action set_vlan(vlan_id_t vlan_id) {
+        fabric_metadata.vlan_id = vlan_id;
+        next_vlan_counter.count();
     }
 
-    table vlan_meta {
+    table next_vlan {
         key = {
-            fabric_metadata.next_id: exact;
+            fabric_metadata.next_id: exact @name("next_id");
         }
-
         actions = {
             set_vlan;
             @defaultonly nop;
         }
-        default_action = nop;
-        counters = vlan_meta_counter;
+        const default_action = nop();
+        counters = next_vlan_counter;
     }
 
+#ifdef WITH_XCONNECT
+    /*
+     * Cross-connect table.
+     * Bidirectional forwarding for the same next id.
+     */
+    direct_counter(CounterType.packets_and_bytes) xconnect_counter;
+
+    action output_xconnect(port_num_t port_num) {
+        output(port_num);
+        xconnect_counter.count();
+    }
+
+    action set_next_id_xconnect(next_id_t next_id) {
+        fabric_metadata.next_id = next_id;
+        xconnect_counter.count();
+    }
+
+    table xconnect {
+        key = {
+            standard_metadata.ingress_port: exact @name("ig_port");
+            fabric_metadata.next_id: exact @name("next_id");
+        }
+        actions = {
+            output_xconnect;
+            set_next_id_xconnect;
+            @defaultonly nop;
+        }
+        counters = xconnect_counter;
+        const default_action = nop();
+    }
+#endif // WITH_XCONNECT
+
+#ifdef WITH_SIMPLE_NEXT
     /*
      * Simple Table.
      * Do a single egress action based on next id.
@@ -82,197 +123,212 @@
     direct_counter(CounterType.packets_and_bytes) simple_counter;
 
     action output_simple(port_num_t port_num) {
-        standard_metadata.egress_spec = port_num;
+        output(port_num);
         simple_counter.count();
     }
 
-    action set_vlan_output(vlan_id_t new_vlan_id, port_num_t port_num){
-        hdr.vlan_tag.vlan_id = new_vlan_id;
-        output_simple(port_num);
+    action routing_simple(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac) {
+        routing(port_num, smac, dmac);
+        simple_counter.count();
     }
 
-    action l3_routing_simple(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac) {
-        rewrite_smac(smac);
-        rewrite_dmac(dmac);
-        output_simple(port_num);
-    }
-
-    action mpls_routing_v4_simple(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
-                            mpls_label_t label) {
-        l3_routing_simple(port_num, smac, dmac);
-
-        // TODO: set tc according to diffserv from ipv4
-        push_mpls(label, 3w0);
-    }
-
-    action mpls_routing_v6_simple (port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
-                            mpls_label_t label) {
-        l3_routing_simple(port_num, smac, dmac);
-
-        // TODO: set tc according to traffic_class from ipv4
-        push_mpls(label, 3w0);
-    }
-
-    action l3_routing_vlan(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac, vlan_id_t new_vlan_id) {
-        rewrite_smac(smac);
-        rewrite_dmac(dmac);
-        set_vlan_output(new_vlan_id, port_num);
+    action mpls_routing_simple(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
+                               mpls_label_t label) {
+        mpls_routing(port_num, smac, dmac, label);
+        simple_counter.count();
     }
 
     table simple {
         key = {
-            fabric_metadata.next_id: exact;
+            fabric_metadata.next_id: exact @name("next_id");
         }
-
         actions = {
             output_simple;
-            set_vlan_output;
-            l3_routing_simple;
-            mpls_routing_v4_simple;
-            mpls_routing_v6_simple;
-            l3_routing_vlan;
+            routing_simple;
+            mpls_routing_simple;
+            @defaultonly nop;
         }
+        const default_action = nop();
         counters = simple_counter;
     }
+#endif // WITH_SIMPLE_NEXT
 
+#ifdef WITH_HASHED_NEXT
     /*
      * Hashed table.
-     * Execute an action profile group based on next id.
-     * One action profile group may contains multple egress decision.
-     * The execution picks one action profile group memebr by using 5-tuple
-     * hashing.
+     * Execute an action profile selector based on next id.
      */
-    action_selector(HashAlgorithm.crc16, 32w64, 32w16) ecmp_selector;
+    action_selector(HashAlgorithm.crc16, 32w64, 32w16) hashed_selector;
     direct_counter(CounterType.packets_and_bytes) hashed_counter;
 
     action output_hashed(port_num_t port_num) {
-        standard_metadata.egress_spec = port_num;
+        output(port_num);
         hashed_counter.count();
     }
 
-    action l3_routing_hashed(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac) {
-        rewrite_smac(smac);
-        rewrite_dmac(dmac);
-        output_hashed(port_num);
+    action routing_hashed(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac) {
+        routing(port_num, smac, dmac);
+        hashed_counter.count();
     }
 
-    action mpls_routing_v4_hashed (port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
-                            mpls_label_t label) {
-        l3_routing_hashed(port_num, smac, dmac);
-
-        // TODO: set tc according to diffserv from ipv4
-        push_mpls(label, 3w0);
-    }
-
-    action mpls_routing_v6_hashed (port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
-                            mpls_label_t label) {
-        l3_routing_hashed(port_num, smac, dmac);
-
-        // TODO: set tc according to traffic_class from ipv4
-        push_mpls(label, 3w0);
+    action mpls_routing_hashed(port_num_t port_num, mac_addr_t smac, mac_addr_t dmac,
+                               mpls_label_t label) {
+        mpls_routing(port_num, smac, dmac, label);
+        hashed_counter.count();
     }
 
     table hashed {
         key = {
-            fabric_metadata.next_id: exact;
+            fabric_metadata.next_id: exact @name("next_id");
             hdr.ipv4.dst_addr: selector;
             hdr.ipv4.src_addr: selector;
             fabric_metadata.ip_proto: selector;
-            fabric_metadata.l4_src_port: selector;
-            fabric_metadata.l4_dst_port: selector;
+            fabric_metadata.l4_sport: selector;
+            fabric_metadata.l4_dport: selector;
         }
-
         actions = {
-            l3_routing_hashed;
-            mpls_routing_v4_hashed;
-            mpls_routing_v6_hashed;
+            output_hashed;
+            routing_hashed;
+            mpls_routing_hashed;
+            @defaultonly nop;
         }
-
-        implementation = ecmp_selector;
+        implementation = hashed_selector;
         counters = hashed_counter;
+        const default_action = nop();
     }
+#endif // WITH_HASHED_NEXT
 
     /*
-     * Multicast Table.
-     * Setup multicast group id for packet replication engine (PRE).
+     * Multicast
+     * Maps next IDs to PRE multicat group IDs.
      */
     direct_counter(CounterType.packets_and_bytes) multicast_counter;
 
-    action set_mcast_group(group_id_t gid) {
-        standard_metadata.mcast_grp = gid;
+    action set_mcast_group_id(mcast_group_id_t group_id) {
+        standard_metadata.mcast_grp = group_id;
         fabric_metadata.is_multicast = _TRUE;
         multicast_counter.count();
     }
 
     table multicast {
         key = {
-            fabric_metadata.next_id: exact;
+            fabric_metadata.next_id: exact @name("next_id");
         }
         actions = {
-            set_mcast_group;
+            set_mcast_group_id;
+            @defaultonly nop;
         }
         counters = multicast_counter;
+        const default_action = nop();
     }
 
     apply {
-        vlan_meta.apply();
-        if (!simple.apply().hit) {
-            if (!hashed.apply().hit) {
-                if (!multicast.apply().hit) {
-                    // Next ID doesn't match any table.
-                    return;
-                }
-            }
-        }
-        // Decrement TTL
-        if (!hdr.mpls.isValid()) {
-            if(hdr.ipv4.isValid()) {
-                hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
-            }
-#ifdef WITH_IPV6
-            else if (hdr.ipv6.isValid()) {
-                hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1;
-            }
-#endif // WITH_IPV6
-        }
+#ifdef WITH_XCONNECT
+        // xconnect might set a new next_id.
+        xconnect.apply();
+#endif // WITH_XCONNECT
+#ifdef WITH_SIMPLE_NEXT
+        simple.apply();
+#endif // WITH_SIMPLE_NEXT
+#ifdef WITH_HASHED_NEXT
+        hashed.apply();
+#endif // WITH_HASHED_NEXT
+        multicast.apply();
+        next_vlan.apply();
     }
 }
 
-control EgressNextControl (
-    inout parsed_headers_t hdr,
-    inout fabric_metadata_t fabric_metadata,
-    inout standard_metadata_t standard_metadata) {
+control EgressNextControl (inout parsed_headers_t hdr,
+                           inout fabric_metadata_t fabric_metadata,
+                           inout standard_metadata_t standard_metadata) {
+    @hidden
+    action pop_mpls_if_present() {
+        hdr.mpls.setInvalid();
+        // Assuming there's an IP header after the MPLS one.
+        fabric_metadata.eth_type = fabric_metadata.ip_eth_type;
+    }
+
+    @hidden
+    action set_mpls() {
+        hdr.mpls.setValid();
+        hdr.mpls.label = fabric_metadata.mpls_label;
+        hdr.mpls.tc = 3w0;
+        hdr.mpls.bos = 1w1; // BOS = TRUE
+        hdr.mpls.ttl = fabric_metadata.mpls_ttl; // Decrement after push.
+        fabric_metadata.eth_type = ETHERTYPE_MPLS;
+    }
+
+    @hidden
+    action push_vlan() {
+        // If VLAN is already valid, we overwrite it with a potentially new VLAN
+        // ID, and same CFI, PRI, and eth_type values found in ingress.
+        hdr.vlan_tag.setValid();
+        hdr.vlan_tag.cfi = fabric_metadata.vlan_cfi;
+        hdr.vlan_tag.pri = fabric_metadata.vlan_pri;
+        hdr.vlan_tag.eth_type = fabric_metadata.eth_type;
+        hdr.vlan_tag.vlan_id = fabric_metadata.vlan_id;
+        hdr.ethernet.eth_type = ETHERTYPE_VLAN;
+    }
 
     /*
      * Egress VLAN Table.
-     * Pops VLAN tag according to interface(Port and VLAN) configuration.
+     * Pops the VLAN tag if the pair egress port and VLAN ID is matched.
      */
     direct_counter(CounterType.packets_and_bytes) egress_vlan_counter;
 
     action pop_vlan() {
-        hdr.ethernet.ether_type = hdr.vlan_tag.ether_type;
+        hdr.ethernet.eth_type = fabric_metadata.eth_type;
         hdr.vlan_tag.setInvalid();
         egress_vlan_counter.count();
     }
 
     table egress_vlan {
         key = {
-            hdr.vlan_tag.vlan_id: exact;
-            standard_metadata.egress_port: exact;
+            fabric_metadata.vlan_id: exact @name("vlan_id");
+            standard_metadata.egress_port: exact @name("eg_port");
         }
         actions = {
             pop_vlan;
             @defaultonly nop;
         }
-        default_action = nop;
+        const default_action = nop();
         counters = egress_vlan_counter;
     }
 
     apply {
         if (fabric_metadata.is_multicast == _TRUE
              && standard_metadata.ingress_port == standard_metadata.egress_port) {
-            drop_now();
+            mark_to_drop();
         }
-        egress_vlan.apply();
+
+        if (fabric_metadata.mpls_label == 0) {
+            if (hdr.mpls.isValid()) pop_mpls_if_present();
+        } else {
+            set_mpls();
+        }
+
+        if (!egress_vlan.apply().hit) {
+            // Push VLAN tag if not the default one.
+            if (fabric_metadata.vlan_id != DEFAULT_VLAN_ID) {
+                push_vlan();
+            }
+        }
+
+        // TTL decrement and check.
+        if (hdr.mpls.isValid()) {
+            hdr.mpls.ttl = hdr.mpls.ttl - 1;
+            if (hdr.mpls.ttl == 0) mark_to_drop();
+        } else {
+            if(hdr.ipv4.isValid()) {
+                hdr.ipv4.ttl = hdr.ipv4.ttl - 1;
+                if (hdr.ipv4.ttl == 0) mark_to_drop();
+            }
+#ifdef WITH_IPV6
+            else if (hdr.ipv6.isValid()) {
+                hdr.ipv6.hop_limit = hdr.ipv6.hop_limit - 1;
+                if (hdr.ipv6.hop_limit == 0) mark_to_drop();
+            }
+#endif // WITH_IPV6
+        }
     }
 }
diff --git a/pipelines/fabric/src/main/resources/include/control/packetio.p4 b/pipelines/fabric/src/main/resources/include/control/packetio.p4
index a77d82a..a29c044 100644
--- a/pipelines/fabric/src/main/resources/include/control/packetio.p4
+++ b/pipelines/fabric/src/main/resources/include/control/packetio.p4
@@ -15,12 +15,11 @@
  */
 
 #include "../header.p4"
-#include "../action.p4"
 
-control PacketIoIngress(
-inout parsed_headers_t hdr,
-inout fabric_metadata_t fabric_metadata,
-inout standard_metadata_t standard_metadata) {
+control PacketIoIngress(inout parsed_headers_t hdr,
+                        inout fabric_metadata_t fabric_metadata,
+                        inout standard_metadata_t standard_metadata) {
+
     apply {
         if (hdr.packet_out.isValid()) {
             standard_metadata.egress_spec = hdr.packet_out.egress_port;
@@ -32,27 +31,20 @@
     }
 }
 
-control PacketIoEgress(
-        inout parsed_headers_t hdr,
-        inout fabric_metadata_t fabric_metadata,
-        inout standard_metadata_t standard_metadata) {
-    action pop_vlan() {
-        hdr.ethernet.ether_type = hdr.vlan_tag.ether_type;
-        hdr.vlan_tag.setInvalid();
-    }
+control PacketIoEgress(inout parsed_headers_t hdr,
+                       inout fabric_metadata_t fabric_metadata,
+                       inout standard_metadata_t standard_metadata) {
+
     apply {
         if (fabric_metadata.is_controller_packet_out == _TRUE) {
             // Transmit right away.
             exit;
         }
         if (standard_metadata.egress_port == CPU_PORT) {
-            if (hdr.vlan_tag.isValid() && fabric_metadata.pop_vlan_when_packet_in == _TRUE) {
-                pop_vlan();
-            }
             if (fabric_metadata.is_multicast == _TRUE &&
                 fabric_metadata.clone_to_cpu == _FALSE) {
                 // Is multicast but clone was not requested.
-                drop_now();
+                mark_to_drop();
             }
             hdr.packet_in.setValid();
             hdr.packet_in.ingress_port = standard_metadata.ingress_port;
diff --git a/pipelines/fabric/src/main/resources/include/control/port_counter.p4 b/pipelines/fabric/src/main/resources/include/control/port_counter.p4
index 3e9ea00..a34a738 100644
--- a/pipelines/fabric/src/main/resources/include/control/port_counter.p4
+++ b/pipelines/fabric/src/main/resources/include/control/port_counter.p4
@@ -19,7 +19,10 @@
 #include "../define.p4"
 #include "../header.p4"
 
-control PortCountersControl(inout parsed_headers_t hdr, inout fabric_metadata_t fabric_metadata, inout standard_metadata_t standard_metadata) {
+control PortCountersControl(inout parsed_headers_t hdr,
+                            inout fabric_metadata_t fabric_metadata,
+                            inout standard_metadata_t standard_metadata) {
+
     counter(MAX_PORTS, CounterType.packets_and_bytes) egress_port_counter;
     counter(MAX_PORTS, CounterType.packets_and_bytes) ingress_port_counter;
 
diff --git a/pipelines/fabric/src/main/resources/include/define.p4 b/pipelines/fabric/src/main/resources/include/define.p4
index dfde323..f7a03c3 100644
--- a/pipelines/fabric/src/main/resources/include/define.p4
+++ b/pipelines/fabric/src/main/resources/include/define.p4
@@ -23,6 +23,14 @@
 #define WITH_INT
 #endif
 
+#ifndef WITHOUT_XCONNECT
+#define WITH_XCONNECT
+#endif
+
+#if ! defined(WITH_SIMPLE_NEXT)
+#define WITH_HASHED_NEXT
+#endif
+
 #ifndef _BOOL
 #define _BOOL bool
 #endif
@@ -78,7 +86,7 @@
 typedef bit<20> mpls_label_t;
 typedef bit<9>  port_num_t;
 typedef bit<48> mac_addr_t;
-typedef bit<16> group_id_t;
+typedef bit<16> mcast_group_id_t;
 typedef bit<12> vlan_id_t;
 typedef bit<32> ipv4_addr_t;
 typedef bit<16> l4_port_t;
@@ -154,4 +162,8 @@
 const bit<8> IPV4_MIN_HEAD_LEN = 20;
 const bit<8> UDP_HEADER_LEN = 8;
 
+action nop() {
+    NoAction();
+}
+
 #endif
diff --git a/pipelines/fabric/src/main/resources/include/header.p4 b/pipelines/fabric/src/main/resources/include/header.p4
index df29408..f57e974 100644
--- a/pipelines/fabric/src/main/resources/include/header.p4
+++ b/pipelines/fabric/src/main/resources/include/header.p4
@@ -36,14 +36,14 @@
 header ethernet_t {
     mac_addr_t dst_addr;
     mac_addr_t src_addr;
-    bit<16> ether_type;
+    bit<16> eth_type;
 }
 
 header vlan_tag_t {
     bit<3> pri;
     bit<1> cfi;
     vlan_id_t vlan_id;
-    bit<16> ether_type;
+    bit<16> eth_type;
 }
 
 header mpls_t {
@@ -80,17 +80,9 @@
     bit<128> dst_addr;
 }
 
-header arp_t {
-    bit<16> hw_type;
-    bit<16> proto_type;
-    bit<8> hw_addr_len;
-    bit<8> proto_addr_len;
-    bit<16> opcode;
-}
-
 header tcp_t {
-    bit<16> src_port;
-    bit<16> dst_port;
+    bit<16> sport;
+    bit<16> dport;
     bit<32> seq_no;
     bit<32> ack_no;
     bit<4>  data_offset;
@@ -103,8 +95,8 @@
 }
 
 header udp_t {
-    bit<16> src_port;
-    bit<16> dst_port;
+    bit<16> sport;
+    bit<16> dport;
     bit<16> len;
     bit<16> checksum;
 }
@@ -139,8 +131,8 @@
     bit<32>           s1u_enb_addr;
     bit<32>           s1u_sgw_addr;
 #ifdef WITH_SPGW_PCC_GATING
-    bit<16>           l4_src_port;
-    bit<16>           l4_dst_port;
+    bit<16>           l4_sport;
+    bit<16>           l4_dport;
     pcc_gate_status_t pcc_gate_status;
     sdf_rule_id_t     sdf_rule_id;
     pcc_rule_id_t     pcc_rule_id;
@@ -150,17 +142,25 @@
 
 //Custom metadata definition
 struct fabric_metadata_t {
-    fwd_type_t fwd_type;
-    next_id_t next_id;
-    _BOOL pop_vlan_when_packet_in;
-    _BOOL is_multicast;
-    _BOOL is_controller_packet_out;
-    _BOOL clone_to_cpu;
-    bit<8> ip_proto;
-    bit<16> l4_src_port;
-    bit<16> l4_dst_port;
+    bit<16>       eth_type;
+    bit<16>       ip_eth_type;
+    vlan_id_t     vlan_id;
+    bit<3>        vlan_pri;
+    bit<1>        vlan_cfi;
+    mpls_label_t  mpls_label;
+    bit<8>        mpls_ttl;
+    _BOOL         skip_forwarding;
+    _BOOL         skip_next;
+    fwd_type_t    fwd_type;
+    next_id_t     next_id;
+    _BOOL         is_multicast;
+    _BOOL         is_controller_packet_out;
+    _BOOL         clone_to_cpu;
+    bit<8>        ip_proto;
+    bit<16>       l4_sport;
+    bit<16>       l4_dport;
 #ifdef WITH_SPGW
-    spgw_meta_t spgw;
+    spgw_meta_t   spgw;
 #endif // WITH_SPGW
 #ifdef WITH_INT
     int_metadata_t int_meta;
@@ -170,6 +170,9 @@
 struct parsed_headers_t {
     ethernet_t ethernet;
     vlan_tag_t vlan_tag;
+#ifdef WITH_XCONNECT
+    vlan_tag_t inner_vlan_tag;
+#endif // WITH_XCONNECT
     mpls_t mpls;
 #ifdef WITH_SPGW
     ipv4_t gtpu_ipv4;
@@ -182,7 +185,6 @@
 #ifdef WITH_IPV6
     ipv6_t ipv6;
 #endif // WITH_IPV6
-    arp_t arp;
     tcp_t tcp;
     udp_t udp;
     icmp_t icmp;
diff --git a/pipelines/fabric/src/main/resources/include/int/int_main.p4 b/pipelines/fabric/src/main/resources/include/int/int_main.p4
index ef81cc9..c1368d8 100644
--- a/pipelines/fabric/src/main/resources/include/int/int_main.p4
+++ b/pipelines/fabric/src/main/resources/include/int/int_main.p4
@@ -45,11 +45,13 @@
 
     table tb_set_source {
         key = {
-            standard_metadata.ingress_port: exact;
+            standard_metadata.ingress_port: exact @name("ig_port");
         }
         actions = {
             int_set_source;
+            @defaultonly nop();
         }
+        const default_action = nop();
         counters = counter_set_source;
         size = MAX_PORTS;
     }
@@ -64,11 +66,13 @@
 
     table tb_set_sink {
         key = {
-            standard_metadata.egress_spec: exact;
+            standard_metadata.egress_spec: exact @name("eg_spec");
         }
         actions = {
             int_set_sink;
+            @defaultonly nop();
         }
+        const default_action = nop();
         counters = counter_set_sink;
         size = MAX_PORTS;
     }
diff --git a/pipelines/fabric/src/main/resources/include/int/int_report.p4 b/pipelines/fabric/src/main/resources/include/int/int_report.p4
index 9326375..8c48ba2 100644
--- a/pipelines/fabric/src/main/resources/include/int/int_report.p4
+++ b/pipelines/fabric/src/main/resources/include/int/int_report.p4
@@ -23,6 +23,7 @@
     inout fabric_metadata_t fabric_metadata,
     inout standard_metadata_t standard_metadata) {
 
+    @hidden
     action add_report_fixed_header() {
         /* Device should include its own INT metadata as embedded,
          * we'll not use fabric_report_header for this purpose.
@@ -49,7 +50,7 @@
         hdr.report_ethernet.setValid();
         hdr.report_ethernet.dst_addr = mon_mac;
         hdr.report_ethernet.src_addr = src_mac;
-        hdr.report_ethernet.ether_type = ETHERTYPE_IPV4;
+        hdr.report_ethernet.eth_type = ETHERTYPE_IPV4;
 
         //Report IPV4 Header
         hdr.report_ipv4.setValid();
@@ -71,8 +72,8 @@
 
         //Report UDP Header
         hdr.report_udp.setValid();
-        hdr.report_udp.src_port = 0;
-        hdr.report_udp.dst_port = mon_port;
+        hdr.report_udp.sport = 0;
+        hdr.report_udp.dport = mon_port;
         hdr.report_udp.len =  (bit<16>) UDP_HEADER_LEN + (bit<16>) REPORT_FIXED_HEADER_LEN +
                                     (bit<16>) ETH_HEADER_LEN + hdr.ipv4.total_len;
 
@@ -87,7 +88,9 @@
         }
         actions = {
             do_report_encapsulation;
+            @defaultonly nop();
         }
+        default_action = nop;
     }
 
     apply {
diff --git a/pipelines/fabric/src/main/resources/include/int/int_sink.p4 b/pipelines/fabric/src/main/resources/include/int/int_sink.p4
index 6c64e32..6531a17 100644
--- a/pipelines/fabric/src/main/resources/include/int/int_sink.p4
+++ b/pipelines/fabric/src/main/resources/include/int/int_sink.p4
@@ -22,11 +22,13 @@
     inout parsed_headers_t hdr,
     inout fabric_metadata_t fabric_metadata) {
 
+    @hidden
     action restore_header () {
-        hdr.udp.dst_port = hdr.intl4_tail.dest_port;
+        hdr.udp.dport = hdr.intl4_tail.dest_port;
         hdr.ipv4.dscp = hdr.intl4_tail.dscp;
     }
 
+    @hidden
     action int_sink() {
         // restore length fields of IPv4 header and UDP header
         bit<16> len_bytes = (bit<16>) (hdr.intl4_shim.len_words << 5w2);
diff --git a/pipelines/fabric/src/main/resources/include/int/int_source.p4 b/pipelines/fabric/src/main/resources/include/int/int_source.p4
index 245fe7e..93288a4 100644
--- a/pipelines/fabric/src/main/resources/include/int/int_source.p4
+++ b/pipelines/fabric/src/main/resources/include/int/int_source.p4
@@ -26,6 +26,7 @@
 
     direct_counter(CounterType.packets_and_bytes) counter_int_source;
 
+    @hidden
     action int_source(bit<8> max_hop, bit<5> ins_cnt, bit<4> ins_mask0003, bit<4> ins_mask0407) {
         // Insert INT shim header.
         hdr.intl4_shim.setValid();
@@ -49,7 +50,7 @@
         // Insert INT tail header.
         hdr.intl4_tail.setValid();
         hdr.intl4_tail.next_proto = hdr.ipv4.protocol;
-        hdr.intl4_tail.dest_port = fabric_metadata.l4_dst_port;
+        hdr.intl4_tail.dest_port = fabric_metadata.l4_dport;
         hdr.intl4_tail.dscp = hdr.ipv4.dscp;
         // Update IP and UDP (if not valid we don't care) lens (in bytes).
         hdr.ipv4.total_len = hdr.ipv4.total_len + INT_HEADER_LEN_BYTES;
@@ -64,15 +65,17 @@
 
     table tb_int_source {
         key = {
-            hdr.ipv4.src_addr: ternary;
-            hdr.ipv4.dst_addr: ternary;
-            fabric_metadata.l4_src_port: ternary;
-            fabric_metadata.l4_dst_port: ternary;
+            hdr.ipv4.src_addr: ternary @name("ipv4_src");
+            hdr.ipv4.dst_addr: ternary @name("ipv4_dst");
+            fabric_metadata.l4_sport: ternary @name("l4_sport");
+            fabric_metadata.l4_dport: ternary @name("l4_dport");
         }
         actions = {
             int_source_dscp;
+            @defaultonly nop();
         }
         counters = counter_int_source;
+        const default_action = nop();
     }
 
     apply {
diff --git a/pipelines/fabric/src/main/resources/include/int/int_transit.p4 b/pipelines/fabric/src/main/resources/include/int/int_transit.p4
index 579fa07..b524f6f 100644
--- a/pipelines/fabric/src/main/resources/include/int/int_transit.p4
+++ b/pipelines/fabric/src/main/resources/include/int/int_transit.p4
@@ -36,22 +36,26 @@
     _INT_METADATA_ACTIONS
 #else
     // Switch ID.
+    @hidden
     action int_set_header_0() {
         hdr.int_switch_id.setValid();
         hdr.int_switch_id.switch_id = fmeta.int_meta.switch_id;
     }
     // Port IDs.
+    @hidden
     action int_set_header_1() {
         hdr.int_port_ids.setValid();
         hdr.int_port_ids.ingress_port_id = (bit<16>) smeta.ingress_port;
         hdr.int_port_ids.egress_port_id = (bit<16>) smeta.egress_port;
     }
     // Hop latency.
+    @hidden
     action int_set_header_2() {
         hdr.int_hop_latency.setValid();
         hdr.int_hop_latency.hop_latency = (bit<32>) smeta.deq_timedelta;
     }
     // Queue occupancy.
+    @hidden
     action int_set_header_3() {
         hdr.int_q_occupancy.setValid();
         // TODO: support queues in BMv2. ATM we assume only one.
@@ -59,16 +63,19 @@
         hdr.int_q_occupancy.q_occupancy = (bit<24>) smeta.deq_qdepth;
     }
     // Ingress timestamp.
+    @hidden
     action int_set_header_4() {
         hdr.int_ingress_tstamp.setValid();
         hdr.int_ingress_tstamp.ingress_tstamp = (bit<32>) smeta.enq_timestamp;
     }
     // Egress timestamp.
+    @hidden
     action int_set_header_5() {
         hdr.int_egress_tstamp.setValid();
         hdr.int_egress_tstamp.egress_tstamp = (bit<32>) smeta.enq_timestamp + (bit<32>) smeta.deq_timedelta;
     }
     // Queue congestion.
+    @hidden
     action int_set_header_6() {
         hdr.int_q_congestion.setValid();
         // TODO: support queue congestion.
@@ -76,6 +83,7 @@
         hdr.int_q_congestion.q_congestion = 24w0;
     }
     // Egress port utilization.
+    @hidden
     action int_set_header_7() {
         hdr.int_egress_tx_util.setValid();
         // TODO: implement tx utilization support in BMv2.
@@ -84,21 +92,25 @@
 #endif // _INT_METADATA_ACTIONS
 
     // Actions to keep track of the new metadata added.
+    @hidden
     action add_1() {
         fmeta.int_meta.new_words = fmeta.int_meta.new_words + 1;
         fmeta.int_meta.new_bytes = fmeta.int_meta.new_bytes + 4;
     }
 
+    @hidden
     action add_2() {
         fmeta.int_meta.new_words = fmeta.int_meta.new_words + 2;
         fmeta.int_meta.new_bytes = fmeta.int_meta.new_bytes + 8;
     }
 
+    @hidden
     action add_3() {
         fmeta.int_meta.new_words = fmeta.int_meta.new_words + 3;
         fmeta.int_meta.new_bytes = fmeta.int_meta.new_bytes + 12;
     }
 
+    @hidden
     action add_4() {
         fmeta.int_meta.new_words = fmeta.int_meta.new_words + 4;
         fmeta.int_meta.new_bytes = fmeta.int_meta.new_bytes + 16;
@@ -106,78 +118,94 @@
 
     // Action function for bits 0-3 combinations, 0 is msb, 3 is lsb.
     // Each bit set indicates that corresponding INT header should be added.
+    @hidden
     action int_set_header_0003_i0() {
     }
+    @hidden
     action int_set_header_0003_i1() {
         int_set_header_3();
         add_1();
     }
+    @hidden
     action int_set_header_0003_i2() {
         int_set_header_2();
         add_1();
     }
+    @hidden
     action int_set_header_0003_i3() {
         int_set_header_3();
         int_set_header_2();
         add_2();
     }
+    @hidden
     action int_set_header_0003_i4() {
         int_set_header_1();
         add_1();
     }
+    @hidden
     action int_set_header_0003_i5() {
         int_set_header_3();
         int_set_header_1();
         add_2();
     }
+    @hidden
     action int_set_header_0003_i6() {
         int_set_header_2();
         int_set_header_1();
         add_2();
     }
+    @hidden
     action int_set_header_0003_i7() {
         int_set_header_3();
         int_set_header_2();
         int_set_header_1();
         add_3();
     }
+    @hidden
     action int_set_header_0003_i8() {
         int_set_header_0();
         add_1();
     }
+    @hidden
     action int_set_header_0003_i9() {
         int_set_header_3();
         int_set_header_0();
         add_2();
     }
+    @hidden
     action int_set_header_0003_i10() {
         int_set_header_2();
         int_set_header_0();
         add_2();
     }
+    @hidden
     action int_set_header_0003_i11() {
         int_set_header_3();
         int_set_header_2();
         int_set_header_0();
         add_3();
     }
+    @hidden
     action int_set_header_0003_i12() {
         int_set_header_1();
         int_set_header_0();
         add_2();
     }
+    @hidden
     action int_set_header_0003_i13() {
         int_set_header_3();
         int_set_header_1();
         int_set_header_0();
         add_3();
     }
+    @hidden
     action int_set_header_0003_i14() {
         int_set_header_2();
         int_set_header_1();
         int_set_header_0();
         add_3();
     }
+    @hidden
     action int_set_header_0003_i15() {
         int_set_header_3();
         int_set_header_2();
@@ -187,78 +215,94 @@
     }
 
     // Action function for bits 4-7 combinations, 4 is msb, 7 is lsb.
+    @hidden
     action int_set_header_0407_i0() {
     }
+    @hidden
     action int_set_header_0407_i1() {
         int_set_header_7();
         add_1();
     }
+    @hidden
     action int_set_header_0407_i2() {
         int_set_header_6();
         add_1();
     }
+    @hidden
     action int_set_header_0407_i3() {
         int_set_header_7();
         int_set_header_6();
         add_2();
     }
+    @hidden
     action int_set_header_0407_i4() {
         int_set_header_5();
         add_1();
     }
+    @hidden
     action int_set_header_0407_i5() {
         int_set_header_7();
         int_set_header_5();
         add_2();
     }
+    @hidden
     action int_set_header_0407_i6() {
         int_set_header_6();
         int_set_header_5();
         add_2();
     }
+    @hidden
     action int_set_header_0407_i7() {
         int_set_header_7();
         int_set_header_6();
         int_set_header_5();
         add_3();
     }
+    @hidden
     action int_set_header_0407_i8() {
         int_set_header_4();
         add_1();
     }
+    @hidden
     action int_set_header_0407_i9() {
         int_set_header_7();
         int_set_header_4();
         add_2();
     }
+    @hidden
     action int_set_header_0407_i10() {
         int_set_header_6();
         int_set_header_4();
         add_2();
     }
+    @hidden
     action int_set_header_0407_i11() {
         int_set_header_7();
         int_set_header_6();
         int_set_header_4();
         add_3();
     }
+    @hidden
     action int_set_header_0407_i12() {
         int_set_header_5();
         int_set_header_4();
         add_2();
     }
+    @hidden
     action int_set_header_0407_i13() {
         int_set_header_7();
         int_set_header_5();
         int_set_header_4();
         add_3();
     }
+    @hidden
     action int_set_header_0407_i14() {
         int_set_header_6();
         int_set_header_5();
         int_set_header_4();
         add_3();
     }
+    @hidden
     action int_set_header_0407_i15() {
         int_set_header_7();
         int_set_header_6();
@@ -272,17 +316,18 @@
         // We don't really need a key here, however we add a dummy one as a
         // workaround to ONOS inability to properly support default actions.
         key = {
-            hdr.int_header.isValid(): exact @name("hdr.int_header.is_valid");
+            hdr.int_header.isValid(): exact @name("int_is_valid");
         }
         actions = {
             init_metadata;
             @defaultonly nop;
         }
-        const default_action = nop;
+        const default_action = nop();
         size = 1;
     }
 
     // Table to process instruction bits 0-3.
+    @hidden
     table tb_int_inst_0003 {
         key = {
             hdr.int_header.instruction_mask_0003 : exact;
@@ -305,7 +350,6 @@
             int_set_header_0003_i14;
             int_set_header_0003_i15;
         }
-        size = 16;
         const entries = {
             (0x0) : int_set_header_0003_i0();
             (0x1) : int_set_header_0003_i1();
@@ -327,6 +371,7 @@
     }
 
     // Table to process instruction bits 4-7.
+    @hidden
     table tb_int_inst_0407 {
         key = {
             hdr.int_header.instruction_mask_0407 : exact;
@@ -349,7 +394,6 @@
             int_set_header_0407_i14;
             int_set_header_0407_i15;
         }
-        size = 16;
         const entries = {
             (0x0) : int_set_header_0407_i0();
             (0x1) : int_set_header_0407_i1();
diff --git a/pipelines/fabric/src/main/resources/include/parser.p4 b/pipelines/fabric/src/main/resources/include/parser.p4
index 6aef63b..4a2f85c 100644
--- a/pipelines/fabric/src/main/resources/include/parser.p4
+++ b/pipelines/fabric/src/main/resources/include/parser.p4
@@ -19,11 +19,10 @@
 
 #include "define.p4"
 
-parser FabricParser (
-packet_in packet,
-out parsed_headers_t hdr,
-inout fabric_metadata_t fabric_metadata,
-inout standard_metadata_t standard_metadata) {
+parser FabricParser (packet_in packet,
+                     out parsed_headers_t hdr,
+                     inout fabric_metadata_t fabric_metadata,
+                     inout standard_metadata_t standard_metadata) {
 
     bit<6> last_ipv4_dscp = 0;
 
@@ -41,10 +40,11 @@
 
     state parse_ethernet {
         packet.extract(hdr.ethernet);
-        transition select(hdr.ethernet.ether_type){
+        fabric_metadata.eth_type = hdr.ethernet.eth_type;
+        fabric_metadata.vlan_id = DEFAULT_VLAN_ID;
+        transition select(hdr.ethernet.eth_type){
             ETHERTYPE_VLAN: parse_vlan_tag;
             ETHERTYPE_MPLS: parse_mpls;
-            ETHERTYPE_ARP: parse_arp;
             ETHERTYPE_IPV4: parse_ipv4;
 #ifdef WITH_IPV6
             ETHERTYPE_IPV6: parse_ipv6;
@@ -55,8 +55,23 @@
 
     state parse_vlan_tag {
         packet.extract(hdr.vlan_tag);
-        transition select(hdr.vlan_tag.ether_type){
-            ETHERTYPE_ARP: parse_arp;
+        transition select(hdr.vlan_tag.eth_type){
+            ETHERTYPE_IPV4: parse_ipv4;
+#ifdef WITH_IPV6
+            ETHERTYPE_IPV6: parse_ipv6;
+#endif // WITH_IPV6
+            ETHERTYPE_MPLS: parse_mpls;
+#ifdef WITH_XCONNECT
+            ETHERTYPE_VLAN: parse_inner_vlan_tag;
+#endif // WITH_XCONNECT
+            default: accept;
+        }
+    }
+
+#ifdef WITH_XCONNECT
+    state parse_inner_vlan_tag {
+        packet.extract(hdr.inner_vlan_tag);
+        transition select(hdr.inner_vlan_tag.eth_type){
             ETHERTYPE_IPV4: parse_ipv4;
 #ifdef WITH_IPV6
             ETHERTYPE_IPV6: parse_ipv6;
@@ -65,11 +80,14 @@
             default: accept;
         }
     }
+#endif // WITH_XCONNECT
 
     state parse_mpls {
         packet.extract(hdr.mpls);
+        fabric_metadata.mpls_label = hdr.mpls.label;
+        fabric_metadata.mpls_ttl = hdr.mpls.ttl;
         // There is only one MPLS label for this fabric.
-        // Assume header after MPLS header is IP/IPv6
+        // Assume header after MPLS header is IPv4/IPv6
         // Lookup first 4 bits for version
         transition select(packet.lookahead<bit<IP_VER_LENGTH>>()) {
             //The packet should be either IPv4 or IPv6.
@@ -84,6 +102,7 @@
     state parse_ipv4 {
         packet.extract(hdr.ipv4);
         fabric_metadata.ip_proto = hdr.ipv4.protocol;
+        fabric_metadata.ip_eth_type = ETHERTYPE_IPV4;
         last_ipv4_dscp = hdr.ipv4.dscp;
         //Need header verification?
         transition select(hdr.ipv4.protocol) {
@@ -98,6 +117,7 @@
     state parse_ipv6 {
         packet.extract(hdr.ipv6);
         fabric_metadata.ip_proto = hdr.ipv6.next_hdr;
+        fabric_metadata.ip_eth_type = ETHERTYPE_IPV6;
         transition select(hdr.ipv6.next_hdr) {
             PROTO_TCP: parse_tcp;
             PROTO_UDP: parse_udp;
@@ -107,15 +127,10 @@
     }
 #endif // WITH_IPV6
 
-    state parse_arp {
-        packet.extract(hdr.arp);
-        transition accept;
-    }
-
     state parse_tcp {
         packet.extract(hdr.tcp);
-        fabric_metadata.l4_src_port = hdr.tcp.src_port;
-        fabric_metadata.l4_dst_port = hdr.tcp.dst_port;
+        fabric_metadata.l4_sport = hdr.tcp.sport;
+        fabric_metadata.l4_dport = hdr.tcp.dport;
 #ifdef WITH_INT
         transition parse_int;
 #else
@@ -125,9 +140,9 @@
 
     state parse_udp {
         packet.extract(hdr.udp);
-        fabric_metadata.l4_src_port = hdr.udp.src_port;
-        fabric_metadata.l4_dst_port = hdr.udp.dst_port;
-        transition select(hdr.udp.dst_port) {
+        fabric_metadata.l4_sport = hdr.udp.sport;
+        fabric_metadata.l4_dport = hdr.udp.dport;
+        transition select(hdr.udp.dport) {
 #ifdef WITH_SPGW
             UDP_PORT_GTPU: parse_gtpu;
 #endif // WITH_SPGW
@@ -174,8 +189,8 @@
 
     state parse_inner_udp {
         packet.extract(hdr.inner_udp);
-        fabric_metadata.l4_src_port = hdr.inner_udp.src_port;
-        fabric_metadata.l4_dst_port = hdr.inner_udp.dst_port;
+        fabric_metadata.l4_sport = hdr.inner_udp.sport;
+        fabric_metadata.l4_dport = hdr.inner_udp.dport;
 #ifdef WITH_INT
         transition parse_int;
 #else
@@ -225,7 +240,8 @@
 #endif // WITH_INT
 }
 
-control FabricDeparser(packet_out packet, in parsed_headers_t hdr) {
+control FabricDeparser(packet_out packet,in parsed_headers_t hdr) {
+
     apply {
         packet.emit(hdr.packet_in);
 #ifdef WITH_INT_SINK
@@ -236,8 +252,10 @@
 #endif // WITH_INT_SINK
         packet.emit(hdr.ethernet);
         packet.emit(hdr.vlan_tag);
+#ifdef WITH_XCONNECT
+        packet.emit(hdr.inner_vlan_tag);
+#endif // WITH_XCONNECT
         packet.emit(hdr.mpls);
-        packet.emit(hdr.arp);
 #ifdef WITH_SPGW
         packet.emit(hdr.gtpu_ipv4);
         packet.emit(hdr.gtpu_udp);
diff --git a/pipelines/fabric/src/main/resources/include/spgw.p4 b/pipelines/fabric/src/main/resources/include/spgw.p4
index 5b2cd29..d444e52 100644
--- a/pipelines/fabric/src/main/resources/include/spgw.p4
+++ b/pipelines/fabric/src/main/resources/include/spgw.p4
@@ -40,16 +40,17 @@
 }
 
 control spgw_ingress(
-        inout ipv4_t      gtpu_ipv4,
-        inout udp_t       gtpu_udp,
-        inout gtpu_t      gtpu,
-        inout ipv4_t      ipv4,
-        inout udp_t       udp,
-        inout spgw_meta_t spgw_meta
+        inout ipv4_t            gtpu_ipv4,
+        inout udp_t             gtpu_udp,
+        inout gtpu_t            gtpu,
+        inout ipv4_t            ipv4,
+        inout udp_t             udp,
+        inout fabric_metadata_t fabric_meta
     ) {
 
     direct_counter(CounterType.packets_and_bytes) ue_counter;
 
+    @hidden
     action gtpu_decap() {
         gtpu_ipv4.setInvalid();
         gtpu_udp.setInvalid();
@@ -59,54 +60,57 @@
     action set_dl_sess_info(bit<32> teid,
                             bit<32> s1u_enb_addr,
                             bit<32> s1u_sgw_addr) {
-        spgw_meta.teid = teid;
-        spgw_meta.s1u_enb_addr = s1u_enb_addr;
-        spgw_meta.s1u_sgw_addr = s1u_sgw_addr;
+        fabric_meta.spgw.teid = teid;
+        fabric_meta.spgw.s1u_enb_addr = s1u_enb_addr;
+        fabric_meta.spgw.s1u_sgw_addr = s1u_sgw_addr;
         ue_counter.count();
     }
 
     table dl_sess_lookup {
         key = {
             // UE addr for downlink
-            ipv4.dst_addr : exact;
+            ipv4.dst_addr : exact @name("ipv4_dst");
         }
         actions = {
             set_dl_sess_info();
+            @defaultonly nop();
         }
+        const default_action = nop();
         counters = ue_counter;
     }
 
     table s1u_filter_table {
         key = {
             // IP addresses of the S1U interfaces of this SPGW-U instance (when uplink)
-            gtpu_ipv4.dst_addr : exact;
+            gtpu_ipv4.dst_addr : exact @name("gtp_ipv4_dst");
         }
         actions = {
-            NoAction();
+            nop();
         }
+        const default_action = nop();
     }
 
 #ifdef WITH_SPGW_PCC_GATING
     action set_sdf_rule_id(sdf_rule_id_t id) {
-        spgw_meta.sdf_rule_id = id;
+        fabric_meta.spgw.sdf_rule_id = id;
     }
 
     action set_pcc_rule_id(pcc_rule_id_t id) {
-        spgw_meta.pcc_rule_id = id;
+        fabric_meta.spgw.pcc_rule_id = id;
     }
 
     action set_pcc_info(pcc_gate_status_t gate_status) {
-        spgw_meta.pcc_gate_status = gate_status;
+        fabric_meta.spgw.pcc_gate_status = gate_status;
     }
 
     table sdf_rule_lookup {
         key = {
-            spgw_meta.direction   : exact;
-            ipv4.src_addr         : ternary;
-            ipv4.dst_addr         : ternary;
-            ipv4.protocol         : ternary;
-            spgw_meta.l4_src_port : ternary;
-            spgw_meta.l4_dst_port : ternary;
+            fabric_meta.spgw.direction   : exact @name("spgw_direction");
+            ipv4.src_addr                : ternary @name("ipv4_src");
+            ipv4.dst_addr                : ternary @name("ipv4_dst");
+            ipv4.protocol                : ternary @name("ip_proto");
+            fabric_meta.l4_sport         : ternary @name("l4_sport");
+            fabric_meta.l4_dport         : ternary @name("l4_dport");
         }
         actions = {
             set_sdf_rule_id();
@@ -116,7 +120,7 @@
 
     table pcc_rule_lookup {
         key = {
-            spgw_meta.sdf_rule_id : exact;
+            fabric_meta.spgw.sdf_rule_id : exact @name("sdf_rule_id");
         }
         actions = {
             set_pcc_rule_id();
@@ -126,7 +130,7 @@
 
     table pcc_info_lookup {
         key = {
-            spgw_meta.pcc_rule_id : exact;
+            fabric_meta.spgw.pcc_rule_id : exact @name("pcc_rule_id");
         }
         actions = {
             set_pcc_info();
@@ -141,33 +145,33 @@
             // S1U_SGW_PREFIX/S1U_SGW_PREFIX_LEN subnet.
             // TODO: check also that gtpu.msgtype == GTP_GPDU
             if (!s1u_filter_table.apply().hit) {
-                drop_now();
+                mark_to_drop();
             }
-            spgw_meta.direction = SPGW_DIR_UPLINK;
+            fabric_meta.spgw.direction = SPGW_DIR_UPLINK;
             gtpu_decap();
         } else if (dl_sess_lookup.apply().hit) {
-            spgw_meta.direction = SPGW_DIR_DOWNLINK;
+            fabric_meta.spgw.direction = SPGW_DIR_DOWNLINK;
         } else {
-            spgw_meta.direction = SPGW_DIR_UNKNOWN;
+            fabric_meta.spgw.direction = SPGW_DIR_UNKNOWN;
             // No SPGW processing needed.
             return;
         }
 
 #ifdef WITH_SPGW_PCC_GATING
         // Allow all traffic by default.
-        spgw_meta.pcc_gate_status = PCC_GATE_OPEN;
+        fabric_meta.spgw.pcc_gate_status = PCC_GATE_OPEN;
 
         sdf_rule_lookup.apply();
         pcc_rule_lookup.apply();
         pcc_info_lookup.apply();
 
-        if (spgw_meta.pcc_gate_status == PCC_GATE_CLOSED) {
-            drop_now();
+        if (fabric_meta.spgw.pcc_gate_status == PCC_GATE_CLOSED) {
+            mark_to_drop();
         }
 #endif // WITH_SPGW_PCC_GATING
 
         // Don't ask why... we'll need this later.
-        spgw_meta.ipv4_len = ipv4.total_len;
+        fabric_meta.spgw.ipv4_len = ipv4.total_len;
     }
 }
 
@@ -177,10 +181,11 @@
         inout ipv4_t              gtpu_ipv4,
         inout udp_t               gtpu_udp,
         inout gtpu_t              gtpu,
-        in    spgw_meta_t         spgw_meta,
+        in    fabric_metadata_t   fabric_meta,
         in    standard_metadata_t std_meta
     ) {
 
+    @hidden
     action gtpu_encap() {
         gtpu_ipv4.setValid();
         gtpu_ipv4.version = IP_VERSION_4;
@@ -194,14 +199,14 @@
         gtpu_ipv4.frag_offset = 0;
         gtpu_ipv4.ttl = DEFAULT_IPV4_TTL;
         gtpu_ipv4.protocol = PROTO_UDP;
-        gtpu_ipv4.dst_addr = spgw_meta.s1u_enb_addr;
-        gtpu_ipv4.src_addr = spgw_meta.s1u_sgw_addr;
+        gtpu_ipv4.dst_addr = fabric_meta.spgw.s1u_enb_addr;
+        gtpu_ipv4.src_addr = fabric_meta.spgw.s1u_sgw_addr;
         gtpu_ipv4.hdr_checksum = 0; // Updated later
 
         gtpu_udp.setValid();
-        gtpu_udp.src_port = UDP_PORT_GTPU;
-        gtpu_udp.dst_port = UDP_PORT_GTPU;
-        gtpu_udp.len = spgw_meta.ipv4_len
+        gtpu_udp.sport = UDP_PORT_GTPU;
+        gtpu_udp.dport = UDP_PORT_GTPU;
+        gtpu_udp.len = fabric_meta.spgw.ipv4_len
                 + (UDP_HDR_SIZE + GTP_HDR_SIZE);
         gtpu_udp.checksum = 0; // Updated later
 
@@ -213,12 +218,12 @@
         gtpu.seq_flag = 0;
         gtpu.npdu_flag = 0;
         gtpu.msgtype = GTP_GPDU;
-        gtpu.msglen = spgw_meta.ipv4_len;
-        gtpu.teid = spgw_meta.teid;
+        gtpu.msglen = fabric_meta.spgw.ipv4_len;
+        gtpu.teid = fabric_meta.spgw.teid;
     }
 
     apply {
-        if (spgw_meta.direction == SPGW_DIR_DOWNLINK) {
+        if (fabric_meta.spgw.direction == SPGW_DIR_DOWNLINK) {
             gtpu_encap();
         }
     }
@@ -262,8 +267,8 @@
                 8w0,
                 gtpu_ipv4.protocol,
                 gtpu_udp.len,
-                gtpu_udp.src_port,
-                gtpu_udp.dst_port,
+                gtpu_udp.sport,
+                gtpu_udp.dport,
                 gtpu_udp.len,
                 gtpu,
                 ipv4,
