diff --git a/tools/test/p4src/Makefile b/tools/test/p4src/p4-14/Makefile
similarity index 100%
rename from tools/test/p4src/Makefile
rename to tools/test/p4src/p4-14/Makefile
diff --git a/tools/test/p4src/default.p4 b/tools/test/p4src/p4-14/default.p4
similarity index 100%
rename from tools/test/p4src/default.p4
rename to tools/test/p4src/p4-14/default.p4
diff --git a/tools/test/p4src/ecmp.p4 b/tools/test/p4src/p4-14/ecmp.p4
similarity index 100%
rename from tools/test/p4src/ecmp.p4
rename to tools/test/p4src/p4-14/ecmp.p4
diff --git a/tools/test/p4src/empty.p4 b/tools/test/p4src/p4-14/empty.p4
similarity index 100%
rename from tools/test/p4src/empty.p4
rename to tools/test/p4src/p4-14/empty.p4
diff --git a/tools/test/p4src/include/actions.p4 b/tools/test/p4src/p4-14/include/actions.p4
similarity index 100%
rename from tools/test/p4src/include/actions.p4
rename to tools/test/p4src/p4-14/include/actions.p4
diff --git a/tools/test/p4src/include/defines.p4 b/tools/test/p4src/p4-14/include/defines.p4
similarity index 100%
rename from tools/test/p4src/include/defines.p4
rename to tools/test/p4src/p4-14/include/defines.p4
diff --git a/tools/test/p4src/include/headers.p4 b/tools/test/p4src/p4-14/include/headers.p4
similarity index 100%
rename from tools/test/p4src/include/headers.p4
rename to tools/test/p4src/p4-14/include/headers.p4
diff --git a/tools/test/p4src/include/parser.p4 b/tools/test/p4src/p4-14/include/parser.p4
similarity index 100%
rename from tools/test/p4src/include/parser.p4
rename to tools/test/p4src/p4-14/include/parser.p4
diff --git a/tools/test/p4src/include/port_counters.p4 b/tools/test/p4src/p4-14/include/port_counters.p4
similarity index 100%
rename from tools/test/p4src/include/port_counters.p4
rename to tools/test/p4src/p4-14/include/port_counters.p4
diff --git a/tools/test/p4src/p4c-out/.gitignore b/tools/test/p4src/p4-14/p4c-out/.gitignore
similarity index 93%
rename from tools/test/p4src/p4c-out/.gitignore
rename to tools/test/p4src/p4-14/p4c-out/.gitignore
index f02ec97..dfbb6b2 100644
--- a/tools/test/p4src/p4c-out/.gitignore
+++ b/tools/test/p4src/p4-14/p4c-out/.gitignore
@@ -1,2 +1,2 @@
 *.json
-*.p4info
\ No newline at end of file
+*.p4info
diff --git a/tools/test/p4src/wcmp.p4 b/tools/test/p4src/p4-14/wcmp.p4
similarity index 100%
rename from tools/test/p4src/wcmp.p4
rename to tools/test/p4src/p4-14/wcmp.p4
diff --git a/tools/test/p4src/p4-16/Makefile b/tools/test/p4src/p4-16/Makefile
new file mode 100644
index 0000000..9214804
--- /dev/null
+++ b/tools/test/p4src/p4-16/Makefile
@@ -0,0 +1,25 @@
+all: default.json empty.json ecmp.json wcmp.json
+
+default.json: default.p4
+	p4c-bm2-ss -o p4c-out/default.json \
+	--p4runtime-file p4c-out/default.p4info --p4runtime-format text \
+	default.p4
+
+empty.json: empty.p4
+	p4c-bm2-ss -o p4c-out/empty.json \
+	--p4runtime-file p4c-out/empty.p4info --p4runtime-format text \
+	empty.p4
+
+ecmp.json: ecmp.p4
+	p4c-bm2-ss -o p4c-out/ecmp.json \
+	--p4runtime-file p4c-out/ecmp.p4info --p4runtime-format text \
+	ecmp.p4
+
+wcmp.json: wcmp.p4
+	p4c-bm2-ss -o p4c-out/wcmp.json \
+	--p4runtime-file p4c-out/wcmp.p4info --p4runtime-format text \
+	wcmp.p4
+
+clean:
+	rm -rf p4c-out/*.json
+	rm -rf p4c-out/*.p4info
diff --git a/tools/test/p4src/p4-16/default.p4 b/tools/test/p4src/p4-16/default.p4
new file mode 100644
index 0000000..71a48b5
--- /dev/null
+++ b/tools/test/p4src/p4-16/default.p4
@@ -0,0 +1,42 @@
+#include <core.p4>
+#include <v1model.p4>
+#include "include/defines.p4"
+#include "include/headers.p4"
+#include "include/parsers.p4"
+#include "include/port_counters.p4"
+#include "include/checksums.p4"
+#include "include/actions.p4"
+
+control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    direct_counter(CounterType.packets) table0_counter;
+
+    table table0 {
+        support_timeout = true;
+        actions = {
+            set_egress_port(standard_metadata);
+            send_to_cpu(standard_metadata);
+            drop(standard_metadata);
+        }
+        key = {
+            standard_metadata.ingress_port: ternary;
+            hdr.ethernet.dstAddr          : ternary;
+            hdr.ethernet.srcAddr          : ternary;
+            hdr.ethernet.etherType        : ternary;
+        }
+        counters = table0_counter;
+    }
+    PortCountersControl() port_counters_control;
+    apply {
+        table0.apply();
+        port_counters_control.apply(hdr, meta, standard_metadata);
+    }
+
+}
+
+control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    apply {
+        // Nothing to do
+    }
+}
+
+V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main;
diff --git a/tools/test/p4src/p4-16/ecmp.p4 b/tools/test/p4src/p4-16/ecmp.p4
new file mode 100644
index 0000000..6b3e73e
--- /dev/null
+++ b/tools/test/p4src/p4-16/ecmp.p4
@@ -0,0 +1,65 @@
+#include <core.p4>
+#include <v1model.p4>
+#include "include/defines.p4"
+#include "include/headers.p4"
+#include "include/parsers.p4"
+#include "include/port_counters.p4"
+#include "include/checksums.p4"
+#include "include/actions.p4"
+
+
+control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    direct_counter(CounterType.packets) ecmp_group_table_counter;
+    direct_counter(CounterType.packets) table0_counter;
+
+    action ecmp_group(GroupId groupId, GroupSize groupSize) {
+        meta.ecmp_metadata.groupId = groupId;
+        hash(meta.ecmp_metadata.selector, HashAlgorithm.crc16, (bit<64>)0, { hdr.ipv4.srcAddr, hdr.ipv4.dstAddr, hdr.ipv4.protocol, hdr.tcp.srcPort, hdr.tcp.dstPort, hdr.udp.srcPort, hdr.udp.dstPort }, (bit<128>)groupSize);
+    }
+
+    table ecmp_group_table {
+        actions = {
+            set_egress_port(standard_metadata);
+        }
+        key = {
+            meta.ecmp_metadata.groupId : exact;
+            meta.ecmp_metadata.selector: exact;
+        }
+        counters = ecmp_group_table_counter;
+    }
+
+    table table0 {
+        support_timeout = true;
+        actions = {
+            ecmp_group;
+            set_egress_port(standard_metadata);
+            send_to_cpu(standard_metadata);
+            drop(standard_metadata);
+        }
+        key = {
+            standard_metadata.ingress_port: ternary;
+            hdr.ethernet.dstAddr          : ternary;
+            hdr.ethernet.srcAddr          : ternary;
+            hdr.ethernet.etherType        : ternary;
+        }
+        counters = table0_counter;
+    }
+    PortCountersControl() port_counters_control;
+    apply {
+        switch (table0.apply().action_run) {
+            ecmp_group: {
+                ecmp_group_table.apply();
+            }
+        }
+
+        port_counters_control.apply(hdr, meta, standard_metadata);
+    }
+}
+
+control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    apply {
+        // Nothing to do
+    }
+}
+
+V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main;
diff --git a/tools/test/p4src/p4-16/empty.p4 b/tools/test/p4src/p4-16/empty.p4
new file mode 100644
index 0000000..09e4740
--- /dev/null
+++ b/tools/test/p4src/p4-16/empty.p4
@@ -0,0 +1,62 @@
+#include <core.p4>
+#include <v1model.p4>
+
+struct dummy_t {
+    bit<8> dummyField;
+}
+
+struct metadata {
+    dummy_t dummy_metadata;
+}
+
+struct headers {
+}
+
+parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    state start {
+        transition accept;
+    }
+}
+
+control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    action dummy_action() {
+        meta.dummy_metadata.dummyField = 8w1;
+    }
+    table table0 {
+        actions = {
+            dummy_action;
+        }
+        key = {
+            meta.dummy_metadata.dummyField: exact;
+        }
+    }
+    apply {
+        table0.apply();
+    }
+}
+
+control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    apply {
+        // Nothing to do
+    }
+}
+
+control DeparserImpl(packet_out packet, in headers hdr) {
+    apply {
+        // Nothing to do
+    }
+}
+
+control verifyChecksum(in headers hdr, inout metadata meta) {
+    apply {
+        // Nothing to do
+    }
+}
+
+control computeChecksum(inout headers hdr, inout metadata meta) {
+    apply {
+        // Nothing to do
+    }
+}
+
+V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main;
diff --git a/tools/test/p4src/p4-16/include/actions.p4 b/tools/test/p4src/p4-16/include/actions.p4
new file mode 100644
index 0000000..0ef0533
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/actions.p4
@@ -0,0 +1,14 @@
+#include "defines.p4"
+#include "headers.p4"
+
+action send_to_cpu(inout standard_metadata_t standard_metadata) {
+    standard_metadata.egress_spec = CPU_PORT;
+}
+
+action set_egress_port(inout standard_metadata_t standard_metadata, Port port) {
+    standard_metadata.egress_spec = port;
+}
+
+action drop(inout standard_metadata_t standard_metadata) {
+    standard_metadata.egress_spec = DROP_PORT;
+}
diff --git a/tools/test/p4src/p4-16/include/checksums.p4 b/tools/test/p4src/p4-16/include/checksums.p4
new file mode 100644
index 0000000..09365dc
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/checksums.p4
@@ -0,0 +1,17 @@
+#ifndef CHECK_SUMS
+#define CHECK_SUMS
+#include "headers.p4"
+#include "metadata.p4"
+
+control verifyChecksum(in headers hdr, inout metadata meta) {
+    apply {
+        // Nothing to do
+    }
+}
+
+control computeChecksum(inout headers hdr, inout metadata meta) {
+    apply {
+        // Nothing to do
+    }
+}
+#endif
diff --git a/tools/test/p4src/p4-16/include/defines.p4 b/tools/test/p4src/p4-16/include/defines.p4
new file mode 100644
index 0000000..24974a1
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/defines.p4
@@ -0,0 +1,10 @@
+#ifndef DEFINES
+#define DEFINES
+// Logic ports as defined in the simple_switch target
+#define MAX_PORTS 254
+#define CPU_PORT 9w255
+#define DROP_PORT 9w511
+typedef bit<16> GroupId;
+typedef bit<8> GroupSize;
+typedef bit<9> Port;
+#endif
diff --git a/tools/test/p4src/p4-16/include/headers.p4 b/tools/test/p4src/p4-16/include/headers.p4
new file mode 100644
index 0000000..d497370
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/headers.p4
@@ -0,0 +1,58 @@
+#ifndef HEADERS
+#define HEADERS
+struct intrinsic_metadata_t {
+    bit<32> ingress_global_timestamp;
+    bit<32> lf_field_list;
+    bit<16> mcast_grp;
+    bit<16> egress_rid;
+}
+
+header ethernet_t {
+    bit<48> dstAddr;
+    bit<48> srcAddr;
+    bit<16> etherType;
+}
+
+header ipv4_t {
+    bit<4>  version;
+    bit<4>  ihl;
+    bit<8>  diffserv;
+    bit<16> totalLen;
+    bit<16> identification;
+    bit<3>  flags;
+    bit<13> fragOffset;
+    bit<8>  ttl;
+    bit<8>  protocol;
+    bit<16> hdrChecksum;
+    bit<32> srcAddr;
+    bit<32> dstAddr;
+}
+
+header tcp_t {
+    bit<16> srcPort;
+    bit<16> dstPort;
+    bit<32> seqNo;
+    bit<32> ackNo;
+    bit<4>  dataOffset;
+    bit<3>  res;
+    bit<3>  ecn;
+    bit<6>  ctrl;
+    bit<16> window;
+    bit<16> checksum;
+    bit<16> urgentPtr;
+}
+
+header udp_t {
+    bit<16> srcPort;
+    bit<16> dstPort;
+    bit<16> length_;
+    bit<16> checksum;
+}
+
+struct headers {
+    ethernet_t ethernet;
+    ipv4_t ipv4;
+    tcp_t tcp;
+    udp_t udp;
+}
+#endif
diff --git a/tools/test/p4src/p4-16/include/metadata.p4 b/tools/test/p4src/p4-16/include/metadata.p4
new file mode 100644
index 0000000..e08057c
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/metadata.p4
@@ -0,0 +1,20 @@
+#ifndef METADATA
+#define METADATA
+
+struct ecmp_metadata_t {
+    bit<16> groupId;
+    bit<16> selector;
+}
+
+struct wcmp_meta_t {
+    bit<16> groupId;
+    bit<8>  numBits;
+    bit<64> selector;
+}
+
+struct metadata {
+    ecmp_metadata_t ecmp_metadata;
+    wcmp_meta_t wcmp_meta;
+    intrinsic_metadata_t intrinsic_metadata;
+}
+#endif
diff --git a/tools/test/p4src/p4-16/include/parsers.p4 b/tools/test/p4src/p4-16/include/parsers.p4
new file mode 100644
index 0000000..e9fbc6f
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/parsers.p4
@@ -0,0 +1,51 @@
+#ifndef PARSERS
+#define PARSERS
+#include "headers.p4"
+#include "metadata.p4"
+
+#define ETH_TYPE_IPV4 16w0x0800
+#define IP_TYPE_TCP 8w6
+#define IP_TYPE_UDP 8w17
+
+parser ParserImpl(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    state parse_ethernet {
+        packet.extract(hdr.ethernet);
+        transition select(hdr.ethernet.etherType) {
+            ETH_TYPE_IPV4: parse_ipv4;
+            default: accept;
+        }
+    }
+
+    state parse_ipv4 {
+        packet.extract(hdr.ipv4);
+        transition select(hdr.ipv4.protocol) {
+            IP_TYPE_TCP: parse_tcp;
+            IP_TYPE_UDP: parse_udp;
+            default: accept;
+        }
+    }
+
+    state parse_tcp {
+        packet.extract(hdr.tcp);
+        transition accept;
+    }
+
+    state parse_udp {
+        packet.extract(hdr.udp);
+        transition accept;
+    }
+
+    state start {
+        transition parse_ethernet;
+    }
+}
+
+control DeparserImpl(packet_out packet, in headers hdr) {
+    apply {
+        packet.emit(hdr.ethernet);
+        packet.emit(hdr.ipv4);
+        packet.emit(hdr.udp);
+        packet.emit(hdr.tcp);
+    }
+}
+#endif
diff --git a/tools/test/p4src/p4-16/include/port_counters.p4 b/tools/test/p4src/p4-16/include/port_counters.p4
new file mode 100644
index 0000000..90916ba
--- /dev/null
+++ b/tools/test/p4src/p4-16/include/port_counters.p4
@@ -0,0 +1,16 @@
+#ifndef PORT_COUNTERS
+#define PORT_COUNTERS
+#include "defines.p4"
+
+control PortCountersControl(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    counter(MAX_PORTS, CounterType.packets) egress_port_counter;
+    counter(MAX_PORTS, CounterType.packets) ingress_port_counter;
+
+    apply {
+        if (standard_metadata.egress_spec < MAX_PORTS) {
+            ingress_port_counter.count((bit<32>)standard_metadata.ingress_port);
+            egress_port_counter.count((bit<32>)standard_metadata.egress_spec);
+        }
+    }
+}
+#endif
diff --git a/tools/test/p4src/p4c-out/.gitignore b/tools/test/p4src/p4-16/p4c-out/.gitignore
similarity index 93%
copy from tools/test/p4src/p4c-out/.gitignore
copy to tools/test/p4src/p4-16/p4c-out/.gitignore
index f02ec97..dfbb6b2 100644
--- a/tools/test/p4src/p4c-out/.gitignore
+++ b/tools/test/p4src/p4-16/p4c-out/.gitignore
@@ -1,2 +1,2 @@
 *.json
-*.p4info
\ No newline at end of file
+*.p4info
diff --git a/tools/test/p4src/p4-16/wcmp.p4 b/tools/test/p4src/p4-16/wcmp.p4
new file mode 100644
index 0000000..6dff6f1
--- /dev/null
+++ b/tools/test/p4src/p4-16/wcmp.p4
@@ -0,0 +1,72 @@
+#include <core.p4>
+#include <v1model.p4>
+#include "include/defines.p4"
+#include "include/headers.p4"
+#include "include/parsers.p4"
+#include "include/port_counters.p4"
+#include "include/checksums.p4"
+#include "include/actions.p4"
+
+#define SELECTOR_WIDTH 64
+const bit<SELECTOR_WIDTH> ONE = 64w1;
+
+control ingress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    direct_counter(CounterType.packets) table0_counter;
+    direct_counter(CounterType.packets) wcmp_group_table_counter;
+
+    action wcmp_group(GroupId groupId) {
+        meta.wcmp_meta.groupId = groupId;
+        hash(meta.wcmp_meta.numBits, HashAlgorithm.crc16, (bit<64>)2, { hdr.ipv4.srcAddr, hdr.ipv4.dstAddr, hdr.ipv4.protocol, hdr.tcp.srcPort, hdr.tcp.dstPort, hdr.udp.srcPort, hdr.udp.dstPort }, (bit<128>)62);
+    }
+
+    action wcmp_set_selector() {
+        meta.wcmp_meta.selector = ((ONE << meta.wcmp_meta.numBits) - ONE) << (SELECTOR_WIDTH - meta.wcmp_meta.numBits);
+    }
+
+    table table0 {
+        support_timeout = true;
+        actions = {
+            set_egress_port(standard_metadata);
+            wcmp_group;
+            send_to_cpu(standard_metadata);
+            drop(standard_metadata);
+        }
+        key = {
+            standard_metadata.ingress_port: ternary;
+            hdr.ethernet.dstAddr          : ternary;
+            hdr.ethernet.srcAddr          : ternary;
+            hdr.ethernet.etherType        : ternary;
+        }
+        counters = table0_counter;
+    }
+
+    table wcmp_group_table {
+        actions = {
+            set_egress_port(standard_metadata);
+        }
+        key = {
+            meta.wcmp_meta.groupId : exact;
+            meta.wcmp_meta.selector: lpm;
+        }
+        counters = wcmp_group_table_counter;
+    }
+
+    PortCountersControl() port_counters_control;
+    apply {
+        switch (table0.apply().action_run) {
+            wcmp_group: {
+                wcmp_set_selector();
+                wcmp_group_table.apply();
+            }
+        }
+        port_counters_control.apply(hdr, meta, standard_metadata);
+    }
+}
+
+control egress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
+    apply {
+        // Nothing to do
+    }
+}
+
+V1Switch(ParserImpl(), verifyChecksum(), ingress(), egress(), computeChecksum(), DeparserImpl()) main;
