Pruned old BMv2 stuff

...making space for new BMv2 support via P4Runtime.

Change-Id: Ia34c1a152c0e6e006fd3b86afc5086316264b6f6
diff --git a/apps/bmv2-demo/common/pom.xml b/apps/bmv2-demo/common/pom.xml
deleted file mode 100644
index 37bdb18..0000000
--- a/apps/bmv2-demo/common/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>onos-app-bmv2-demo</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>onos-app-bmv2-demo-common</artifactId>
-
-    <packaging>bundle</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-protocol-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/apps/bmv2-demo/common/src/main/java/org/onosproject/bmv2/demo/app/common/AbstractUpgradableFabricApp.java b/apps/bmv2-demo/common/src/main/java/org/onosproject/bmv2/demo/app/common/AbstractUpgradableFabricApp.java
deleted file mode 100644
index 66ac4fc..0000000
--- a/apps/bmv2-demo/common/src/main/java/org/onosproject/bmv2/demo/app/common/AbstractUpgradableFabricApp.java
+++ /dev/null
@@ -1,560 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.demo.app.common;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onosproject.app.ApplicationAdminService;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.service.Bmv2DeviceContextService;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.Port;
-import org.onosproject.net.device.DeviceEvent;
-import org.onosproject.net.device.DeviceListener;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.DefaultFlowRule;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.FlowRuleOperations;
-import org.onosproject.net.flow.FlowRuleService;
-import org.onosproject.net.host.HostEvent;
-import org.onosproject.net.host.HostListener;
-import org.onosproject.net.host.HostService;
-import org.onosproject.net.topology.Topology;
-import org.onosproject.net.topology.TopologyEvent;
-import org.onosproject.net.topology.TopologyGraph;
-import org.onosproject.net.topology.TopologyListener;
-import org.onosproject.net.topology.TopologyService;
-import org.onosproject.net.topology.TopologyVertex;
-import org.slf4j.Logger;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static java.util.stream.Collectors.toSet;
-import static java.util.stream.Stream.concat;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.net.device.DeviceEvent.Type.*;
-import static org.onosproject.net.host.HostEvent.Type.HOST_ADDED;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * Abstract implementation of an app providing fabric connectivity for a 2-stage Clos topology of BMv2 devices.
- */
-@Component(immediate = true)
-public abstract class AbstractUpgradableFabricApp {
-
-    private static final Map<String, AbstractUpgradableFabricApp> APP_HANDLES = Maps.newConcurrentMap();
-
-    private static final int NUM_LEAFS = 3;
-    private static final int NUM_SPINES = 3;
-    private static final int FLOW_PRIORITY = 100;
-
-    private static final int CLEANUP_SLEEP = 2000;
-
-    protected final Logger log = getLogger(getClass());
-
-    private final TopologyListener topologyListener = new InternalTopologyListener();
-    private final DeviceListener deviceListener = new InternalDeviceListener();
-    private final HostListener hostListener = new InternalHostListener();
-
-    private final ExecutorService executorService = Executors
-            .newFixedThreadPool(8, groupedThreads("onos/bmv2-demo-app", "bmv2-app-task", log));
-
-    private final String appName;
-    private final String configurationName;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected TopologyService topologyService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private HostService hostService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private FlowRuleService flowRuleService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private ApplicationAdminService appService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private CoreService coreService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private Bmv2DeviceContextService bmv2ContextService;
-
-    private boolean appActive = false;
-    private boolean appFreezed = false;
-
-    private boolean otherAppFound = false;
-    private AbstractUpgradableFabricApp otherApp;
-
-    private boolean flowRuleGenerated = false;
-    private ApplicationId appId;
-
-    private Bmv2DeviceContext bmv2Context;
-
-    private Set<DeviceId> leafSwitches;
-    private Set<DeviceId> spineSwitches;
-
-    private Map<DeviceId, List<FlowRule>> deviceFlowRules;
-    private Map<DeviceId, Bmv2DeviceContext> previousContexts;
-    private Map<DeviceId, Boolean> contextFlags;
-    private Map<DeviceId, Boolean> ruleFlags;
-
-    private ConcurrentMap<DeviceId, Lock> deviceLocks = Maps.newConcurrentMap();
-
-    /**
-     * Creates a new BMv2 fabric app.
-     *
-     * @param appName           app name
-     * @param configurationName a common name for the P4 program / BMv2 configuration used by this app
-     * @param context a BMv2 device context to be used on devices
-     */
-    protected AbstractUpgradableFabricApp(String appName, String configurationName, Bmv2DeviceContext context) {
-        this.appName = checkNotNull(appName);
-        this.configurationName = checkNotNull(configurationName);
-        this.bmv2Context = checkNotNull(context);
-    }
-
-    @Activate
-    public void activate() {
-        log.info("Starting...");
-
-        appActive = true;
-        appFreezed = false;
-
-        if (APP_HANDLES.size() > 0) {
-            if (APP_HANDLES.size() > 1) {
-                throw new IllegalStateException("Found more than 1 active app handles");
-            }
-            otherAppFound = true;
-            otherApp = APP_HANDLES.values().iterator().next();
-            log.info("Found other fabric app active, signaling to freeze to {}...", otherApp.appName);
-            otherApp.setAppFreezed(true);
-        }
-
-        APP_HANDLES.put(appName, this);
-
-        appId = coreService.registerApplication(appName);
-
-        topologyService.addListener(topologyListener);
-        deviceService.addListener(deviceListener);
-        hostService.addListener(hostListener);
-
-        bmv2ContextService.registerInterpreterClassLoader(bmv2Context.interpreter().getClass(),
-                                                          this.getClass().getClassLoader());
-
-        init();
-
-        log.info("STARTED", appId.id());
-    }
-
-    @Deactivate
-    public void deactivate() {
-        log.info("Stopping...");
-        try {
-            executorService.shutdown();
-            executorService.awaitTermination(5, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            List<Runnable> runningTasks = executorService.shutdownNow();
-            log.warn("Unable to stop the following tasks: {}", runningTasks);
-        }
-        deviceService.removeListener(deviceListener);
-        topologyService.removeListener(topologyListener);
-        hostService.removeListener(hostListener);
-        flowRuleService.removeFlowRulesById(appId);
-
-        appActive = false;
-        APP_HANDLES.remove(appName);
-
-        log.info("STOPPED");
-    }
-
-    private void init() {
-
-        // Reset any previous state
-        synchronized (this) {
-            flowRuleGenerated = Boolean.FALSE;
-            leafSwitches = Sets.newHashSet();
-            spineSwitches = Sets.newHashSet();
-            deviceFlowRules = Maps.newConcurrentMap();
-            ruleFlags = Maps.newConcurrentMap();
-            contextFlags = Maps.newConcurrentMap();
-        }
-
-        // Start flow rules generator...
-        spawnTask(() -> generateFlowRules(topologyService.currentTopology(), Sets.newHashSet(hostService.getHosts())));
-    }
-
-    private void setAppFreezed(boolean appFreezed) {
-        this.appFreezed = appFreezed;
-        if (appFreezed) {
-            log.info("Freezing...");
-        } else {
-            log.info("Unfreezing...!");
-        }
-    }
-
-    /**
-     * Perform device initialization. Returns true if the operation was successful, false otherwise.
-     *
-     * @param deviceId a device id
-     * @return a boolean value
-     */
-    public abstract boolean initDevice(DeviceId deviceId);
-
-    /**
-     * Generates a list of flow rules for the given leaf switch, source host, destination hosts, spine switches and
-     * topology.
-     *
-     * @param leaf     a leaf device id
-     * @param srcHost  a source host
-     * @param dstHosts a collection of destination hosts
-     * @param spines   a collection of spine device IDs
-     * @param topology a topology
-     * @return a list of flow rules
-     * @throws FlowRuleGeneratorException if flow rules cannot be generated
-     */
-    public abstract List<FlowRule> generateLeafRules(DeviceId leaf, Host srcHost, Collection<Host> dstHosts,
-                                                     Collection<DeviceId> spines, Topology topology)
-            throws FlowRuleGeneratorException;
-
-    /**
-     * Generates a list of flow rules for the given spine switch, destination hosts and topology.
-     *
-     * @param deviceId a spine device id
-     * @param dstHosts a collection of destination hosts
-     * @param topology a topology
-     * @return a list of flow rules
-     * @throws FlowRuleGeneratorException if flow rules cannot be generated
-     */
-    public abstract List<FlowRule> generateSpineRules(DeviceId deviceId, Collection<Host> dstHosts, Topology topology)
-            throws FlowRuleGeneratorException;
-
-    private void deployAllDevices() {
-        if (otherAppFound && otherApp.appActive) {
-            log.info("Deactivating other app...");
-            appService.deactivate(otherApp.appId);
-            try {
-                Thread.sleep(CLEANUP_SLEEP);
-            } catch (InterruptedException e) {
-                log.warn("Cleanup sleep interrupted!");
-                Thread.interrupted();
-            }
-        }
-
-        Stream.concat(leafSwitches.stream(), spineSwitches.stream())
-                .map(deviceService::getDevice)
-                .forEach(device -> spawnTask(() -> deployDevice(device)));
-    }
-
-    /**
-     * Executes a device deploy.
-     *
-     * @param device a device
-     */
-    public void deployDevice(Device device) {
-
-        DeviceId deviceId = device.id();
-
-        // Synchronize executions over the same device.
-        Lock lock = deviceLocks.computeIfAbsent(deviceId, k -> new ReentrantLock());
-        lock.lock();
-
-        try {
-            // Set context if not already done.
-            if (!contextFlags.getOrDefault(deviceId, false)) {
-                log.info("Setting context to {} for {}...", configurationName, deviceId);
-                bmv2ContextService.setContext(deviceId, bmv2Context);
-                contextFlags.put(device.id(), true);
-            }
-
-            // Initialize device.
-            if (!initDevice(deviceId)) {
-                log.warn("Failed to initialize device {}", deviceId);
-            }
-
-            // Install rules.
-            if (!ruleFlags.getOrDefault(deviceId, false)) {
-                List<FlowRule> rules = deviceFlowRules.getOrDefault(deviceId, Collections.emptyList());
-                if (rules.size() > 0) {
-                    log.info("Installing rules for {}...", deviceId);
-                    installFlowRules(rules);
-                    ruleFlags.put(deviceId, true);
-                }
-            }
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    private void spawnTask(Runnable task) {
-        executorService.execute(task);
-    }
-
-
-    private void installFlowRules(Collection<FlowRule> rules) {
-        FlowRuleOperations.Builder opsBuilder = FlowRuleOperations.builder();
-        rules.forEach(opsBuilder::add);
-        flowRuleService.apply(opsBuilder.build());
-    }
-
-    private void removeFlowRules(Collection<FlowRule> rules) {
-        FlowRuleOperations.Builder opsBuilder = FlowRuleOperations.builder();
-        rules.forEach(opsBuilder::remove);
-        flowRuleService.apply(opsBuilder.build());
-    }
-
-    /**
-     * Generates the flow rules to provide host-to-host connectivity for the given topology and hosts.
-     *
-     * @param topo  a topology
-     * @param hosts a collection of hosts
-     */
-    private synchronized void generateFlowRules(Topology topo, Collection<Host> hosts) {
-
-        if (flowRuleGenerated) {
-            log.debug("Flow rules have been already generated, aborting...");
-            return;
-        }
-
-        log.debug("Starting flow rules generator...");
-
-        TopologyGraph graph = topologyService.getGraph(topo);
-        Set<DeviceId> spines = Sets.newHashSet();
-        Set<DeviceId> leafs = Sets.newHashSet();
-        graph.getVertexes().stream()
-                .map(TopologyVertex::deviceId)
-                .forEach(did -> (isSpine(did, topo) ? spines : leafs).add(did));
-
-        if (spines.size() != NUM_SPINES || leafs.size() != NUM_LEAFS) {
-            log.info("Invalid leaf/spine switches count, aborting... > leafCount={}, spineCount={}",
-                     spines.size(), leafs.size());
-            return;
-        }
-
-        for (DeviceId did : spines) {
-            int portCount = deviceService.getPorts(did).size();
-            // Expected port count: num leafs + 1 redundant leaf link
-            if (portCount != (NUM_LEAFS + 1)) {
-                log.info("Invalid port count for spine, aborting... > deviceId={}, portCount={}", did, portCount);
-                return;
-            }
-        }
-        for (DeviceId did : leafs) {
-            int portCount = deviceService.getPorts(did).size();
-            // Expected port count: num spines + host port + 1 redundant spine link
-            if (portCount != (NUM_SPINES + 2)) {
-                log.info("Invalid port count for leaf, aborting... > deviceId={}, portCount={}", did, portCount);
-                return;
-            }
-        }
-
-        // Check hosts, number and exactly one per leaf
-        Map<DeviceId, Host> hostMap = Maps.newHashMap();
-        hosts.forEach(h -> hostMap.put(h.location().deviceId(), h));
-        if (hosts.size() != NUM_LEAFS || !leafs.equals(hostMap.keySet())) {
-            log.info("Wrong host configuration, aborting... > hostCount={}, hostMapz={}", hosts.size(), hostMap);
-            return;
-        }
-
-        List<FlowRule> newFlowRules = Lists.newArrayList();
-
-        try {
-            for (DeviceId deviceId : leafs) {
-                Host srcHost = hostMap.get(deviceId);
-                Set<Host> dstHosts = hosts.stream().filter(h -> h != srcHost).collect(toSet());
-                newFlowRules.addAll(generateLeafRules(deviceId, srcHost, dstHosts, spines, topo));
-            }
-            for (DeviceId deviceId : spines) {
-                newFlowRules.addAll(generateSpineRules(deviceId, hosts, topo));
-            }
-        } catch (FlowRuleGeneratorException e) {
-            log.warn("Exception while executing flow rule generator: ", e.toString());
-            return;
-        }
-
-        if (newFlowRules.size() == 0) {
-            // Something went wrong
-            log.error("0 flow rules generated, BUG?");
-            return;
-        }
-
-        // All good!
-        // Divide flow rules per device id...
-        ImmutableMap.Builder<DeviceId, List<FlowRule>> mapBuilder = ImmutableMap.builder();
-        concat(spines.stream(), leafs.stream())
-                .map(deviceId -> ImmutableList.copyOf(newFlowRules
-                                                              .stream()
-                                                              .filter(fr -> fr.deviceId().equals(deviceId))
-                                                              .iterator()))
-                .forEach(frs -> mapBuilder.put(frs.get(0).deviceId(), frs));
-        this.deviceFlowRules = mapBuilder.build();
-
-        this.leafSwitches = ImmutableSet.copyOf(leafs);
-        this.spineSwitches = ImmutableSet.copyOf(spines);
-
-        // Avoid other executions to modify the generated flow rules.
-        flowRuleGenerated = true;
-
-        log.info("Generated {} flow rules for {} devices", newFlowRules.size(), spines.size() + leafs.size());
-
-        spawnTask(this::deployAllDevices);
-    }
-
-    /**
-     * Returns a new, pre-configured flow rule builder.
-     *
-     * @param did       a device id
-     * @param tableName a table name
-     * @return a new flow rule builder
-     */
-    protected FlowRule.Builder flowRuleBuilder(DeviceId did, String tableName) throws FlowRuleGeneratorException {
-        Map<String, Integer> tableMap = bmv2Context.interpreter().tableIdMap().inverse();
-        if (tableMap.get(tableName) == null) {
-            throw new FlowRuleGeneratorException("Unknown table " + tableName);
-        }
-        return DefaultFlowRule.builder()
-                .forDevice(did)
-                .forTable(tableMap.get(tableName))
-                .fromApp(appId)
-                .withPriority(FLOW_PRIORITY)
-                .makePermanent();
-    }
-
-    private List<Port> getHostPorts(DeviceId deviceId, Topology topology) {
-        // Get all non-fabric ports.
-        return deviceService
-                .getPorts(deviceId)
-                .stream()
-                .filter(p -> !isFabricPort(p, topology))
-                .collect(Collectors.toList());
-    }
-
-    private boolean isSpine(DeviceId deviceId, Topology topology) {
-        // True if all ports are fabric.
-        return getHostPorts(deviceId, topology).size() == 0;
-    }
-
-    protected boolean isFabricPort(Port port, Topology topology) {
-        // True if the port connects this device to another infrastructure device.
-        return topologyService.isInfrastructure(topology, new ConnectPoint(port.element().id(), port.number()));
-    }
-
-    /**
-     * A listener of topology events that executes a flow rule generation task each time a device is added.
-     */
-    private class InternalTopologyListener implements TopologyListener {
-
-        @Override
-        public void event(TopologyEvent event) {
-            spawnTask(() -> generateFlowRules(event.subject(), Sets.newHashSet(hostService.getHosts())));
-        }
-
-        @Override
-        public boolean isRelevant(TopologyEvent event) {
-            return !appFreezed &&
-                    // If at least one reason is of type DEVICE_ADDED.
-                    event.reasons().stream().
-                            filter(r -> r instanceof DeviceEvent)
-                            .filter(r -> ((DeviceEvent) r).type() == DEVICE_ADDED)
-                            .findAny()
-                            .isPresent();
-        }
-    }
-
-    /**
-     * A listener of device events that executes a device deploy task each time a device is added, updated or
-     * re-connects.
-     */
-    private class InternalDeviceListener implements DeviceListener {
-        @Override
-        public void event(DeviceEvent event) {
-            spawnTask(() -> deployDevice(event.subject()));
-        }
-
-        @Override
-        public boolean isRelevant(DeviceEvent event) {
-            return !appFreezed &&
-                    (event.type() == DEVICE_ADDED ||
-                            event.type() == DEVICE_UPDATED ||
-                            (event.type() == DEVICE_AVAILABILITY_CHANGED &&
-                                    deviceService.isAvailable(event.subject().id())));
-        }
-    }
-
-    /**
-     * A listener of host events that generates flow rules each time a new host is added.
-     */
-    private class InternalHostListener implements HostListener {
-        @Override
-        public void event(HostEvent event) {
-            spawnTask(() -> generateFlowRules(topologyService.currentTopology(),
-                                              Sets.newHashSet(hostService.getHosts())));
-        }
-
-        @Override
-        public boolean isRelevant(HostEvent event) {
-            return !appFreezed && event.type() == HOST_ADDED;
-        }
-    }
-
-    /**
-     * An exception occurred while generating flow rules for this fabric.
-     */
-    public class FlowRuleGeneratorException extends Exception {
-
-        public FlowRuleGeneratorException() {
-        }
-
-        public FlowRuleGeneratorException(String msg) {
-            super(msg);
-        }
-
-        public FlowRuleGeneratorException(Exception cause) {
-            super(cause);
-        }
-    }
-}
\ No newline at end of file
diff --git a/apps/bmv2-demo/common/src/main/java/org/onosproject/bmv2/demo/app/common/package-info.java b/apps/bmv2-demo/common/src/main/java/org/onosproject/bmv2/demo/app/common/package-info.java
deleted file mode 100644
index b8eab5c..0000000
--- a/apps/bmv2-demo/common/src/main/java/org/onosproject/bmv2/demo/app/common/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * Bmv2 demo app common classes.
- */
-package org.onosproject.bmv2.demo.app.common;
\ No newline at end of file
diff --git a/apps/bmv2-demo/ecmp/features.xml b/apps/bmv2-demo/ecmp/features.xml
deleted file mode 100644
index 0bfb827..0000000
--- a/apps/bmv2-demo/ecmp/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-app-bmv2-demo-common/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/bmv2-demo/ecmp/pom.xml b/apps/bmv2-demo/ecmp/pom.xml
deleted file mode 100644
index 283e1ed..0000000
--- a/apps/bmv2-demo/ecmp/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>onos-app-bmv2-demo</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>onos-app-bmv2-demo-ecmp</artifactId>
-
-    <packaging>bundle</packaging>
-
-    <properties>
-        <onos.app.name>org.onosproject.bmv2-ecmp-fabric</onos.app.name>
-        <onos.app.title>P4/BMv2 Demo Fabric App v1 (ECMP)</onos.app.title>
-        <onos.app.category>Traffic Steering</onos.app.category>
-        <onos.app.url>http://onosproject.org</onos.app.url>
-        <onos.app.readme>P4/BMv2 demo application with ECMP support for a 2-stage clos fabric topology</onos.app.readme>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-bmv2-demo-common</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/EcmpFabricApp.java b/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/EcmpFabricApp.java
deleted file mode 100644
index ab42d2f..0000000
--- a/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/EcmpFabricApp.java
+++ /dev/null
@@ -1,272 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.demo.app.ecmp;
-
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.felix.scr.annotations.Component;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2DefaultConfiguration;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionSelector;
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment;
-import org.onosproject.bmv2.demo.app.common.AbstractUpgradableFabricApp;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.Path;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.ExtensionSelector;
-import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.topology.DefaultTopologyVertex;
-import org.onosproject.net.topology.Topology;
-import org.onosproject.net.topology.TopologyGraph;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static java.util.stream.Collectors.toSet;
-import static org.onlab.packet.EthType.EtherType.IPV4;
-import static org.onosproject.bmv2.demo.app.ecmp.EcmpInterpreter.*;
-
-/**
- * Implementation of an upgradable fabric app for the ECMP configuration.
- */
-@Component(immediate = true)
-public class EcmpFabricApp extends AbstractUpgradableFabricApp {
-
-    private static final String APP_NAME = "org.onosproject.bmv2-ecmp-fabric";
-    private static final String MODEL_NAME = "ECMP";
-    private static final String JSON_CONFIG_PATH = "/ecmp.json";
-
-    private static final Bmv2Configuration ECMP_CONFIGURATION = loadConfiguration();
-    private static final EcmpInterpreter ECMP_INTERPRETER = new EcmpInterpreter();
-    protected static final Bmv2DeviceContext ECMP_CONTEXT = new Bmv2DeviceContext(ECMP_CONFIGURATION, ECMP_INTERPRETER);
-
-    private static final Map<DeviceId, Map<Set<PortNumber>, Short>> DEVICE_GROUP_ID_MAP = Maps.newHashMap();
-
-    public EcmpFabricApp() {
-        super(APP_NAME, MODEL_NAME, ECMP_CONTEXT);
-    }
-
-    @Override
-    public boolean initDevice(DeviceId deviceId) {
-        // Nothing to do.
-        return true;
-    }
-
-    @Override
-    public List<FlowRule> generateLeafRules(DeviceId leaf, Host srcHost, Collection<Host> dstHosts,
-                                            Collection<DeviceId> availableSpines, Topology topo)
-            throws FlowRuleGeneratorException {
-
-        // Get ports which connect this leaf switch to hosts.
-        Set<PortNumber> hostPorts = deviceService.getPorts(leaf)
-                .stream()
-                .filter(port -> !isFabricPort(port, topo))
-                .map(Port::number)
-                .collect(Collectors.toSet());
-
-        // Get ports which connect this leaf to the given available spines.
-        TopologyGraph graph = topologyService.getGraph(topo);
-        Set<PortNumber> fabricPorts = graph.getEdgesFrom(new DefaultTopologyVertex(leaf))
-                .stream()
-                .filter(e -> availableSpines.contains(e.dst().deviceId()))
-                .map(e -> e.link().src().port())
-                .collect(Collectors.toSet());
-
-        if (hostPorts.size() != 1 || fabricPorts.size() == 0) {
-            log.error("Leaf switch has invalid port configuration: hostPorts={}, fabricPorts={}",
-                      hostPorts.size(), fabricPorts.size());
-            throw new FlowRuleGeneratorException();
-        }
-        PortNumber hostPort = hostPorts.iterator().next();
-
-        List<FlowRule> rules = Lists.newArrayList();
-
-        TrafficTreatment treatment;
-        if (fabricPorts.size() > 1) {
-            // Do ECMP.
-            Pair<ExtensionTreatment, List<FlowRule>> result = provisionEcmpTreatment(leaf, fabricPorts);
-            rules.addAll(result.getRight());
-            ExtensionTreatment extTreatment = result.getLeft();
-            treatment = DefaultTrafficTreatment.builder().extension(extTreatment, leaf).build();
-        } else {
-            // Output on port.
-            PortNumber outPort = fabricPorts.iterator().next();
-            treatment = DefaultTrafficTreatment.builder().setOutput(outPort).build();
-        }
-
-        // From srHost to dstHosts.
-        for (Host dstHost : dstHosts) {
-            FlowRule rule = flowRuleBuilder(leaf, TABLE0)
-                    .withSelector(
-                            DefaultTrafficSelector.builder()
-                                    .matchInPort(hostPort)
-                                    .matchEthType(IPV4.ethType().toShort())
-                                    .matchEthSrc(srcHost.mac())
-                                    .matchEthDst(dstHost.mac())
-                                    .build())
-                    .withTreatment(treatment)
-                    .build();
-            rules.add(rule);
-        }
-
-        // From fabric ports to this leaf host.
-        for (PortNumber port : fabricPorts) {
-            FlowRule rule = flowRuleBuilder(leaf, TABLE0)
-                    .withSelector(
-                            DefaultTrafficSelector.builder()
-                                    .matchInPort(port)
-                                    .matchEthType(IPV4.ethType().toShort())
-                                    .matchEthDst(srcHost.mac())
-                                    .build())
-                    .withTreatment(
-                            DefaultTrafficTreatment.builder()
-                                    .setOutput(hostPort)
-                                    .build())
-                    .build();
-            rules.add(rule);
-        }
-
-        return rules;
-    }
-
-    @Override
-    public List<FlowRule> generateSpineRules(DeviceId deviceId, Collection<Host> dstHosts, Topology topo)
-            throws FlowRuleGeneratorException {
-
-        List<FlowRule> rules = Lists.newArrayList();
-
-        // for each host
-        for (Host dstHost : dstHosts) {
-
-            Set<Path> paths = topologyService.getPaths(topo, deviceId, dstHost.location().deviceId());
-
-            if (paths.size() == 0) {
-                log.warn("Can't find any path between spine {} and host {}", deviceId, dstHost);
-                throw new FlowRuleGeneratorException();
-            }
-
-            TrafficTreatment treatment;
-
-            if (paths.size() == 1) {
-                // Only one path, do output on port.
-                PortNumber port = paths.iterator().next().src().port();
-                treatment = DefaultTrafficTreatment.builder().setOutput(port).build();
-            } else {
-                // Multiple paths, do ECMP.
-                Set<PortNumber> portNumbers = paths.stream().map(p -> p.src().port()).collect(toSet());
-                Pair<ExtensionTreatment, List<FlowRule>> result = provisionEcmpTreatment(deviceId, portNumbers);
-                rules.addAll(result.getRight());
-                treatment = DefaultTrafficTreatment.builder().extension(result.getLeft(), deviceId).build();
-            }
-
-            FlowRule rule = flowRuleBuilder(deviceId, TABLE0)
-                    .withSelector(
-                            DefaultTrafficSelector.builder()
-                                    .matchEthType(IPV4.ethType().toShort())
-                                    .matchEthDst(dstHost.mac())
-                                    .build())
-                    .withTreatment(treatment)
-                    .build();
-
-            rules.add(rule);
-        }
-
-        return rules;
-    }
-
-    private Pair<ExtensionTreatment, List<FlowRule>> provisionEcmpTreatment(DeviceId deviceId,
-                                                                            Set<PortNumber> fabricPorts)
-            throws FlowRuleGeneratorException {
-
-        // Install ECMP group table entries that map from hash values to actual fabric ports...
-        int groupId = groupIdOf(deviceId, fabricPorts);
-        int groupSize = fabricPorts.size();
-        Iterator<PortNumber> portIterator = fabricPorts.iterator();
-        List<FlowRule> rules = Lists.newArrayList();
-        for (short i = 0; i < groupSize; i++) {
-            ExtensionSelector extSelector = buildEcmpSelector(groupId, i);
-            FlowRule rule = flowRuleBuilder(deviceId, ECMP_GROUP_TABLE)
-                    .withSelector(
-                            DefaultTrafficSelector.builder()
-                                    .extension(extSelector, deviceId)
-                                    .build())
-                    .withTreatment(
-                            DefaultTrafficTreatment.builder()
-                                    .setOutput(portIterator.next())
-                                    .build())
-                    .build();
-            rules.add(rule);
-        }
-
-        ExtensionTreatment extTreatment = buildEcmpTreatment(groupId, groupSize);
-
-        return Pair.of(extTreatment, rules);
-    }
-
-    private Bmv2ExtensionTreatment buildEcmpTreatment(int groupId, int groupSize) {
-        return Bmv2ExtensionTreatment.builder()
-                .forConfiguration(ECMP_CONTEXT.configuration())
-                .setActionName(ECMP_GROUP)
-                .addParameter(GROUP_ID, groupId)
-                .addParameter(GROUP_SIZE, groupSize)
-                .build();
-    }
-
-    private Bmv2ExtensionSelector buildEcmpSelector(int groupId, int selector) {
-        return Bmv2ExtensionSelector.builder()
-                .forConfiguration(ECMP_CONTEXT.configuration())
-                .matchExact(ECMP_METADATA, GROUP_ID, groupId)
-                .matchExact(ECMP_METADATA, SELECTOR, selector)
-                .build();
-    }
-
-
-    public int groupIdOf(DeviceId deviceId, Set<PortNumber> ports) {
-        DEVICE_GROUP_ID_MAP.putIfAbsent(deviceId, Maps.newHashMap());
-        // Counts the number of unique portNumber sets for each deviceId.
-        // Each distinct set of portNumbers will have a unique ID.
-        return DEVICE_GROUP_ID_MAP.get(deviceId).computeIfAbsent(ports, (pp) ->
-                (short) (DEVICE_GROUP_ID_MAP.get(deviceId).size() + 1));
-    }
-
-    private static Bmv2Configuration loadConfiguration() {
-        try {
-            JsonObject json = Json.parse(new BufferedReader(new InputStreamReader(
-                    EcmpFabricApp.class.getResourceAsStream(JSON_CONFIG_PATH)))).asObject();
-            return Bmv2DefaultConfiguration.parse(json);
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to load configuration", e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/EcmpInterpreter.java b/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/EcmpInterpreter.java
deleted file mode 100644
index c5ea2ae..0000000
--- a/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/EcmpInterpreter.java
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.demo.app.ecmp;
-
-import com.google.common.collect.ImmutableBiMap;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.bmv2.api.context.Bmv2InterpreterException;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criterion;
-import org.onosproject.net.flow.instructions.Instruction;
-
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence;
-import static org.onosproject.net.PortNumber.CONTROLLER;
-import static org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
-
-/**
- * Implementation of a BMv2 interpreter for the ecmp.json configuration.
- */
-public class EcmpInterpreter implements Bmv2Interpreter {
-
-    protected static final String ECMP_METADATA = "ecmp_metadata";
-    protected static final String SELECTOR = "selector";
-    protected static final String GROUP_ID = "groupId";
-    protected static final String GROUP_SIZE = "groupSize";
-    protected static final String ECMP_GROUP = "ecmp_group";
-    protected static final String ECMP_GROUP_TABLE = "ecmp_group_table";
-    protected static final String TABLE0 = "table0";
-    protected static final String SEND_TO_CPU = "send_to_cpu";
-    protected static final String DROP = "_drop";
-    protected static final String SET_EGRESS_PORT = "set_egress_port";
-    protected static final String PORT = "port";
-
-    private static final ImmutableBiMap<Criterion.Type, String> CRITERION_TYPE_MAP = ImmutableBiMap.of(
-            Criterion.Type.IN_PORT, "standard_metadata.ingress_port",
-            Criterion.Type.ETH_DST, "ethernet.dstAddr",
-            Criterion.Type.ETH_SRC, "ethernet.srcAddr",
-            Criterion.Type.ETH_TYPE, "ethernet.etherType");
-
-    private static final ImmutableBiMap<Integer, String> TABLE_ID_MAP = ImmutableBiMap.of(
-            0, TABLE0,
-            1, ECMP_GROUP_TABLE);
-
-    @Override
-    public ImmutableBiMap<Integer, String> tableIdMap() {
-        return TABLE_ID_MAP;
-    }
-
-    @Override
-    public ImmutableBiMap<Criterion.Type, String> criterionTypeMap() {
-        return CRITERION_TYPE_MAP;
-    }
-
-    @Override
-    public Bmv2Action mapTreatment(TrafficTreatment treatment, Bmv2Configuration configuration)
-            throws Bmv2InterpreterException {
-
-        if (treatment.allInstructions().size() == 0) {
-            // No instructions means drop for us.
-            return actionWithName(DROP);
-        } else if (treatment.allInstructions().size() > 1) {
-            // Otherwise, we understand treatments with only 1 instruction.
-            throw new Bmv2InterpreterException("Treatment has multiple instructions");
-        }
-
-        Instruction instruction = treatment.allInstructions().get(0);
-
-        switch (instruction.type()) {
-            case OUTPUT:
-                OutputInstruction outInstruction = (OutputInstruction) instruction;
-                PortNumber port = outInstruction.port();
-                if (!port.isLogical()) {
-                    return buildEgressAction(port, configuration);
-                } else if (port.equals(CONTROLLER)) {
-                    return actionWithName(SEND_TO_CPU);
-                } else {
-                    throw new Bmv2InterpreterException("Egress on logical port not supported: " + port);
-                }
-            case NOACTION:
-                return actionWithName(DROP);
-            default:
-                throw new Bmv2InterpreterException("Instruction type not supported: " + instruction.type().name());
-        }
-    }
-
-    private static Bmv2Action buildEgressAction(PortNumber port, Bmv2Configuration configuration)
-            throws Bmv2InterpreterException {
-
-        int portBitWidth = configuration.action(SET_EGRESS_PORT).runtimeData(PORT).bitWidth();
-
-        try {
-            ImmutableByteSequence portBs = fitByteSequence(ImmutableByteSequence.copyFrom(port.toLong()), portBitWidth);
-            return Bmv2Action.builder()
-                    .withName(SET_EGRESS_PORT)
-                    .addParameter(portBs)
-                    .build();
-        } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) {
-            throw new Bmv2InterpreterException(e.getMessage());
-        }
-    }
-
-    private static Bmv2Action actionWithName(String name) {
-        return Bmv2Action.builder().withName(name).build();
-    }
-}
diff --git a/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/package-info.java b/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/package-info.java
deleted file mode 100644
index 2980242..0000000
--- a/apps/bmv2-demo/ecmp/src/main/java/org/onosproject/bmv2/demo/app/ecmp/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 demo app for the ECMP configuration.
- */
-package org.onosproject.bmv2.demo.app.ecmp;
\ No newline at end of file
diff --git a/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json b/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json
deleted file mode 100644
index 5bf2d4a..0000000
--- a/apps/bmv2-demo/ecmp/src/main/resources/ecmp.json
+++ /dev/null
@@ -1,909 +0,0 @@
-{
-    "header_types": [
-        {
-            "name": "standard_metadata_t",
-            "id": 0,
-            "fields": [
-                [
-                    "ingress_port",
-                    9
-                ],
-                [
-                    "packet_length",
-                    32
-                ],
-                [
-                    "egress_spec",
-                    9
-                ],
-                [
-                    "egress_port",
-                    9
-                ],
-                [
-                    "egress_instance",
-                    32
-                ],
-                [
-                    "instance_type",
-                    32
-                ],
-                [
-                    "clone_spec",
-                    32
-                ],
-                [
-                    "_padding",
-                    5
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "intrinsic_metadata_t",
-            "id": 1,
-            "fields": [
-                [
-                    "ingress_global_timestamp",
-                    32
-                ],
-                [
-                    "lf_field_list",
-                    32
-                ],
-                [
-                    "mcast_grp",
-                    16
-                ],
-                [
-                    "egress_rid",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ethernet_t",
-            "id": 2,
-            "fields": [
-                [
-                    "dstAddr",
-                    48
-                ],
-                [
-                    "srcAddr",
-                    48
-                ],
-                [
-                    "etherType",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ipv4_t",
-            "id": 3,
-            "fields": [
-                [
-                    "version",
-                    4
-                ],
-                [
-                    "ihl",
-                    4
-                ],
-                [
-                    "diffserv",
-                    8
-                ],
-                [
-                    "totalLen",
-                    16
-                ],
-                [
-                    "identification",
-                    16
-                ],
-                [
-                    "flags",
-                    3
-                ],
-                [
-                    "fragOffset",
-                    13
-                ],
-                [
-                    "ttl",
-                    8
-                ],
-                [
-                    "protocol",
-                    8
-                ],
-                [
-                    "hdrChecksum",
-                    16
-                ],
-                [
-                    "srcAddr",
-                    32
-                ],
-                [
-                    "dstAddr",
-                    32
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "tcp_t",
-            "id": 4,
-            "fields": [
-                [
-                    "srcPort",
-                    16
-                ],
-                [
-                    "dstPort",
-                    16
-                ],
-                [
-                    "seqNo",
-                    32
-                ],
-                [
-                    "ackNo",
-                    32
-                ],
-                [
-                    "dataOffset",
-                    4
-                ],
-                [
-                    "res",
-                    3
-                ],
-                [
-                    "ecn",
-                    3
-                ],
-                [
-                    "ctrl",
-                    6
-                ],
-                [
-                    "window",
-                    16
-                ],
-                [
-                    "checksum",
-                    16
-                ],
-                [
-                    "urgentPtr",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "udp_t",
-            "id": 5,
-            "fields": [
-                [
-                    "srcPort",
-                    16
-                ],
-                [
-                    "dstPort",
-                    16
-                ],
-                [
-                    "length_",
-                    16
-                ],
-                [
-                    "checksum",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ecmp_metadata_t",
-            "id": 6,
-            "fields": [
-                [
-                    "groupId",
-                    16
-                ],
-                [
-                    "selector",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        }
-    ],
-    "headers": [
-        {
-            "name": "standard_metadata",
-            "id": 0,
-            "header_type": "standard_metadata_t",
-            "metadata": true
-        },
-        {
-            "name": "intrinsic_metadata",
-            "id": 1,
-            "header_type": "intrinsic_metadata_t",
-            "metadata": true
-        },
-        {
-            "name": "ethernet",
-            "id": 2,
-            "header_type": "ethernet_t",
-            "metadata": false
-        },
-        {
-            "name": "ipv4",
-            "id": 3,
-            "header_type": "ipv4_t",
-            "metadata": false
-        },
-        {
-            "name": "tcp",
-            "id": 4,
-            "header_type": "tcp_t",
-            "metadata": false
-        },
-        {
-            "name": "udp",
-            "id": 5,
-            "header_type": "udp_t",
-            "metadata": false
-        },
-        {
-            "name": "ecmp_metadata",
-            "id": 6,
-            "header_type": "ecmp_metadata_t",
-            "metadata": true
-        }
-    ],
-    "header_stacks": [],
-    "parsers": [
-        {
-            "name": "parser",
-            "id": 0,
-            "init_state": "start",
-            "parse_states": [
-                {
-                    "name": "start",
-                    "id": 0,
-                    "parser_ops": [],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": "parse_ethernet"
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_ethernet",
-                    "id": 1,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "ethernet"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ethernet",
-                                "etherType"
-                            ]
-                        }
-                    ],
-                    "transitions": [
-                        {
-                            "value": "0x0800",
-                            "mask": null,
-                            "next_state": "parse_ipv4"
-                        },
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_ipv4",
-                    "id": 2,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "ipv4"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ipv4",
-                                "fragOffset"
-                            ]
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "ipv4",
-                                "protocol"
-                            ]
-                        }
-                    ],
-                    "transitions": [
-                        {
-                            "value": "0x000006",
-                            "mask": null,
-                            "next_state": "parse_tcp"
-                        },
-                        {
-                            "value": "0x000011",
-                            "mask": null,
-                            "next_state": "parse_udp"
-                        },
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_tcp",
-                    "id": 3,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "tcp"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_udp",
-                    "id": 4,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "udp"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "deparsers": [
-        {
-            "name": "deparser",
-            "id": 0,
-            "order": [
-                "ethernet",
-                "ipv4",
-                "udp",
-                "tcp"
-            ]
-        }
-    ],
-    "meter_arrays": [],
-    "actions": [
-        {
-            "name": "_drop",
-            "id": 0,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0x1ff"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "ecmp_group",
-            "id": 1,
-            "runtime_data": [
-                {
-                    "name": "groupId",
-                    "bitwidth": 16
-                },
-                {
-                    "name": "groupSize",
-                    "bitwidth": 16
-                }
-            ],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ecmp_metadata",
-                                "groupId"
-                            ]
-                        },
-                        {
-                            "type": "runtime_data",
-                            "value": 0
-                        }
-                    ]
-                },
-                {
-                    "op": "modify_field_with_hash_based_offset",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ecmp_metadata",
-                                "selector"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0x0"
-                        },
-                        {
-                            "type": "calculation",
-                            "value": "ecmp_hash"
-                        },
-                        {
-                            "type": "runtime_data",
-                            "value": 1
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "send_to_cpu",
-            "id": 2,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0xff"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "count_packet",
-            "id": 3,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "count",
-                    "parameters": [
-                        {
-                            "type": "counter_array",
-                            "value": "ingress_port_counter"
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ]
-                        }
-                    ]
-                },
-                {
-                    "op": "count",
-                    "parameters": [
-                        {
-                            "type": "counter_array",
-                            "value": "egress_port_counter"
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "set_egress_port",
-            "id": 4,
-            "runtime_data": [
-                {
-                    "name": "port",
-                    "bitwidth": 9
-                }
-            ],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "runtime_data",
-                            "value": 0
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "pipelines": [
-        {
-            "name": "ingress",
-            "id": 0,
-            "init_table": "table0",
-            "tables": [
-                {
-                    "name": "port_count_table",
-                    "id": 0,
-                    "match_type": "exact",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": false,
-                    "direct_meters": null,
-                    "support_timeout": false,
-                    "key": [],
-                    "actions": [
-                        "count_packet"
-                    ],
-                    "next_tables": {
-                        "count_packet": null
-                    },
-                    "default_action": null,
-                    "base_default_next": null
-                },
-                {
-                    "name": "table0",
-                    "id": 1,
-                    "match_type": "ternary",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": true,
-                    "direct_meters": null,
-                    "support_timeout": true,
-                    "key": [
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "dstAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "srcAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "etherType"
-                            ],
-                            "mask": null
-                        }
-                    ],
-                    "actions": [
-                        "set_egress_port",
-                        "ecmp_group",
-                        "send_to_cpu",
-                        "_drop"
-                    ],
-                    "next_tables": {
-                        "set_egress_port": "_condition_0",
-                        "ecmp_group": "ecmp_group_table",
-                        "send_to_cpu": "_condition_0",
-                        "_drop": "_condition_0"
-                    },
-                    "default_action": null,
-                    "base_default_next": "_condition_0"
-                },
-                {
-                    "name": "ecmp_group_table",
-                    "id": 2,
-                    "match_type": "exact",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": true,
-                    "direct_meters": null,
-                    "support_timeout": false,
-                    "key": [
-                        {
-                            "match_type": "exact",
-                            "target": [
-                                "ecmp_metadata",
-                                "groupId"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "exact",
-                            "target": [
-                                "ecmp_metadata",
-                                "selector"
-                            ],
-                            "mask": null
-                        }
-                    ],
-                    "actions": [
-                        "set_egress_port"
-                    ],
-                    "next_tables": {
-                        "set_egress_port": "_condition_0"
-                    },
-                    "default_action": null,
-                    "base_default_next": "_condition_0"
-                }
-            ],
-            "conditionals": [
-                {
-                    "name": "_condition_0",
-                    "id": 0,
-                    "expression": {
-                        "type": "expression",
-                        "value": {
-                            "op": "<",
-                            "left": {
-                                "type": "field",
-                                "value": [
-                                    "standard_metadata",
-                                    "egress_spec"
-                                ]
-                            },
-                            "right": {
-                                "type": "hexstr",
-                                "value": "0xfe"
-                            }
-                        }
-                    },
-                    "true_next": "port_count_table",
-                    "false_next": null
-                }
-            ]
-        },
-        {
-            "name": "egress",
-            "id": 1,
-            "init_table": null,
-            "tables": [],
-            "conditionals": []
-        }
-    ],
-    "calculations": [
-        {
-            "name": "ecmp_hash",
-            "id": 0,
-            "input": [
-                {
-                    "type": "field",
-                    "value": [
-                        "ipv4",
-                        "srcAddr"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "ipv4",
-                        "dstAddr"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "ipv4",
-                        "protocol"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "tcp",
-                        "srcPort"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "tcp",
-                        "dstPort"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "udp",
-                        "srcPort"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "udp",
-                        "dstPort"
-                    ]
-                }
-            ],
-            "algo": "bmv2_hash"
-        }
-    ],
-    "checksums": [],
-    "learn_lists": [],
-    "field_lists": [],
-    "counter_arrays": [
-        {
-            "name": "ingress_port_counter",
-            "id": 0,
-            "is_direct": false,
-            "size": 254
-        },
-        {
-            "name": "egress_port_counter",
-            "id": 1,
-            "is_direct": false,
-            "size": 254
-        },
-        {
-            "name": "table0_counter",
-            "id": 2,
-            "is_direct": true,
-            "binding": "table0"
-        },
-        {
-            "name": "ecmp_group_table_counter",
-            "id": 3,
-            "is_direct": true,
-            "binding": "ecmp_group_table"
-        }
-    ],
-    "register_arrays": [],
-    "force_arith": [
-        [
-            "standard_metadata",
-            "ingress_port"
-        ],
-        [
-            "standard_metadata",
-            "packet_length"
-        ],
-        [
-            "standard_metadata",
-            "egress_spec"
-        ],
-        [
-            "standard_metadata",
-            "egress_port"
-        ],
-        [
-            "standard_metadata",
-            "egress_instance"
-        ],
-        [
-            "standard_metadata",
-            "instance_type"
-        ],
-        [
-            "standard_metadata",
-            "clone_spec"
-        ],
-        [
-            "standard_metadata",
-            "_padding"
-        ],
-        [
-            "intrinsic_metadata",
-            "ingress_global_timestamp"
-        ],
-        [
-            "intrinsic_metadata",
-            "lf_field_list"
-        ],
-        [
-            "intrinsic_metadata",
-            "mcast_grp"
-        ],
-        [
-            "intrinsic_metadata",
-            "egress_rid"
-        ]
-    ]
-}
\ No newline at end of file
diff --git a/apps/bmv2-demo/pom.xml b/apps/bmv2-demo/pom.xml
deleted file mode 100644
index 9738528..0000000
--- a/apps/bmv2-demo/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.onosproject</groupId>
-        <artifactId>onos-apps</artifactId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>onos-app-bmv2-demo</artifactId>
-
-    <packaging>pom</packaging>
-
-    <modules>
-        <module>common</module>
-        <module>ecmp</module>
-        <module>wcmp</module>
-    </modules>
-
-</project>
diff --git a/apps/bmv2-demo/wcmp/features.xml b/apps/bmv2-demo/wcmp/features.xml
deleted file mode 100644
index 0bfb827..0000000
--- a/apps/bmv2-demo/wcmp/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-app-bmv2-demo-common/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/apps/bmv2-demo/wcmp/pom.xml b/apps/bmv2-demo/wcmp/pom.xml
deleted file mode 100644
index 3193d51..0000000
--- a/apps/bmv2-demo/wcmp/pom.xml
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <artifactId>onos-app-bmv2-demo</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>onos-app-bmv2-demo-wcmp</artifactId>
-
-    <packaging>bundle</packaging>
-
-    <properties>
-        <onos.app.name>org.onosproject.bmv2-wcmp-fabric</onos.app.name>
-        <onos.app.title>P4/BMv2 Demo Fabric App v2 (WCMP)</onos.app.title>
-        <onos.app.category>Traffic Steering</onos.app.category>
-        <onos.app.url>http://onosproject.org</onos.app.url>
-        <onos.app.readme>P4/BMv2 demo application with WCMP support for a 2-stage clos fabric topology</onos.app.readme>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-app-bmv2-demo-common</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/WcmpFabricApp.java b/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/WcmpFabricApp.java
deleted file mode 100644
index 2d47afb..0000000
--- a/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/WcmpFabricApp.java
+++ /dev/null
@@ -1,359 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.demo.app.wcmp;
-
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2DefaultConfiguration;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionSelector;
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.bmv2.demo.app.common.AbstractUpgradableFabricApp;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Host;
-import org.onosproject.net.Path;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.ExtensionSelector;
-import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.topology.DefaultTopologyVertex;
-import org.onosproject.net.topology.Topology;
-import org.onosproject.net.topology.TopologyGraph;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static java.util.stream.Collectors.toList;
-import static java.util.stream.Collectors.toSet;
-import static org.onlab.packet.EthType.EtherType.IPV4;
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.roundToBytes;
-import static org.onosproject.bmv2.demo.app.wcmp.WcmpInterpreter.*;
-
-/**
- * Implementation of an upgradable fabric app for the WCMP configuration.
- */
-@Component(immediate = true)
-public class WcmpFabricApp extends AbstractUpgradableFabricApp {
-
-    private static final String APP_NAME = "org.onosproject.bmv2-wcmp-fabric";
-    private static final String MODEL_NAME = "WCMP";
-    private static final String JSON_CONFIG_PATH = "/wcmp.json";
-
-    private static final double MULTI_PORT_WEIGHT_COEFFICIENT = 0.85;
-
-    private static final Bmv2Configuration WCMP_CONFIGURATION = loadConfiguration();
-    private static final WcmpInterpreter WCMP_INTERPRETER = new WcmpInterpreter();
-    protected static final Bmv2DeviceContext WCMP_CONTEXT = new Bmv2DeviceContext(WCMP_CONFIGURATION, WCMP_INTERPRETER);
-
-    private static final Map<DeviceId, Map<Map<PortNumber, Double>, Integer>> DEVICE_GROUP_ID_MAP = Maps.newHashMap();
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private Bmv2Controller bmv2Controller;
-
-    /**
-     * TODO.
-     */
-    public WcmpFabricApp() {
-        super(APP_NAME, MODEL_NAME, WCMP_CONTEXT);
-    }
-
-
-    @Override
-    public boolean initDevice(DeviceId deviceId) {
-        try {
-            Bmv2DeviceAgent agent = bmv2Controller.getAgent(deviceId);
-            for (Map.Entry<String, Bmv2Action> entry : WCMP_INTERPRETER.defaultActionsMap().entrySet()) {
-                agent.setTableDefaultAction(entry.getKey(), entry.getValue());
-            }
-            return true;
-        } catch (Bmv2RuntimeException e) {
-            log.debug("Exception while initializing device {}: {}", deviceId, e.explain());
-            return false;
-        }
-    }
-
-    @Override
-    public List<FlowRule> generateLeafRules(DeviceId deviceId, Host srcHost, Collection<Host> dstHosts,
-                                            Collection<DeviceId> availableSpines, Topology topo)
-            throws FlowRuleGeneratorException {
-
-        Set<PortNumber> hostPortNumbers = Sets.newHashSet();
-        Set<PortNumber> fabricPortNumbers = Sets.newHashSet();
-        deviceService.getPorts(deviceId)
-                .forEach(p -> (isFabricPort(p, topo) ? fabricPortNumbers : hostPortNumbers).add(p.number()));
-
-        if (hostPortNumbers.size() != 1 || fabricPortNumbers.size() == 0) {
-            log.error("Leaf switch has invalid port configuration: hostPorts={}, fabricPorts={}",
-                      hostPortNumbers.size(), fabricPortNumbers.size());
-            throw new FlowRuleGeneratorException();
-        }
-        PortNumber hostPort = hostPortNumbers.iterator().next();
-
-        TopologyGraph graph = topologyService.getGraph(topo);
-        // Map key: spine device id, value: leaf switch ports which connect to spine in the key.
-        Map<DeviceId, Set<PortNumber>> spineToPortsMap = Maps.newHashMap();
-        graph.getEdgesFrom(new DefaultTopologyVertex(deviceId)).forEach(edge -> {
-            spineToPortsMap.putIfAbsent(edge.dst().deviceId(), Sets.newHashSet());
-            spineToPortsMap.get(edge.dst().deviceId()).add(edge.link().src().port());
-        });
-
-        double baseWeight = 1d / spineToPortsMap.size();
-
-        int numSinglePorts = (int) spineToPortsMap.values().stream().filter(s -> s.size() == 1).count();
-        int numMultiPorts = spineToPortsMap.size() - numSinglePorts;
-
-        // Reduce weight portion assigned to multi-ports to mitigate flow assignment imbalance (measured empirically).
-        double multiPortBaseWeight = baseWeight * MULTI_PORT_WEIGHT_COEFFICIENT;
-        double excess = (baseWeight - multiPortBaseWeight) * numMultiPorts;
-        double singlePortBaseWeight = baseWeight + (excess / numSinglePorts);
-
-        Map<PortNumber, Double> weighedPortNumbers = Maps.newHashMap();
-        spineToPortsMap.forEach((did, portSet) -> {
-            double base = (portSet.size() == 1) ? singlePortBaseWeight : multiPortBaseWeight;
-            double weight = base / portSet.size();
-            portSet.forEach(portNumber -> weighedPortNumbers.put(portNumber, weight));
-        });
-
-        List<FlowRule> rules = Lists.newArrayList();
-
-
-        Pair<ExtensionTreatment, List<FlowRule>> result = provisionWcmpTreatment(deviceId, weighedPortNumbers);
-        ExtensionTreatment wcmpTreatment = result.getLeft();
-        rules.addAll(result.getRight());
-
-        // From src host to dst hosts, WCMP to all fabric ports.
-        for (Host dstHost : dstHosts) {
-            FlowRule rule = flowRuleBuilder(deviceId, TABLE0)
-                    .withSelector(
-                            DefaultTrafficSelector.builder()
-                                    .matchInPort(hostPort)
-                                    .matchEthType(IPV4.ethType().toShort())
-                                    .matchEthSrc(srcHost.mac())
-                                    .matchEthDst(dstHost.mac())
-                                    .build())
-                    .withTreatment(
-                            DefaultTrafficTreatment.builder()
-                                    .extension(wcmpTreatment, deviceId)
-                                    .build())
-                    .build();
-            rules.add(rule);
-        }
-
-        // From fabric ports to src host.
-        for (PortNumber port : fabricPortNumbers) {
-            FlowRule rule = flowRuleBuilder(deviceId, TABLE0)
-                    .withSelector(
-                            DefaultTrafficSelector.builder()
-                                    .matchInPort(port)
-                                    .matchEthType(IPV4.ethType().toShort())
-                                    .matchEthDst(srcHost.mac())
-                                    .build())
-                    .withTreatment(
-                            DefaultTrafficTreatment.builder()
-                                    .setOutput(hostPort)
-                                    .build())
-                    .build();
-            rules.add(rule);
-        }
-
-        return rules;
-    }
-
-    @Override
-    public List<FlowRule> generateSpineRules(DeviceId deviceId, Collection<Host> dstHosts, Topology topo)
-            throws FlowRuleGeneratorException {
-
-        List<FlowRule> rules = Lists.newArrayList();
-
-        for (Host dstHost : dstHosts) {
-
-            Set<Path> paths = topologyService.getPaths(topo, deviceId, dstHost.location().deviceId());
-
-            if (paths.size() == 0) {
-                log.warn("Can't find any path between spine {} and host {}", deviceId, dstHost);
-                throw new FlowRuleGeneratorException();
-            }
-
-            TrafficTreatment treatment;
-
-            if (paths.size() == 1) {
-                // Only one path.
-                PortNumber port = paths.iterator().next().src().port();
-                treatment = DefaultTrafficTreatment.builder().setOutput(port).build();
-            } else {
-                // Multiple paths, do WCMP.
-                Set<PortNumber> portNumbers = paths.stream().map(p -> p.src().port()).collect(toSet());
-                double weight = 1d / portNumbers.size();
-                // Same weight for all ports.
-                Map<PortNumber, Double> weightedPortNumbers = portNumbers.stream()
-                        .collect(Collectors.toMap(p -> p, p -> weight));
-                Pair<ExtensionTreatment, List<FlowRule>> result = provisionWcmpTreatment(deviceId, weightedPortNumbers);
-                rules.addAll(result.getRight());
-                treatment = DefaultTrafficTreatment.builder().extension(result.getLeft(), deviceId).build();
-            }
-
-            FlowRule rule = flowRuleBuilder(deviceId, TABLE0)
-                    .withSelector(
-                            DefaultTrafficSelector.builder()
-                                    .matchEthType(IPV4.ethType().toShort())
-                                    .matchEthDst(dstHost.mac())
-                                    .build())
-                    .withTreatment(treatment)
-                    .build();
-
-            rules.add(rule);
-        }
-
-        return rules;
-    }
-
-    private Pair<ExtensionTreatment, List<FlowRule>> provisionWcmpTreatment(DeviceId deviceId,
-                                                                            Map<PortNumber, Double> weightedFabricPorts)
-            throws FlowRuleGeneratorException {
-
-        // Install WCMP group table entries that map from hash values to fabric ports.
-
-        int groupId = groupIdOf(deviceId, weightedFabricPorts);
-        List<PortNumber> portNumbers = Lists.newArrayList();
-        List<Double> weights = Lists.newArrayList();
-        weightedFabricPorts.forEach((p, w) -> {
-            portNumbers.add(p);
-            weights.add(w);
-        });
-        List<Integer> prefixLengths = toPrefixLengths(weights);
-
-        List<FlowRule> rules = Lists.newArrayList();
-        for (int i = 0; i < portNumbers.size(); i++) {
-            ExtensionSelector extSelector = buildWcmpSelector(groupId, prefixLengths.get(i));
-            FlowRule rule = flowRuleBuilder(deviceId, WCMP_GROUP_TABLE)
-                    .withSelector(DefaultTrafficSelector.builder()
-                                          .extension(extSelector, deviceId)
-                                          .build())
-                    .withTreatment(
-                            DefaultTrafficTreatment.builder()
-                                    .setOutput(portNumbers.get(i))
-                                    .build())
-                    .build();
-            rules.add(rule);
-        }
-
-        ExtensionTreatment extTreatment = buildWcmpTreatment(groupId);
-
-        return Pair.of(extTreatment, rules);
-    }
-
-    private Bmv2ExtensionSelector buildWcmpSelector(int groupId, int prefixLength) {
-        byte[] ones = new byte[roundToBytes(prefixLength)];
-        Arrays.fill(ones, (byte) 0xFF);
-        return Bmv2ExtensionSelector.builder()
-                .forConfiguration(WCMP_CONTEXT.configuration())
-                .matchExact(WCMP_META, GROUP_ID, groupId)
-                .matchLpm(WCMP_META, SELECTOR, ones, prefixLength)
-                .build();
-    }
-
-    private Bmv2ExtensionTreatment buildWcmpTreatment(int groupId) {
-        return Bmv2ExtensionTreatment.builder()
-                .forConfiguration(WCMP_CONTEXT.configuration())
-                .setActionName(WCMP_GROUP)
-                .addParameter(GROUP_ID, groupId)
-                .build();
-    }
-
-    public int groupIdOf(DeviceId did, Map<PortNumber, Double> weightedPorts) {
-        DEVICE_GROUP_ID_MAP.putIfAbsent(did, Maps.newHashMap());
-        // Counts the number of unique portNumber sets for each device ID.
-        // Each distinct set of portNumbers will have a unique ID.
-        return DEVICE_GROUP_ID_MAP.get(did).computeIfAbsent(weightedPorts,
-                                                            (pp) -> DEVICE_GROUP_ID_MAP.get(did).size() + 1);
-    }
-
-    public List<Integer> toPrefixLengths(List<Double> weigths) {
-
-        final double weightSum = weigths.stream()
-                .mapToDouble(Double::doubleValue)
-                .map(this::roundDouble)
-                .sum();
-
-        if (Math.abs(weightSum - 1) > 0.0001) {
-            throw new RuntimeException("WCMP weights sum is expected to be 1, found was " + weightSum);
-        }
-
-        final int selectorBitWidth = WCMP_CONTEXT.configuration().headerType(WCMP_META_T).field(SELECTOR).bitWidth();
-        final int availableBits = selectorBitWidth - 1;
-
-        List<Long> prefixDiffs = weigths.stream().map(w -> Math.round(w * availableBits)).collect(toList());
-
-        final long bitSum = prefixDiffs.stream().mapToLong(Long::longValue).sum();
-        final long error = availableBits - bitSum;
-
-        if (error != 0) {
-            // Lazy intuition here is that the error can be absorbed by the longest prefixDiff with the minor impact.
-            Long maxDiff = Collections.max(prefixDiffs);
-            int idx = prefixDiffs.indexOf(maxDiff);
-            prefixDiffs.remove(idx);
-            prefixDiffs.add(idx, maxDiff + error);
-        }
-        List<Integer> prefixLengths = Lists.newArrayList();
-
-        int prefix = 1;
-        for (Long p : prefixDiffs) {
-            prefixLengths.add(prefix);
-            prefix += p;
-        }
-        return ImmutableList.copyOf(prefixLengths);
-    }
-
-    private double roundDouble(double n) {
-        // 5 digits precision.
-        return (double) Math.round(n * 100000d) / 100000d;
-    }
-
-    private static Bmv2Configuration loadConfiguration() {
-        try {
-            JsonObject json = Json.parse(new BufferedReader(new InputStreamReader(
-                    WcmpFabricApp.class.getResourceAsStream(JSON_CONFIG_PATH)))).asObject();
-            return Bmv2DefaultConfiguration.parse(json);
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to load configuration", e);
-        }
-    }
-}
\ No newline at end of file
diff --git a/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/WcmpInterpreter.java b/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/WcmpInterpreter.java
deleted file mode 100644
index 19d042d..0000000
--- a/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/WcmpInterpreter.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.demo.app.wcmp;
-
-import com.google.common.collect.ImmutableBiMap;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.bmv2.api.context.Bmv2InterpreterException;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criterion;
-import org.onosproject.net.flow.instructions.Instruction;
-import org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
-
-import java.util.Map;
-
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence;
-import static org.onosproject.net.PortNumber.CONTROLLER;
-
-/**
- * Implementation of a BMv2 interpreter for the wcmp.json configuration.
- */
-public final class WcmpInterpreter implements Bmv2Interpreter {
-
-    protected static final String WCMP_META_T = "wcmp_meta_t";
-    protected static final String WCMP_META = "wcmp_meta";
-    protected static final String SELECTOR = "selector";
-    protected static final String GROUP_ID = "groupId";
-    protected static final String WCMP_GROUP = "wcmp_group";
-    protected static final String WCMP_SET_SELECTOR = "wcmp_set_selector";
-    protected static final String WCMP_SET_SELECTOR_TABLE = "wcmp_set_selector_table";
-    protected static final String WCMP_GROUP_TABLE = "wcmp_group_table";
-    protected static final String TABLE0 = "table0";
-    protected static final String SEND_TO_CPU = "send_to_cpu";
-    protected static final String DROP = "_drop";
-    protected static final String SET_EGRESS_PORT = "set_egress_port";
-    protected static final String PORT = "port";
-
-    private static final ImmutableBiMap<Criterion.Type, String> CRITERION_TYPE_MAP = ImmutableBiMap.of(
-            Criterion.Type.IN_PORT, "standard_metadata.ingress_port",
-            Criterion.Type.ETH_DST, "ethernet.dstAddr",
-            Criterion.Type.ETH_SRC, "ethernet.srcAddr",
-            Criterion.Type.ETH_TYPE, "ethernet.etherType");
-
-    private static final ImmutableBiMap<Integer, String> TABLE_ID_MAP = ImmutableBiMap.of(
-            0, TABLE0,
-            1, WCMP_GROUP_TABLE);
-
-    private static final Map<String, Bmv2Action> DEFAULT_ACTIONS_MAP = ImmutableBiMap.of(
-            WCMP_SET_SELECTOR_TABLE, actionWithName(WCMP_SET_SELECTOR));
-
-    @Override
-    public ImmutableBiMap<Integer, String> tableIdMap() {
-        return TABLE_ID_MAP;
-    }
-
-    @Override
-    public ImmutableBiMap<Criterion.Type, String> criterionTypeMap() {
-        return CRITERION_TYPE_MAP;
-    }
-
-    public Map<String, Bmv2Action> defaultActionsMap() {
-        return DEFAULT_ACTIONS_MAP;
-    }
-
-    @Override
-    public Bmv2Action mapTreatment(TrafficTreatment treatment, Bmv2Configuration configuration)
-            throws Bmv2InterpreterException {
-
-        if (treatment.allInstructions().size() == 0) {
-            // No instructions means drop for us.
-            return actionWithName(DROP);
-        } else if (treatment.allInstructions().size() > 1) {
-            // Otherwise, we understand treatments with only 1 instruction.
-            throw new Bmv2InterpreterException("Treatment has multiple instructions");
-        }
-
-        Instruction instruction = treatment.allInstructions().get(0);
-
-        switch (instruction.type()) {
-            case OUTPUT:
-                OutputInstruction outInstruction = (OutputInstruction) instruction;
-                PortNumber port = outInstruction.port();
-                if (!port.isLogical()) {
-                    return buildEgressAction(port, configuration);
-                } else if (port.equals(CONTROLLER)) {
-                    return actionWithName(SEND_TO_CPU);
-                } else {
-                    throw new Bmv2InterpreterException("Egress on logical port not supported: " + port);
-                }
-            case NOACTION:
-                return actionWithName(DROP);
-            default:
-                throw new Bmv2InterpreterException("Instruction type not supported: " + instruction.type().name());
-        }
-    }
-
-    private static Bmv2Action buildEgressAction(PortNumber port, Bmv2Configuration configuration)
-            throws Bmv2InterpreterException {
-
-        int portBitWidth = configuration.action(SET_EGRESS_PORT).runtimeData(PORT).bitWidth();
-
-        try {
-            ImmutableByteSequence portBs = fitByteSequence(ImmutableByteSequence.copyFrom(port.toLong()), portBitWidth);
-            return Bmv2Action.builder()
-                    .withName(SET_EGRESS_PORT)
-                    .addParameter(portBs)
-                    .build();
-        } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) {
-            throw new Bmv2InterpreterException(e.getMessage());
-        }
-    }
-
-    private static Bmv2Action actionWithName(String name) {
-        return Bmv2Action.builder().withName(name).build();
-    }
-}
diff --git a/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/package-info.java b/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/package-info.java
deleted file mode 100644
index d4fd1e2..0000000
--- a/apps/bmv2-demo/wcmp/src/main/java/org/onosproject/bmv2/demo/app/wcmp/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 demo app for the WCMP configuration.
- */
-package org.onosproject.bmv2.demo.app.wcmp;
\ No newline at end of file
diff --git a/apps/bmv2-demo/wcmp/src/main/resources/wcmp.json b/apps/bmv2-demo/wcmp/src/main/resources/wcmp.json
deleted file mode 100644
index 1dd6c02..0000000
--- a/apps/bmv2-demo/wcmp/src/main/resources/wcmp.json
+++ /dev/null
@@ -1,1000 +0,0 @@
-{
-    "header_types": [
-        {
-            "name": "standard_metadata_t",
-            "id": 0,
-            "fields": [
-                [
-                    "ingress_port",
-                    9
-                ],
-                [
-                    "packet_length",
-                    32
-                ],
-                [
-                    "egress_spec",
-                    9
-                ],
-                [
-                    "egress_port",
-                    9
-                ],
-                [
-                    "egress_instance",
-                    32
-                ],
-                [
-                    "instance_type",
-                    32
-                ],
-                [
-                    "clone_spec",
-                    32
-                ],
-                [
-                    "_padding",
-                    5
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "intrinsic_metadata_t",
-            "id": 1,
-            "fields": [
-                [
-                    "ingress_global_timestamp",
-                    32
-                ],
-                [
-                    "lf_field_list",
-                    32
-                ],
-                [
-                    "mcast_grp",
-                    16
-                ],
-                [
-                    "egress_rid",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ethernet_t",
-            "id": 2,
-            "fields": [
-                [
-                    "dstAddr",
-                    48
-                ],
-                [
-                    "srcAddr",
-                    48
-                ],
-                [
-                    "etherType",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ipv4_t",
-            "id": 3,
-            "fields": [
-                [
-                    "version",
-                    4
-                ],
-                [
-                    "ihl",
-                    4
-                ],
-                [
-                    "diffserv",
-                    8
-                ],
-                [
-                    "totalLen",
-                    16
-                ],
-                [
-                    "identification",
-                    16
-                ],
-                [
-                    "flags",
-                    3
-                ],
-                [
-                    "fragOffset",
-                    13
-                ],
-                [
-                    "ttl",
-                    8
-                ],
-                [
-                    "protocol",
-                    8
-                ],
-                [
-                    "hdrChecksum",
-                    16
-                ],
-                [
-                    "srcAddr",
-                    32
-                ],
-                [
-                    "dstAddr",
-                    32
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "tcp_t",
-            "id": 4,
-            "fields": [
-                [
-                    "srcPort",
-                    16
-                ],
-                [
-                    "dstPort",
-                    16
-                ],
-                [
-                    "seqNo",
-                    32
-                ],
-                [
-                    "ackNo",
-                    32
-                ],
-                [
-                    "dataOffset",
-                    4
-                ],
-                [
-                    "res",
-                    3
-                ],
-                [
-                    "ecn",
-                    3
-                ],
-                [
-                    "ctrl",
-                    6
-                ],
-                [
-                    "window",
-                    16
-                ],
-                [
-                    "checksum",
-                    16
-                ],
-                [
-                    "urgentPtr",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "udp_t",
-            "id": 5,
-            "fields": [
-                [
-                    "srcPort",
-                    16
-                ],
-                [
-                    "dstPort",
-                    16
-                ],
-                [
-                    "length_",
-                    16
-                ],
-                [
-                    "checksum",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "wcmp_meta_t",
-            "id": 6,
-            "fields": [
-                [
-                    "groupId",
-                    16
-                ],
-                [
-                    "numBits",
-                    8
-                ],
-                [
-                    "selector",
-                    64
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        }
-    ],
-    "headers": [
-        {
-            "name": "standard_metadata",
-            "id": 0,
-            "header_type": "standard_metadata_t",
-            "metadata": true
-        },
-        {
-            "name": "intrinsic_metadata",
-            "id": 1,
-            "header_type": "intrinsic_metadata_t",
-            "metadata": true
-        },
-        {
-            "name": "ethernet",
-            "id": 2,
-            "header_type": "ethernet_t",
-            "metadata": false
-        },
-        {
-            "name": "ipv4",
-            "id": 3,
-            "header_type": "ipv4_t",
-            "metadata": false
-        },
-        {
-            "name": "tcp",
-            "id": 4,
-            "header_type": "tcp_t",
-            "metadata": false
-        },
-        {
-            "name": "udp",
-            "id": 5,
-            "header_type": "udp_t",
-            "metadata": false
-        },
-        {
-            "name": "wcmp_meta",
-            "id": 6,
-            "header_type": "wcmp_meta_t",
-            "metadata": true
-        }
-    ],
-    "header_stacks": [],
-    "parsers": [
-        {
-            "name": "parser",
-            "id": 0,
-            "init_state": "start",
-            "parse_states": [
-                {
-                    "name": "start",
-                    "id": 0,
-                    "parser_ops": [],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": "parse_ethernet"
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_ethernet",
-                    "id": 1,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "ethernet"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ethernet",
-                                "etherType"
-                            ]
-                        }
-                    ],
-                    "transitions": [
-                        {
-                            "value": "0x0800",
-                            "mask": null,
-                            "next_state": "parse_ipv4"
-                        },
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_ipv4",
-                    "id": 2,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "ipv4"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ipv4",
-                                "fragOffset"
-                            ]
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "ipv4",
-                                "protocol"
-                            ]
-                        }
-                    ],
-                    "transitions": [
-                        {
-                            "value": "0x000006",
-                            "mask": null,
-                            "next_state": "parse_tcp"
-                        },
-                        {
-                            "value": "0x000011",
-                            "mask": null,
-                            "next_state": "parse_udp"
-                        },
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_tcp",
-                    "id": 3,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "tcp"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_udp",
-                    "id": 4,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "udp"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "deparsers": [
-        {
-            "name": "deparser",
-            "id": 0,
-            "order": [
-                "ethernet",
-                "ipv4",
-                "tcp",
-                "udp"
-            ]
-        }
-    ],
-    "meter_arrays": [],
-    "actions": [
-        {
-            "name": "set_egress_port",
-            "id": 0,
-            "runtime_data": [
-                {
-                    "name": "port",
-                    "bitwidth": 9
-                }
-            ],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "runtime_data",
-                            "value": 0
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "_drop",
-            "id": 1,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0x1ff"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "send_to_cpu",
-            "id": 2,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0xff"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "wcmp_group",
-            "id": 3,
-            "runtime_data": [
-                {
-                    "name": "groupId",
-                    "bitwidth": 16
-                }
-            ],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "wcmp_meta",
-                                "groupId"
-                            ]
-                        },
-                        {
-                            "type": "runtime_data",
-                            "value": 0
-                        }
-                    ]
-                },
-                {
-                    "op": "modify_field_with_hash_based_offset",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "wcmp_meta",
-                                "numBits"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0x2"
-                        },
-                        {
-                            "type": "calculation",
-                            "value": "wcmp_hash"
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0x3e"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "wcmp_set_selector",
-            "id": 4,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "wcmp_meta",
-                                "selector"
-                            ]
-                        },
-                        {
-                            "type": "expression",
-                            "value": {
-                                "type": "expression",
-                                "value": {
-                                    "op": "<<",
-                                    "left": {
-                                        "type": "expression",
-                                        "value": {
-                                            "op": "-",
-                                            "left": {
-                                                "type": "expression",
-                                                "value": {
-                                                    "op": "<<",
-                                                    "left": {
-                                                        "type": "hexstr",
-                                                        "value": "0x1"
-                                                    },
-                                                    "right": {
-                                                        "type": "field",
-                                                        "value": [
-                                                            "wcmp_meta",
-                                                            "numBits"
-                                                        ]
-                                                    }
-                                                }
-                                            },
-                                            "right": {
-                                                "type": "hexstr",
-                                                "value": "0x1"
-                                            }
-                                        }
-                                    },
-                                    "right": {
-                                        "type": "expression",
-                                        "value": {
-                                            "op": "-",
-                                            "left": {
-                                                "type": "hexstr",
-                                                "value": "0x40"
-                                            },
-                                            "right": {
-                                                "type": "field",
-                                                "value": [
-                                                    "wcmp_meta",
-                                                    "numBits"
-                                                ]
-                                            }
-                                        }
-                                    }
-                                }
-                            }
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "count_packet",
-            "id": 5,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "count",
-                    "parameters": [
-                        {
-                            "type": "counter_array",
-                            "value": "ingress_port_counter"
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ]
-                        }
-                    ]
-                },
-                {
-                    "op": "count",
-                    "parameters": [
-                        {
-                            "type": "counter_array",
-                            "value": "egress_port_counter"
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "pipelines": [
-        {
-            "name": "ingress",
-            "id": 0,
-            "init_table": "table0",
-            "tables": [
-                {
-                    "name": "port_count_table",
-                    "id": 0,
-                    "match_type": "exact",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": false,
-                    "direct_meters": null,
-                    "support_timeout": false,
-                    "key": [],
-                    "actions": [
-                        "count_packet"
-                    ],
-                    "next_tables": {
-                        "count_packet": null
-                    },
-                    "default_action": null,
-                    "base_default_next": null
-                },
-                {
-                    "name": "table0",
-                    "id": 1,
-                    "match_type": "ternary",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": true,
-                    "direct_meters": null,
-                    "support_timeout": true,
-                    "key": [
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "dstAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "srcAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "etherType"
-                            ],
-                            "mask": null
-                        }
-                    ],
-                    "actions": [
-                        "set_egress_port",
-                        "wcmp_group",
-                        "send_to_cpu",
-                        "_drop"
-                    ],
-                    "next_tables": {
-                        "set_egress_port": "_condition_0",
-                        "wcmp_group": "wcmp_set_selector_table",
-                        "send_to_cpu": "_condition_0",
-                        "_drop": "_condition_0"
-                    },
-                    "default_action": null,
-                    "base_default_next": "_condition_0"
-                },
-                {
-                    "name": "wcmp_set_selector_table",
-                    "id": 2,
-                    "match_type": "exact",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": false,
-                    "direct_meters": null,
-                    "support_timeout": false,
-                    "key": [],
-                    "actions": [
-                        "wcmp_set_selector"
-                    ],
-                    "next_tables": {
-                        "wcmp_set_selector": "wcmp_group_table"
-                    },
-                    "default_action": null,
-                    "base_default_next": "_condition_0"
-                },
-                {
-                    "name": "wcmp_group_table",
-                    "id": 3,
-                    "match_type": "lpm",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": true,
-                    "direct_meters": null,
-                    "support_timeout": false,
-                    "key": [
-                        {
-                            "match_type": "exact",
-                            "target": [
-                                "wcmp_meta",
-                                "groupId"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "lpm",
-                            "target": [
-                                "wcmp_meta",
-                                "selector"
-                            ],
-                            "mask": null
-                        }
-                    ],
-                    "actions": [
-                        "set_egress_port"
-                    ],
-                    "next_tables": {
-                        "set_egress_port": "_condition_0"
-                    },
-                    "default_action": null,
-                    "base_default_next": "_condition_0"
-                }
-            ],
-            "conditionals": [
-                {
-                    "name": "_condition_0",
-                    "id": 0,
-                    "expression": {
-                        "type": "expression",
-                        "value": {
-                            "op": "<",
-                            "left": {
-                                "type": "field",
-                                "value": [
-                                    "standard_metadata",
-                                    "egress_spec"
-                                ]
-                            },
-                            "right": {
-                                "type": "hexstr",
-                                "value": "0xfe"
-                            }
-                        }
-                    },
-                    "true_next": "port_count_table",
-                    "false_next": null
-                }
-            ]
-        },
-        {
-            "name": "egress",
-            "id": 1,
-            "init_table": null,
-            "tables": [],
-            "conditionals": []
-        }
-    ],
-    "calculations": [
-        {
-            "name": "wcmp_hash",
-            "id": 0,
-            "input": [
-                {
-                    "type": "field",
-                    "value": [
-                        "ipv4",
-                        "srcAddr"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "ipv4",
-                        "dstAddr"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "ipv4",
-                        "protocol"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "tcp",
-                        "srcPort"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "tcp",
-                        "dstPort"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "udp",
-                        "srcPort"
-                    ]
-                },
-                {
-                    "type": "field",
-                    "value": [
-                        "udp",
-                        "dstPort"
-                    ]
-                }
-            ],
-            "algo": "bmv2_hash"
-        }
-    ],
-    "checksums": [],
-    "learn_lists": [],
-    "field_lists": [],
-    "counter_arrays": [
-        {
-            "name": "ingress_port_counter",
-            "id": 0,
-            "is_direct": false,
-            "size": 254
-        },
-        {
-            "name": "egress_port_counter",
-            "id": 1,
-            "is_direct": false,
-            "size": 254
-        },
-        {
-            "name": "table0_counter",
-            "id": 2,
-            "is_direct": true,
-            "binding": "table0"
-        },
-        {
-            "name": "wcmp_group_table_counter",
-            "id": 3,
-            "is_direct": true,
-            "binding": "wcmp_group_table"
-        }
-    ],
-    "register_arrays": [],
-    "force_arith": [
-        [
-            "standard_metadata",
-            "ingress_port"
-        ],
-        [
-            "standard_metadata",
-            "packet_length"
-        ],
-        [
-            "standard_metadata",
-            "egress_spec"
-        ],
-        [
-            "standard_metadata",
-            "egress_port"
-        ],
-        [
-            "standard_metadata",
-            "egress_instance"
-        ],
-        [
-            "standard_metadata",
-            "instance_type"
-        ],
-        [
-            "standard_metadata",
-            "clone_spec"
-        ],
-        [
-            "standard_metadata",
-            "_padding"
-        ],
-        [
-            "intrinsic_metadata",
-            "ingress_global_timestamp"
-        ],
-        [
-            "intrinsic_metadata",
-            "lf_field_list"
-        ],
-        [
-            "intrinsic_metadata",
-            "mcast_grp"
-        ],
-        [
-            "intrinsic_metadata",
-            "egress_rid"
-        ]
-    ]
-}
\ No newline at end of file
diff --git a/apps/pom.xml b/apps/pom.xml
index d9f93a2..36f95cf 100644
--- a/apps/pom.xml
+++ b/apps/pom.xml
@@ -72,7 +72,6 @@
         <module>gangliametrics</module>
         <module>graphitemetrics</module>
         <module>scalablegateway</module>
-        <module>bmv2-demo</module>
         <module>yms</module>
         <module>tetopology</module>
         <module>rabbitmq</module>
diff --git a/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java b/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
index e9715a6..afe1395 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/criteria/ExtensionSelectorType.java
@@ -47,7 +47,6 @@
         OFDPA_MATCH_OVID(17),
         OFDPA_MATCH_MPLS_L2_PORT(18),
         EXT_MATCH_FLOW_TYPE(20),
-        BMV2_MATCH_PARAMS(128),
 
         UNRESOLVED_TYPE(200);
 
diff --git a/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java b/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java
index d11a9a9..ca26ecb 100644
--- a/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java
+++ b/core/api/src/main/java/org/onosproject/net/flow/instructions/ExtensionTreatmentType.java
@@ -72,7 +72,6 @@
         NICIRA_ENCAP_ETH_SRC(121),
         NICIRA_ENCAP_ETH_DST(122),
         NICIRA_ENCAP_ETH_TYPE(123),
-        BMV2_ACTION(128),
         OPLINK_ATTENUATION(130),
 
         UNRESOLVED_TYPE(200);
diff --git a/drivers/bmv2/features.xml b/drivers/bmv2/features.xml
deleted file mode 100644
index 0d72ca5..0000000
--- a/drivers/bmv2/features.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-bmv2-protocol-api/${project.version}</bundle>
-    </feature>
-</features>
diff --git a/drivers/bmv2/pom.xml b/drivers/bmv2/pom.xml
deleted file mode 100644
index cb9a8122..0000000
--- a/drivers/bmv2/pom.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-drivers-general</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-drivers-bmv2</artifactId>
-
-    <packaging>bundle</packaging>
-
-    <description>Device drivers for p4.org reference softswitch BMv2</description>
-
-    <properties>
-        <onos.app.name>org.onosproject.drivers.bmv2</onos.app.name>
-        <onos.app.origin>ON.Lab</onos.app.origin>
-        <onos.app.category>Drivers</onos.app.category>
-        <onos.app.title>BMv2 Drivers</onos.app.title>
-        <onos.app.url>http://onosproject.org</onos.app.url>
-        <onos.app.requires>
-            org.onosproject.bmv2
-        </onos.app.requires>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-protocol-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-drivers</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DeviceDescriptionDiscovery.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DeviceDescriptionDiscovery.java
deleted file mode 100644
index 29543bf..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DeviceDescriptionDiscovery.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.drivers.bmv2;
-
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import org.onlab.osgi.ServiceNotFoundException;
-import org.onlab.packet.ChassisId;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.net.AnnotationKeys;
-import org.onosproject.net.DefaultAnnotations;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DefaultDeviceDescription;
-import org.onosproject.net.device.DefaultPortDescription;
-import org.onosproject.net.device.DeviceDescription;
-import org.onosproject.net.device.DeviceDescriptionDiscovery;
-import org.onosproject.net.device.PortDescription;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigInteger;
-import java.util.List;
-
-import static org.onosproject.bmv2.api.runtime.Bmv2Device.*;
-import static org.onosproject.net.Device.Type.SWITCH;
-
-/**
- * Implementation of the device description discovery behaviour for BMv2.
- */
-public class Bmv2DeviceDescriptionDiscovery extends AbstractHandlerBehaviour implements DeviceDescriptionDiscovery {
-
-    private static final String JSON_CONFIG_MD5 = "bmv2JsonConfigMd5";
-    private static final String PROCESS_INSTANCE_ID = "bmv2ProcessInstanceId";
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    private Bmv2Controller controller;
-
-    private boolean init() {
-        try {
-            controller = handler().get(Bmv2Controller.class);
-            return true;
-        } catch (ServiceNotFoundException e) {
-            log.warn(e.getMessage());
-            return false;
-        }
-    }
-
-    @Override
-    public DeviceDescription discoverDeviceDetails() {
-
-        if (!init()) {
-            return null;
-        }
-
-        DeviceId deviceId = handler().data().deviceId();
-
-        Bmv2DeviceAgent deviceAgent;
-        try {
-            deviceAgent = controller.getAgent(deviceId);
-        } catch (Bmv2RuntimeException e) {
-            log.error("Failed to connect to Bmv2 device", e);
-            return null;
-        }
-
-        DefaultAnnotations.Builder annotationsBuilder = DefaultAnnotations.builder();
-
-        try {
-            String md5 = deviceAgent.getJsonConfigMd5();
-            BigInteger i = new BigInteger(1, md5.getBytes());
-            annotationsBuilder.set(JSON_CONFIG_MD5, String.format("%1$032X", i).toLowerCase());
-        } catch (Bmv2RuntimeException e) {
-            log.warn("Unable to dump JSON configuration from {}: {}", deviceId, e.explain());
-        }
-        try {
-            int instanceId = deviceAgent.getProcessInstanceId();
-            annotationsBuilder.set(PROCESS_INSTANCE_ID, String.valueOf(instanceId));
-        } catch (Bmv2RuntimeException e) {
-            log.warn("Unable to get process instance ID from {}: {}", deviceId, e.explain());
-        }
-
-        annotationsBuilder.set(AnnotationKeys.PROTOCOL, PROTOCOL);
-
-        return new DefaultDeviceDescription(deviceId.uri(),
-                                            SWITCH,
-                                            MANUFACTURER,
-                                            HW_VERSION,
-                                            SW_VERSION,
-                                            SERIAL_NUMBER,
-                                            new ChassisId(),
-                                            annotationsBuilder.build());
-    }
-
-    @Override
-    public List<PortDescription> discoverPortDetails() {
-
-        if (!init()) {
-            return null;
-        }
-
-        DeviceId deviceId = handler().data().deviceId();
-
-        Bmv2DeviceAgent deviceAgent;
-        try {
-            deviceAgent = controller.getAgent(deviceId);
-        } catch (Bmv2RuntimeException e) {
-            log.error("Failed to connect to Bmv2 device", e);
-            return null;
-        }
-
-        List<PortDescription> portDescriptions = Lists.newArrayList();
-
-        try {
-            deviceAgent.getPortsInfo().forEach(p -> {
-                PortNumber portNumber = PortNumber.portNumber((long) p.number(), p.ifaceName());
-                portDescriptions.add(new DefaultPortDescription(portNumber, p.isUp(), DefaultAnnotations.EMPTY));
-            });
-        } catch (Bmv2RuntimeException e) {
-            log.error("Unable to get port descriptions of {}: {}", deviceId, e);
-        }
-
-        return ImmutableList.copyOf(portDescriptions);
-    }
-}
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DriversLoader.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DriversLoader.java
deleted file mode 100644
index cf1a2c5..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2DriversLoader.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.drivers.bmv2;
-
-import org.apache.felix.scr.annotations.Component;
-import org.onosproject.net.driver.AbstractDriverLoader;
-
-/**
- * Loader for BMv2 drivers from xml file.
- */
-@Component(immediate = true)
-public class Bmv2DriversLoader extends AbstractDriverLoader {
-
-    private static final String DRIVERS_XML = "/bmv2-drivers.xml";
-
-    public Bmv2DriversLoader() {
-        super(DRIVERS_XML);
-    }
-}
\ No newline at end of file
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2ExtensionSelectorResolver.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2ExtensionSelectorResolver.java
deleted file mode 100644
index 78986a6..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2ExtensionSelectorResolver.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.drivers.bmv2;
-
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionSelector;
-import org.onosproject.net.behaviour.ExtensionSelectorResolver;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.flow.criteria.ExtensionSelector;
-import org.onosproject.net.flow.criteria.ExtensionSelectorType;
-
-import static org.onosproject.net.flow.criteria.ExtensionSelectorType.ExtensionSelectorTypes.BMV2_MATCH_PARAMS;
-
-/**
- * Implementation of the extension selector resolver behaviour for BMv2.
- */
-public class Bmv2ExtensionSelectorResolver extends AbstractHandlerBehaviour implements ExtensionSelectorResolver {
-
-    @Override
-    public ExtensionSelector getExtensionSelector(ExtensionSelectorType type) {
-        if (type.equals(BMV2_MATCH_PARAMS.type())) {
-            return Bmv2ExtensionSelector.empty();
-        }
-
-        return null;
-    }
-}
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2ExtensionTreatmentResolver.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2ExtensionTreatmentResolver.java
deleted file mode 100644
index 6ef46d1..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2ExtensionTreatmentResolver.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.drivers.bmv2;
-
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment;
-import org.onosproject.net.behaviour.ExtensionTreatmentResolver;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
-
-import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.BMV2_ACTION;
-
-/**
- * Implementation of the extension treatment resolver behavior for BMv2.
- */
-public class Bmv2ExtensionTreatmentResolver extends AbstractHandlerBehaviour implements ExtensionTreatmentResolver {
-
-    @Override
-    public ExtensionTreatment getExtensionInstruction(ExtensionTreatmentType type) {
-        if (type.equals(BMV2_ACTION.type())) {
-            return Bmv2ExtensionTreatment.empty();
-        }
-        return null;
-    }
-}
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2FlowRuleProgrammable.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2FlowRuleProgrammable.java
deleted file mode 100644
index cc8574c..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2FlowRuleProgrammable.java
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.drivers.bmv2;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang3.tuple.Pair;
-import org.onlab.osgi.ServiceNotFoundException;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslator;
-import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslatorException;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.bmv2.api.context.Bmv2TableModel;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2FlowRuleWrapper;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchKey;
-import org.onosproject.bmv2.api.runtime.Bmv2ParsedTableEntry;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntry;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntryReference;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.bmv2.api.service.Bmv2DeviceContextService;
-import org.onosproject.bmv2.api.service.Bmv2TableEntryService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.flow.DefaultFlowEntry;
-import org.onosproject.net.flow.FlowEntry;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.FlowRuleProgrammable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import static org.onosproject.bmv2.api.runtime.Bmv2RuntimeException.Code.*;
-import static org.onosproject.net.flow.FlowEntry.FlowEntryState.ADDED;
-
-/**
- * Implementation of the flow rule programmable behaviour for BMv2.
- */
-public class Bmv2FlowRuleProgrammable extends AbstractHandlerBehaviour implements FlowRuleProgrammable {
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    // Needed to synchronize operations over the same table entry.
-    private static final ConcurrentMap<Bmv2TableEntryReference, Lock> ENTRY_LOCKS = Maps.newConcurrentMap();
-
-    private Bmv2Controller controller;
-    private Bmv2TableEntryService tableEntryService;
-    private Bmv2DeviceContextService contextService;
-
-    private boolean init() {
-        try {
-            controller = handler().get(Bmv2Controller.class);
-            tableEntryService = handler().get(Bmv2TableEntryService.class);
-            contextService = handler().get(Bmv2DeviceContextService.class);
-            return true;
-        } catch (ServiceNotFoundException e) {
-            log.warn(e.getMessage());
-            return false;
-        }
-    }
-
-    @Override
-    public Collection<FlowEntry> getFlowEntries() {
-
-        if (!init()) {
-            return Collections.emptyList();
-        }
-
-        DeviceId deviceId = handler().data().deviceId();
-
-        Bmv2DeviceAgent deviceAgent;
-        try {
-            deviceAgent = controller.getAgent(deviceId);
-        } catch (Bmv2RuntimeException e) {
-            log.error("Failed to get BMv2 device agent: {}", e.explain());
-            return Collections.emptyList();
-        }
-
-        Bmv2DeviceContext context = contextService.getContext(deviceId);
-        if (context == null) {
-            log.warn("Unable to get device context for {}", deviceId);
-            return Collections.emptyList();
-        }
-
-        Bmv2Interpreter interpreter = context.interpreter();
-        Bmv2Configuration configuration = context.configuration();
-
-        List<FlowEntry> entryList = Lists.newArrayList();
-
-        for (Bmv2TableModel table : configuration.tables()) {
-            // For each table in the configuration AND exposed by the interpreter.
-            if (!interpreter.tableIdMap().inverse().containsKey(table.name())) {
-                continue; // next table
-            }
-
-            List<Bmv2ParsedTableEntry> installedEntries;
-            try {
-                installedEntries = deviceAgent.getTableEntries(table.name());
-            } catch (Bmv2RuntimeException e) {
-                log.warn("Failed to get table entries of table {} of {}: {}", table.name(), deviceId, e.explain());
-                continue; // next table
-            }
-
-            for (Bmv2ParsedTableEntry parsedEntry : installedEntries) {
-                Bmv2TableEntryReference entryRef = new Bmv2TableEntryReference(deviceId, table.name(),
-                                                                               parsedEntry.matchKey());
-
-                Lock lock = ENTRY_LOCKS.computeIfAbsent(entryRef, key -> new ReentrantLock());
-                lock.lock();
-
-                try {
-                    Bmv2FlowRuleWrapper frWrapper = tableEntryService.lookup(entryRef);
-
-                    if (frWrapper == null) {
-                        log.debug("Missing reference from table entry service. Deleting it. BUG? " +
-                                         "deviceId={}, tableName={}, matchKey={}",
-                                 deviceId, table.name(), entryRef.matchKey());
-                        try {
-                            doRemove(deviceAgent, table.name(), parsedEntry.entryId(), parsedEntry.matchKey());
-                        } catch (Bmv2RuntimeException e) {
-                            log.warn("Unable to remove inconsistent flow rule: {}", e.explain());
-                        }
-                        continue; // next entry
-                    }
-
-                    long remoteEntryId = parsedEntry.entryId();
-                    long localEntryId = frWrapper.entryId();
-
-                    if (remoteEntryId != localEntryId) {
-                        log.debug("getFlowEntries(): inconsistent entry id! BUG? Updating it... remote={}, local={}",
-                                 remoteEntryId, localEntryId);
-                        frWrapper = new Bmv2FlowRuleWrapper(frWrapper.rule(), remoteEntryId,
-                                                            frWrapper.installedOnMillis());
-                        tableEntryService.bind(entryRef, frWrapper);
-                    }
-
-                    long bytes = 0L;
-                    long packets = 0L;
-
-                    if (table.hasCounters()) {
-                        // Read counter values from device.
-                        try {
-                            Pair<Long, Long> counterValue = deviceAgent.readTableEntryCounter(table.name(),
-                                                                                              remoteEntryId);
-                            bytes = counterValue.getLeft();
-                            packets = counterValue.getRight();
-                        } catch (Bmv2RuntimeException e) {
-                            log.warn("Unable to get counters for entry {}/{} of device {}: {}",
-                                     table.name(), remoteEntryId, deviceId, e.explain());
-                        }
-                    }
-
-                    FlowEntry entry = new DefaultFlowEntry(frWrapper.rule(), ADDED, frWrapper.lifeInSeconds(),
-                                                           packets, bytes);
-                    entryList.add(entry);
-
-                } finally {
-                    lock.unlock();
-                }
-            }
-        }
-
-        return Collections.unmodifiableCollection(entryList);
-    }
-
-    @Override
-    public Collection<FlowRule> applyFlowRules(Collection<FlowRule> rules) {
-
-        return processFlowRules(rules, Operation.APPLY);
-    }
-
-    @Override
-    public Collection<FlowRule> removeFlowRules(Collection<FlowRule> rules) {
-
-        return processFlowRules(rules, Operation.REMOVE);
-    }
-
-    private Collection<FlowRule> processFlowRules(Collection<FlowRule> rules, Operation operation) {
-
-        if (!init()) {
-            return Collections.emptyList();
-        }
-
-        DeviceId deviceId = handler().data().deviceId();
-
-        Bmv2DeviceAgent deviceAgent;
-        try {
-            deviceAgent = controller.getAgent(deviceId);
-        } catch (Bmv2RuntimeException e) {
-            log.error("Failed to get BMv2 device agent: {}", e.explain());
-            return Collections.emptyList();
-        }
-
-        Bmv2DeviceContext context = contextService.getContext(deviceId);
-        if (context == null) {
-            log.error("Unable to get device context for {}", deviceId);
-            return Collections.emptyList();
-        }
-
-        Bmv2FlowRuleTranslator translator = tableEntryService.getFlowRuleTranslator();
-
-        List<FlowRule> processedFlowRules = Lists.newArrayList();
-
-        for (FlowRule rule : rules) {
-
-            Bmv2TableEntry bmv2Entry;
-
-            try {
-                bmv2Entry = translator.translate(rule, context);
-            } catch (Bmv2FlowRuleTranslatorException e) {
-                log.warn("Unable to translate flow rule: {} - {}", e.getMessage(), rule);
-                continue; // next rule
-            }
-
-            String tableName = bmv2Entry.tableName();
-            Bmv2TableEntryReference entryRef = new Bmv2TableEntryReference(deviceId, tableName, bmv2Entry.matchKey());
-
-            Lock lock = ENTRY_LOCKS.computeIfAbsent(entryRef, k -> new ReentrantLock());
-            lock.lock();
-            try {
-                // Get from store
-                Bmv2FlowRuleWrapper frWrapper = tableEntryService.lookup(entryRef);
-                try {
-                    if (operation == Operation.APPLY) {
-                        // Apply entry
-                        long entryId;
-                        if (frWrapper != null) {
-                            // Existing entry.
-                            entryId = frWrapper.entryId();
-                            // Tentatively delete entry before re-adding.
-                            // It might not exist on device due to inconsistencies.
-                            silentlyRemove(deviceAgent, entryRef.tableName(), entryId);
-                        }
-                        // Add entry.
-                        entryId = doAddEntry(deviceAgent, bmv2Entry);
-                        frWrapper = new Bmv2FlowRuleWrapper(rule, entryId, System.currentTimeMillis());
-                    } else {
-                        // Remove entry
-                        if (frWrapper == null) {
-                            // Entry not found in map, how come?
-                            forceRemove(deviceAgent, entryRef.tableName(), entryRef.matchKey());
-                        } else {
-                            long entryId = frWrapper.entryId();
-                            doRemove(deviceAgent, entryRef.tableName(), entryId, entryRef.matchKey());
-                        }
-                        frWrapper = null;
-                    }
-                    // If here, no exceptions... things went well :)
-                    processedFlowRules.add(rule);
-                } catch (Bmv2RuntimeException e) {
-                    log.warn("Unable to {} flow rule: {}", operation.name(), e.explain());
-                }
-
-                // Update entryRef binding in table entry service.
-                if (frWrapper != null) {
-                    tableEntryService.bind(entryRef, frWrapper);
-                } else {
-                    tableEntryService.unbind(entryRef);
-                }
-            } finally {
-                lock.unlock();
-            }
-        }
-
-        return processedFlowRules;
-    }
-
-    private long doAddEntry(Bmv2DeviceAgent agent, Bmv2TableEntry entry) throws Bmv2RuntimeException {
-        try {
-            return agent.addTableEntry(entry);
-        } catch (Bmv2RuntimeException e) {
-            if (e.getCode().equals(TABLE_DUPLICATE_ENTRY)) {
-                forceRemove(agent, entry.tableName(), entry.matchKey());
-                return agent.addTableEntry(entry);
-            } else {
-                throw e;
-            }
-        }
-    }
-
-    private void doRemove(Bmv2DeviceAgent agent, String tableName, long entryId, Bmv2MatchKey matchKey)
-            throws Bmv2RuntimeException {
-        try {
-            agent.deleteTableEntry(tableName, entryId);
-        } catch (Bmv2RuntimeException e) {
-            if (e.getCode().equals(TABLE_INVALID_HANDLE) || e.getCode().equals(TABLE_EXPIRED_HANDLE)) {
-                // entry is not there with the declared ID, try with a forced remove.
-                forceRemove(agent, tableName, matchKey);
-            } else {
-                throw e;
-            }
-        }
-    }
-
-    private void forceRemove(Bmv2DeviceAgent agent, String tableName, Bmv2MatchKey matchKey)
-            throws Bmv2RuntimeException {
-        // Find the entryID (expensive call!)
-        for (Bmv2ParsedTableEntry pEntry : agent.getTableEntries(tableName)) {
-            if (pEntry.matchKey().equals(matchKey)) {
-                // Remove entry and drop exceptions.
-                silentlyRemove(agent, tableName, pEntry.entryId());
-                break;
-            }
-        }
-    }
-
-    private void silentlyRemove(Bmv2DeviceAgent agent, String tableName, long entryId) {
-        try {
-            agent.deleteTableEntry(tableName, entryId);
-        } catch (Bmv2RuntimeException e) {
-            // do nothing
-        }
-    }
-
-    private enum Operation {
-        APPLY, REMOVE
-    }
-}
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2PacketProgrammable.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2PacketProgrammable.java
deleted file mode 100644
index e04d875..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2PacketProgrammable.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.drivers.bmv2;
-
-import org.onlab.osgi.ServiceNotFoundException;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.packet.OutboundPacket;
-import org.onosproject.net.packet.PacketProgrammable;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-import static java.lang.Math.toIntExact;
-import static java.util.stream.Collectors.toList;
-import static org.onosproject.net.flow.instructions.Instruction.Type.OUTPUT;
-import static org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
-
-/**
- * Implementation of the packet programmable behaviour for BMv2.
- */
-public class Bmv2PacketProgrammable extends AbstractHandlerBehaviour implements PacketProgrammable {
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    @Override
-    public void emit(OutboundPacket packet) {
-
-        TrafficTreatment treatment = packet.treatment();
-
-        // BMv2 supports only OUTPUT instructions.
-        List<OutputInstruction> outInstructions = treatment.allInstructions()
-                .stream()
-                .filter(i -> i.type().equals(OUTPUT))
-                .map(i -> (OutputInstruction) i)
-                .collect(toList());
-
-        if (treatment.allInstructions().size() != outInstructions.size()) {
-            // There are other instructions that are not of type OUTPUT
-            log.warn("Dropping emit request, treatment nor supported: {}", treatment);
-            return;
-        }
-
-        outInstructions.forEach(outInst -> {
-            if (outInst.port().isLogical()) {
-                log.warn("Dropping emit request, logical port not supported: {}", outInst.port());
-            } else {
-                try {
-                    int portNumber = toIntExact(outInst.port().toLong());
-                    send(portNumber, packet);
-                } catch (ArithmeticException e) {
-                    log.error("Dropping emit request, port number too big: {}", outInst.port().toLong());
-                }
-            }
-        });
-    }
-
-    private void send(int port, OutboundPacket packet) {
-
-        DeviceId deviceId = handler().data().deviceId();
-
-        Bmv2Controller controller;
-        try {
-            controller = handler().get(Bmv2Controller.class);
-        } catch (ServiceNotFoundException e) {
-            log.warn(e.getMessage());
-            return;
-        }
-
-        Bmv2DeviceAgent deviceAgent;
-        try {
-            deviceAgent = controller.getAgent(deviceId);
-        } catch (Bmv2RuntimeException e) {
-            log.error("Failed to get Bmv2 device agent for {}: {}", deviceId, e.explain());
-            return;
-        }
-
-        ImmutableByteSequence bs = ImmutableByteSequence.copyFrom(packet.data());
-        try {
-            deviceAgent.transmitPacket(port, bs);
-        } catch (Bmv2RuntimeException e) {
-            log.warn("Unable to emit packet trough {}: {}", deviceId, e.explain());
-        }
-    }
-}
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2Pipeliner.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2Pipeliner.java
deleted file mode 100644
index 1ce30bd..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/Bmv2Pipeliner.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.drivers.bmv2;
-
-import org.onosproject.driver.pipeline.DefaultSingleTablePipeline;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.behaviour.NextGroup;
-import org.onosproject.net.behaviour.Pipeliner;
-import org.onosproject.net.behaviour.PipelinerContext;
-import org.onosproject.net.driver.AbstractHandlerBehaviour;
-import org.onosproject.net.flowobjective.FilteringObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.net.flowobjective.NextObjective;
-
-import java.util.List;
-
-/**
- * Pipeliner device behaviour implementation for BMv2.
- */
-public class Bmv2Pipeliner extends AbstractHandlerBehaviour implements Pipeliner {
-
-    private Pipeliner pipeliner;
-
-    @Override
-    public void init(DeviceId deviceId, PipelinerContext context) {
-        // TODO: get multi-table pipeliner dynamically based on BMv2 device running model (hard).
-        // Right now we are able to map flow objectives only in the first table of the pipeline.
-        pipeliner = new DefaultSingleTablePipeline();
-        pipeliner.init(deviceId, context);
-    }
-
-    @Override
-    public void filter(FilteringObjective filterObjective) {
-        pipeliner.filter(filterObjective);
-    }
-
-    @Override
-    public void forward(ForwardingObjective forwardObjective) {
-        pipeliner.forward(forwardObjective);
-    }
-
-    @Override
-    public void next(NextObjective nextObjective) {
-        pipeliner.next(nextObjective);
-    }
-
-    @Override
-    public List<String> getNextMappings(NextGroup nextGroup) {
-        return pipeliner.getNextMappings(nextGroup);
-    }
-}
diff --git a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/package-info.java b/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/package-info.java
deleted file mode 100644
index f56998c..0000000
--- a/drivers/bmv2/src/main/java/org/onosproject/drivers/bmv2/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 driver implementation.
- */
-package org.onosproject.drivers.bmv2;
\ No newline at end of file
diff --git a/drivers/bmv2/src/main/resources/bmv2-drivers.xml b/drivers/bmv2/src/main/resources/bmv2-drivers.xml
deleted file mode 100644
index fd0912c..0000000
--- a/drivers/bmv2/src/main/resources/bmv2-drivers.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-<drivers>
-    <driver name="bmv2-thrift" manufacturer="p4.org" hwVersion="bmv2" swVersion="1.0.0">
-        <behaviour api="org.onosproject.net.device.DeviceDescriptionDiscovery"
-                   impl="org.onosproject.drivers.bmv2.Bmv2DeviceDescriptionDiscovery"/>
-        <behaviour api="org.onosproject.net.flow.FlowRuleProgrammable"
-                   impl="org.onosproject.drivers.bmv2.Bmv2FlowRuleProgrammable"/>
-        <behaviour api="org.onosproject.net.behaviour.Pipeliner"
-                   impl="org.onosproject.drivers.bmv2.Bmv2Pipeliner"/>
-        <behaviour api="org.onosproject.net.packet.PacketProgrammable"
-                   impl="org.onosproject.drivers.bmv2.Bmv2PacketProgrammable"/>
-        <behaviour api="org.onosproject.net.behaviour.ExtensionSelectorResolver"
-                   impl="org.onosproject.drivers.bmv2.Bmv2ExtensionSelectorResolver"/>
-        <behaviour api="org.onosproject.net.behaviour.ExtensionTreatmentResolver"
-                   impl="org.onosproject.drivers.bmv2.Bmv2ExtensionTreatmentResolver"/>
-    </driver>
-</drivers>
diff --git a/drivers/pom.xml b/drivers/pom.xml
index aafcc04..99016d9 100644
--- a/drivers/pom.xml
+++ b/drivers/pom.xml
@@ -41,7 +41,6 @@
         <module>lumentum</module>
         <!-- TODO ONOS-5554 excluding from the build -->
         <!--<module>bti</module>-->
-        <module>bmv2</module>
         <module>corsa</module>
         <module>optical</module>
         <module>arista</module>
diff --git a/protocols/bmv2/api/pom.xml b/protocols/bmv2/api/pom.xml
deleted file mode 100644
index c3bd01e..0000000
--- a/protocols/bmv2/api/pom.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-bmv2-protocol</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <packaging>bundle</packaging>
-
-    <artifactId>onos-bmv2-protocol-api</artifactId>
-
-   <dependencies>
-       <dependency>
-           <groupId>org.onosproject</groupId>
-           <artifactId>onos-api</artifactId>
-       </dependency>
-       <dependency>
-           <groupId>org.apache.felix</groupId>
-           <artifactId>org.apache.felix.scr.annotations</artifactId>
-       </dependency>
-       <dependency>
-           <groupId>org.onosproject</groupId>
-           <artifactId>onos-core-serializers</artifactId>
-           <version>${project.version}</version>
-       </dependency>
-   </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2ActionModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2ActionModel.java
deleted file mode 100644
index ea70b65..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2ActionModel.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * A BMv2 action model.
- */
-@Beta
-public final class Bmv2ActionModel {
-
-    private final String name;
-    private final int id;
-    private final LinkedHashMap<String, Bmv2RuntimeDataModel> runtimeDatas = Maps.newLinkedHashMap();
-
-    /**
-     * Creates a new action model.
-     *
-     * @param name         name
-     * @param id           id
-     * @param runtimeDatas list of runtime data
-     */
-    protected Bmv2ActionModel(String name, int id, List<Bmv2RuntimeDataModel> runtimeDatas) {
-        this.name = name;
-        this.id = id;
-        runtimeDatas.forEach(r -> this.runtimeDatas.put(r.name(), r));
-    }
-
-    /**
-     * Returns the name of this action.
-     *
-     * @return a string value
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Returns the id of this action.
-     *
-     * @return an integer value
-     */
-    public int id() {
-        return id;
-    }
-
-    /**
-     * Returns this action's runtime data defined by the given name, null
-     * if not present.
-     *
-     * @return runtime data or null
-     */
-    public Bmv2RuntimeDataModel runtimeData(String name) {
-        return runtimeDatas.get(name);
-    }
-
-    /**
-     * Returns an immutable list of runtime data for this action.
-     * The list is ordered according to the values defined in the configuration.
-     *
-     * @return list of runtime data.
-     */
-    public List<Bmv2RuntimeDataModel> runtimeDatas() {
-        return ImmutableList.copyOf(runtimeDatas.values());
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(name, id, runtimeDatas);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2ActionModel other = (Bmv2ActionModel) obj;
-        return Objects.equals(this.name, other.name)
-                && Objects.equals(this.id, other.id)
-                && Objects.equals(this.runtimeDatas, other.runtimeDatas);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("name", name)
-                .add("id", id)
-                .add("runtimeDatas", runtimeDatas)
-                .toString();
-    }
-
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2Configuration.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2Configuration.java
deleted file mode 100644
index 1cbb146..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2Configuration.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.eclipsesource.json.JsonObject;
-import com.google.common.annotations.Beta;
-
-import java.util.List;
-
-/**
- * BMv2 packet processing configuration. Such a configuration is used to define the way BMv2 should process packets
- * (i.e. it defines the device ingress/egress pipelines, parser, tables, actions, etc.). It must be noted that this
- * class exposes only a subset of the configuration properties of a BMv2 device (only those that are needed for the
- * purpose of translating ONOS structures to BMv2 structures). Such a configuration is backed by a JSON object.
- * BMv2 JSON configuration files are usually generated using a P4 frontend compiler such as p4c-bmv2.
- */
-@Beta
-public interface Bmv2Configuration {
-
-    /**
-     * Return an unmodifiable view of the JSON backing this configuration.
-     *
-     * @return a JSON object.
-     */
-    JsonObject json();
-
-    /**
-     * Returns the header type associated with the given numeric ID, null if there's no such an ID in the configuration.
-     *
-     * @param id integer value
-     * @return header type object or null
-     */
-    Bmv2HeaderTypeModel headerType(int id);
-
-    /**
-     * Returns the header type associated with the given name, null if there's no such a name in the configuration.
-     *
-     * @param name string value
-     * @return header type object or null
-     */
-    Bmv2HeaderTypeModel headerType(String name);
-
-    /**
-     * Returns the list of all the header types defined by in this configuration. Values returned are sorted in
-     * ascending order based on the numeric ID.
-     *
-     * @return list of header types
-     */
-    List<Bmv2HeaderTypeModel> headerTypes();
-
-    /**
-     * Returns the header associated with the given numeric ID, null if there's no such an ID in the configuration.
-     *
-     * @param id integer value
-     * @return header object or null
-     */
-    Bmv2HeaderModel header(int id);
-
-    /**
-     * Returns the header associated with the given name, null if there's no such a name in the configuration.
-     *
-     * @param name string value
-     * @return header object or null
-     */
-    Bmv2HeaderModel header(String name);
-
-    /**
-     * Returns the list of all the header instances defined in this configuration. Values returned are sorted in
-     * ascending order based on the numeric ID.
-     *
-     * @return list of header types
-     */
-    List<Bmv2HeaderModel> headers();
-
-    /**
-     * Returns the action associated with the given numeric ID, null if there's no such an ID in the configuration.
-     *
-     * @param id integer value
-     * @return action object or null
-     */
-    Bmv2ActionModel action(int id);
-
-    /**
-     * Returns the action associated with the given name, null if there's no such a name in the configuration.
-     *
-     * @param name string value
-     * @return action object or null
-     */
-    Bmv2ActionModel action(String name);
-
-    /**
-     * Returns the list of all the actions defined by in this configuration. Values returned are sorted in ascending
-     * order based on the numeric ID.
-     *
-     * @return list of actions
-     */
-    List<Bmv2ActionModel> actions();
-
-    /**
-     * Returns the table associated with the given numeric ID, null if there's no such an ID in the configuration.
-     *
-     * @param id integer value
-     * @return table object or null
-     */
-    Bmv2TableModel table(int id);
-
-    /**
-     * Returns the table associated with the given name, null if there's no such a name in the configuration.
-     *
-     * @param name string value
-     * @return table object or null
-     */
-    Bmv2TableModel table(String name);
-
-    /**
-     * Returns the list of all the tables defined by in this configuration. Values returned are sorted in ascending
-     * order based on the numeric ID.
-     *
-     * @return list of actions
-     */
-    List<Bmv2TableModel> tables();
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2DefaultConfiguration.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2DefaultConfiguration.java
deleted file mode 100644
index f047306..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2DefaultConfiguration.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.eclipsesource.json.JsonArray;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.SortedMap;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Default implementation of a BMv2 configuration backed by a JSON object.
- */
-@Beta
-public final class Bmv2DefaultConfiguration implements Bmv2Configuration {
-
-    private final JsonObject json;
-    private final DualKeySortedMap<Bmv2HeaderTypeModel> headerTypes = new DualKeySortedMap<>();
-    private final DualKeySortedMap<Bmv2HeaderModel> headers = new DualKeySortedMap<>();
-    private final DualKeySortedMap<Bmv2ActionModel> actions = new DualKeySortedMap<>();
-    private final DualKeySortedMap<Bmv2TableModel> tables = new DualKeySortedMap<>();
-
-    private Bmv2DefaultConfiguration(JsonObject json) {
-        this.json = JsonObject.unmodifiableObject(json);
-    }
-
-    /**
-     * Returns a new BMv2 configuration object by parsing the passed JSON.
-     *
-     * @param json json
-     * @return a new BMv2 configuration object
-     * @see <a href="https://github.com/p4lang/behavioral-configuration/blob/master/docs/JSON_format.md">
-     * BMv2 JSON specification</a>
-     */
-    public static Bmv2DefaultConfiguration parse(JsonObject json) {
-        checkArgument(json != null, "json cannot be null");
-        // TODO: implement caching, no need to parse a json if we already have the configuration
-        Bmv2DefaultConfiguration configuration = new Bmv2DefaultConfiguration(json);
-        configuration.doParse();
-        return configuration;
-    }
-
-    @Override
-    public Bmv2HeaderTypeModel headerType(int id) {
-        return headerTypes.get(id);
-    }
-
-    @Override
-    public Bmv2HeaderTypeModel headerType(String name) {
-        return headerTypes.get(name);
-    }
-
-    @Override
-    public List<Bmv2HeaderTypeModel> headerTypes() {
-        return ImmutableList.copyOf(headerTypes.sortedMap().values());
-    }
-
-    @Override
-    public Bmv2HeaderModel header(int id) {
-        return headers.get(id);
-    }
-
-    @Override
-    public Bmv2HeaderModel header(String name) {
-        return headers.get(name);
-    }
-
-    @Override
-    public List<Bmv2HeaderModel> headers() {
-        return ImmutableList.copyOf(headers.sortedMap().values());
-    }
-
-    @Override
-    public Bmv2ActionModel action(int id) {
-        return actions.get(id);
-    }
-
-    @Override
-    public Bmv2ActionModel action(String name) {
-        return actions.get(name);
-    }
-
-    @Override
-    public List<Bmv2ActionModel> actions() {
-        return ImmutableList.copyOf(actions.sortedMap().values());
-    }
-
-    @Override
-    public Bmv2TableModel table(int id) {
-        return tables.get(id);
-    }
-
-    @Override
-    public Bmv2TableModel table(String name) {
-        return tables.get(name);
-    }
-
-    @Override
-    public List<Bmv2TableModel> tables() {
-        return ImmutableList.copyOf(tables.sortedMap().values());
-    }
-
-    @Override
-    public JsonObject json() {
-        return this.json;
-    }
-
-    /**
-     * Generates a hash code for this BMv2 configuration. The hash function is based solely on the JSON backing this
-     * configuration.
-     */
-    @Override
-    public int hashCode() {
-        return json.hashCode();
-    }
-
-    /**
-     * Indicates whether some other BMv2 configuration is equal to this one.
-     * Equality is based solely on the low-level JSON representation.
-     *
-     * @param obj other object
-     * @return true if equals, false elsewhere
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2DefaultConfiguration other = (Bmv2DefaultConfiguration) obj;
-        return Objects.equal(this.json, other.json);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("jsonHash", json.hashCode())
-                .toString();
-    }
-
-    /**
-     * Parse the JSON object and build the corresponding objects.
-     */
-    private void doParse() {
-        // parse header types
-        json.get("header_types").asArray().forEach(val -> {
-
-            JsonObject jHeaderType = val.asObject();
-
-            // populate fields list
-            List<Bmv2FieldTypeModel> fieldTypes = Lists.newArrayList();
-
-            jHeaderType.get("fields").asArray().forEach(x -> fieldTypes.add(
-                    new Bmv2FieldTypeModel(
-                            x.asArray().get(0).asString(),
-                            x.asArray().get(1).asInt())));
-
-            // add header type instance
-            String name = jHeaderType.get("name").asString();
-            int id = jHeaderType.get("id").asInt();
-
-            Bmv2HeaderTypeModel headerType = new Bmv2HeaderTypeModel(name,
-                                                                     id,
-                                                                     fieldTypes);
-
-            headerTypes.put(name, id, headerType);
-        });
-
-        // parse headers
-        json.get("headers").asArray().forEach(val -> {
-
-            JsonObject jHeader = val.asObject();
-
-            String name = jHeader.get("name").asString();
-            int id = jHeader.get("id").asInt();
-            String typeName = jHeader.get("header_type").asString();
-
-            Bmv2HeaderModel header = new Bmv2HeaderModel(name,
-                                                         id,
-                                                         headerTypes.get(typeName),
-                                                         jHeader.get("metadata").asBoolean());
-
-            // add instance
-            headers.put(name, id, header);
-        });
-
-        // parse actions
-        json.get("actions").asArray().forEach(val -> {
-
-            JsonObject jAction = val.asObject();
-
-            // populate runtime data list
-            List<Bmv2RuntimeDataModel> runtimeDatas = Lists.newArrayList();
-
-            jAction.get("runtime_data").asArray().forEach(jData -> runtimeDatas.add(
-                    new Bmv2RuntimeDataModel(
-                            jData.asObject().get("name").asString(),
-                            jData.asObject().get("bitwidth").asInt()
-                    )));
-
-            // add action instance
-            String name = jAction.get("name").asString();
-            int id = jAction.get("id").asInt();
-
-            Bmv2ActionModel action = new Bmv2ActionModel(name,
-                                                         id,
-                                                         runtimeDatas);
-
-            actions.put(name, id, action);
-        });
-
-        // parse tables
-        json.get("pipelines").asArray().forEach(pipeline -> {
-
-            pipeline.asObject().get("tables").asArray().forEach(val -> {
-
-                JsonObject jTable = val.asObject();
-
-                // populate keys
-                List<Bmv2TableKeyModel> keys = Lists.newArrayList();
-
-                jTable.get("key").asArray().forEach(jKey -> {
-                    JsonArray target = jKey.asObject().get("target").asArray();
-
-                    Bmv2HeaderModel header = header(target.get(0).asString());
-                    String typeName = target.get(1).asString();
-
-                    Bmv2FieldModel field = new Bmv2FieldModel(
-                            header, header.type().field(typeName));
-
-                    String matchTypeStr = jKey.asObject().get("match_type").asString();
-
-                    Bmv2MatchParam.Type matchType;
-
-                    switch (matchTypeStr) {
-                        case "ternary":
-                            matchType = Bmv2MatchParam.Type.TERNARY;
-                            break;
-                        case "exact":
-                            matchType = Bmv2MatchParam.Type.EXACT;
-                            break;
-                        case "lpm":
-                            matchType = Bmv2MatchParam.Type.LPM;
-                            break;
-                        case "valid":
-                            matchType = Bmv2MatchParam.Type.VALID;
-                            break;
-                        default:
-                            throw new RuntimeException(
-                                    "Unable to parse match type: " + matchTypeStr);
-                    }
-
-                    keys.add(new Bmv2TableKeyModel(matchType, field));
-                });
-
-                // populate actions set
-                Set<Bmv2ActionModel> actionzz = Sets.newHashSet();
-                jTable.get("actions").asArray().forEach(
-                        jAction -> actionzz.add(action(jAction.asString())));
-
-                // add table instance
-                String name = jTable.get("name").asString();
-                int id = jTable.get("id").asInt();
-
-                Bmv2TableModel table = new Bmv2TableModel(name,
-                                                          id,
-                                                          jTable.get("match_type").asString(),
-                                                          jTable.get("type").asString(),
-                                                          jTable.get("max_size").asInt(),
-                                                          jTable.get("with_counters").asBoolean(),
-                                                          jTable.get("support_timeout").asBoolean(),
-                                                          keys,
-                                                          actionzz);
-
-                tables.put(name, id, table);
-            });
-        });
-    }
-
-    /**
-     * Handy class for a map indexed by two keys, a string and an integer.
-     *
-     * @param <T> type of value stored by the map
-     */
-    private class DualKeySortedMap<T> {
-        private final SortedMap<Integer, T> intMap = Maps.newTreeMap();
-        private final Map<String, Integer> strToIntMap = Maps.newHashMap();
-
-        private void put(String name, int id, T object) {
-            strToIntMap.put(name, id);
-            intMap.put(id, object);
-        }
-
-        private T get(int id) {
-            return intMap.get(id);
-        }
-
-        private T get(String name) {
-            return strToIntMap.get(name) == null ? null : get(strToIntMap.get(name));
-        }
-
-        private SortedMap<Integer, T> sortedMap() {
-            return intMap;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hashCode(intMap, strToIntMap);
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) {
-                return true;
-            }
-            if (obj == null || getClass() != obj.getClass()) {
-                return false;
-            }
-            final DualKeySortedMap other = (DualKeySortedMap) obj;
-            return Objects.equal(this.intMap, other.intMap)
-                    && Objects.equal(this.strToIntMap, other.strToIntMap);
-        }
-    }
-}
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2DeviceContext.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2DeviceContext.java
deleted file mode 100644
index f54cc1d..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2DeviceContext.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A BMv2 device context, defined by a configuration and an interpreter.
- */
-@Beta
-public final class Bmv2DeviceContext {
-
-    private final Bmv2Configuration configuration;
-    private final Bmv2Interpreter interpreter;
-
-    /**
-     * Creates a new BMv2 device context.
-     *
-     * @param configuration a configuration
-     * @param interpreter   an interpreter
-     */
-    public Bmv2DeviceContext(Bmv2Configuration configuration, Bmv2Interpreter interpreter) {
-        this.configuration = checkNotNull(configuration, "configuration cannot be null");
-        this.interpreter = checkNotNull(interpreter, "interpreter cannot be null");
-    }
-
-    /**
-     * Returns the BMv2 configuration of this context.
-     *
-     * @return a configuration
-     */
-    public Bmv2Configuration configuration() {
-        return configuration;
-    }
-
-    /**
-     * Returns the BMv2 interpreter of this context.
-     *
-     * @return an interpreter
-     */
-    public Bmv2Interpreter interpreter() {
-        return interpreter;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(configuration, interpreter);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2DeviceContext other = (Bmv2DeviceContext) obj;
-        return Objects.equal(this.configuration, other.configuration)
-                && Objects.equal(this.interpreter, other.interpreter);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("configuration", configuration)
-                .add("interpreter", interpreter)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FieldModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FieldModel.java
deleted file mode 100644
index b1b5ce8..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FieldModel.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * A BMv2 header field model.
- */
-@Beta
-public final class Bmv2FieldModel {
-
-    private final Bmv2HeaderModel header;
-    private final Bmv2FieldTypeModel type;
-
-    protected Bmv2FieldModel(Bmv2HeaderModel header, Bmv2FieldTypeModel type) {
-        this.header = header;
-        this.type = type;
-    }
-
-    /**
-     * Returns the header instance of this field instance.
-     *
-     * @return a header instance
-     */
-    public Bmv2HeaderModel header() {
-        return header;
-    }
-
-    /**
-     * Returns the type of this field instance.
-     *
-     * @return a field type value
-     */
-    public Bmv2FieldTypeModel type() {
-        return type;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(header, type);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2FieldModel other = (Bmv2FieldModel) obj;
-        return Objects.equal(this.header, other.header)
-                && Objects.equal(this.type, other.type);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("header", header)
-                .add("type", type)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FieldTypeModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FieldTypeModel.java
deleted file mode 100644
index 5b944cc..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FieldTypeModel.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * A BMv2 header type field model.
- */
-@Beta
-public final class Bmv2FieldTypeModel {
-
-    private final String name;
-    private final int bitWidth;
-
-    protected Bmv2FieldTypeModel(String name, int bitWidth) {
-        this.name = name;
-        this.bitWidth = bitWidth;
-    }
-
-    /**
-     * Returns the name of this header type field.
-     *
-     * @return a string value
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Returns the bit width of this header type field.
-     *
-     * @return an integer value
-     */
-    public int bitWidth() {
-        return bitWidth;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(name, bitWidth);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2FieldTypeModel other = (Bmv2FieldTypeModel) obj;
-        return Objects.equal(this.name, other.name)
-                && Objects.equal(this.bitWidth, other.bitWidth);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("name", name)
-                .add("bitWidth", bitWidth)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FlowRuleTranslator.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FlowRuleTranslator.java
deleted file mode 100644
index bc768d0..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FlowRuleTranslator.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntry;
-import org.onosproject.net.flow.FlowRule;
-
-/**
- * Translator of ONOS flow rules to BMv2 table entries.
- */
-@Beta
-public interface Bmv2FlowRuleTranslator {
-
-    /**
-     * Returns a BMv2 table entry equivalent to the given flow rule for the given context.
-     * <p>
-     * Translation is performed according to the following logic:
-     * <ul>
-     *  <li> table name: obtained from the context interpreter {@link Bmv2Interpreter#tableIdMap() table ID map}.
-     *  <li> match key: is built using both the context interpreter {@link Bmv2Interpreter#criterionTypeMap() criterion
-     *  map} and all {@link org.onosproject.bmv2.api.runtime.Bmv2ExtensionSelector extension selectors} (if any).
-     *  <li> action: is built using the context interpreter
-     *          {@link Bmv2Interpreter#mapTreatment(org.onosproject.net.flow.TrafficTreatment, Bmv2Configuration)
-     *          treatment mapping function} or the flow rule
-     *          {@link org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment extension treatment} (if any).
-     *  <li> timeout: if the table supports timeout, use the same as the flow rule, otherwise none (i.e. returns a
-     *          permanent entry).
-     * </ul>
-     *
-     * @param rule    a flow rule
-     * @param context a context
-     * @return a BMv2 table entry
-     * @throws Bmv2FlowRuleTranslatorException if the flow rule cannot be translated
-     */
-    Bmv2TableEntry translate(FlowRule rule, Bmv2DeviceContext context) throws Bmv2FlowRuleTranslatorException;
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FlowRuleTranslatorException.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FlowRuleTranslatorException.java
deleted file mode 100644
index 645ac33..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2FlowRuleTranslatorException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-
-/**
- * BMv2 flow rule translator exception.
- */
-@Beta
-public final class Bmv2FlowRuleTranslatorException extends Exception {
-
-    public Bmv2FlowRuleTranslatorException(String msg) {
-        super(msg);
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2HeaderModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2HeaderModel.java
deleted file mode 100644
index 5c1f4ff..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2HeaderModel.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * BMv2 header instance model.
- */
-@Beta
-public final class Bmv2HeaderModel {
-
-    private final String name;
-    private final int id;
-    private final Bmv2HeaderTypeModel type;
-    private final boolean isMetadata;
-
-    /**
-     * Creates a new header instance model.
-     *
-     * @param name     name
-     * @param id       id
-     * @param type     header type
-     * @param metadata if is metadata
-     */
-    protected Bmv2HeaderModel(String name, int id, Bmv2HeaderTypeModel type, boolean metadata) {
-        this.name = name;
-        this.id = id;
-        this.type = type;
-        this.isMetadata = metadata;
-    }
-
-    /**
-     * Returns the name of this header instance.
-     *
-     * @return a string value
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Return the id of this header instance.
-     *
-     * @return an integer value
-     */
-    public int id() {
-        return id;
-    }
-
-    /**
-     * Return the type of this header instance.
-     *
-     * @return a header type value
-     */
-    public Bmv2HeaderTypeModel type() {
-        return type;
-    }
-
-    /**
-     * Return true if this header instance is a metadata, false elsewhere.
-     *
-     * @return a boolean value
-     */
-    public boolean isMetadata() {
-        return isMetadata;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(name, id, type, isMetadata);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2HeaderModel other = (Bmv2HeaderModel) obj;
-        return Objects.equal(this.name, other.name)
-                && Objects.equal(this.id, other.id)
-                && Objects.equal(this.type, other.type)
-                && Objects.equal(this.isMetadata, other.isMetadata);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("name", name)
-                .add("id", id)
-                .add("type", type)
-                .add("isMetadata", isMetadata)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2HeaderTypeModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2HeaderTypeModel.java
deleted file mode 100644
index 5350340..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2HeaderTypeModel.java
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Maps;
-
-import java.util.LinkedHashMap;
-import java.util.List;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * BMv2 header type model.
- */
-@Beta
-public final class Bmv2HeaderTypeModel {
-
-    private final String name;
-    private final int id;
-    private final LinkedHashMap<String, Bmv2FieldTypeModel> fields = Maps.newLinkedHashMap();
-
-    /**
-     * Creates a new header type model.
-     *
-     * @param name       name
-     * @param id         id
-     * @param fieldTypes fields
-     */
-    protected Bmv2HeaderTypeModel(String name, int id, List<Bmv2FieldTypeModel> fieldTypes) {
-        this.name = name;
-        this.id = id;
-        fieldTypes.forEach(f -> this.fields.put(f.name(), f));
-    }
-
-    /**
-     * Returns this header type name.
-     *
-     * @return name
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Returns this header type id.
-     *
-     * @return id
-     */
-    public int id() {
-        return id;
-    }
-
-    /**
-     * Returns this header type's field defined by the passed name, null if
-     * not present.
-     *
-     * @param fieldName field name
-     * @return field or null
-     */
-    public Bmv2FieldTypeModel field(String fieldName) {
-        return fields.get(fieldName);
-    }
-
-    /**
-     * Return and immutable list of header fields for this header
-     * type. The list is ordered according to the values defined in the
-     * model.
-     *
-     * @return list of fields
-     */
-    public List<Bmv2FieldTypeModel> fields() {
-        return ImmutableList.copyOf(fields.values());
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(name, id, fields);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2HeaderTypeModel other = (Bmv2HeaderTypeModel) obj;
-        return Objects.equal(this.name, other.name)
-                && Objects.equal(this.id, other.id)
-                && Objects.equal(this.fields, other.fields);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("name", name)
-                .add("id", id)
-                .add("fields", fields)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2Interpreter.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2Interpreter.java
deleted file mode 100644
index 8d44494..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2Interpreter.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableBiMap;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criterion;
-
-/**
- * A BMv2 configuration interpreter.
- */
-@Beta
-public interface Bmv2Interpreter {
-
-    /**
-     * Returns a bi-map describing a one-to-one relationship between ONOS flow rule table IDs and BMv2 table names.
-     *
-     * @return a {@link com.google.common.collect.BiMap} where the key is a ONOS flow rule table id and
-     * the value is a BMv2 table names
-     */
-    ImmutableBiMap<Integer, String> tableIdMap();
-
-    /**
-     * Returns a bi-map describing a one-to-one relationship between ONOS criterion types and BMv2 header field names.
-     * Header field names are formatted using the notation {@code header_name.field_member_name}.
-     *
-     * @return a {@link com.google.common.collect.BiMap} where the keys are ONOS criterion types and the values are
-     * BMv2 header field names
-     */
-    ImmutableBiMap<Criterion.Type, String> criterionTypeMap();
-
-    /**
-     * Return a BMv2 action that is functionally equivalent to the given ONOS traffic treatment for the given
-     * configuration.
-     *
-     * @param treatment     a ONOS traffic treatment
-     * @param configuration a BMv2 configuration
-     * @return a BMv2 action object
-     * @throws Bmv2InterpreterException if the treatment cannot be mapped to any BMv2 action
-     */
-    Bmv2Action mapTreatment(TrafficTreatment treatment, Bmv2Configuration configuration)
-            throws Bmv2InterpreterException;
-
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2InterpreterException.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2InterpreterException.java
deleted file mode 100644
index 7c143fc..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2InterpreterException.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-
-/**
- * A BMv2 interpreter exception.
- */
-@Beta
-public final class Bmv2InterpreterException extends Exception {
-
-    public Bmv2InterpreterException(String message) {
-        super(message);
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2RuntimeDataModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2RuntimeDataModel.java
deleted file mode 100644
index e97d2bb..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2RuntimeDataModel.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-
-import java.util.Objects;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * A BMv2 action runtime data model.
- */
-@Beta
-public final class Bmv2RuntimeDataModel {
-
-    private final String name;
-    private final int bitWidth;
-
-    /**
-     * Creates a new runtime data model.
-     *
-     * @param name     name
-     * @param bitWidth bitwidth
-     */
-    protected Bmv2RuntimeDataModel(String name, int bitWidth) {
-        this.name = name;
-        this.bitWidth = bitWidth;
-    }
-
-    /**
-     * Return the name of this runtime data.
-     *
-     * @return a string value
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Return the bit width of this runtime data.
-     *
-     * @return an integer value
-     */
-    public int bitWidth() {
-        return bitWidth;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(name, bitWidth);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2RuntimeDataModel other = (Bmv2RuntimeDataModel) obj;
-        return Objects.equals(this.name, other.name)
-                && Objects.equals(this.bitWidth, other.bitWidth);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("name", name)
-                .add("bitWidth", bitWidth)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2TableKeyModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2TableKeyModel.java
deleted file mode 100644
index 8f2f0222..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2TableKeyModel.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * A BMv2 table key model.
- */
-@Beta
-public final class Bmv2TableKeyModel {
-
-    private final Bmv2MatchParam.Type matchType;
-    private final Bmv2FieldModel field;
-
-    /**
-     * Creates a new table key model.
-     *
-     * @param matchType match type
-     * @param field     field instance
-     */
-    protected Bmv2TableKeyModel(Bmv2MatchParam.Type matchType, Bmv2FieldModel field) {
-        this.matchType = matchType;
-        this.field = field;
-    }
-
-    /**
-     * Returns the match type of this key.
-     *
-     * @return a string value
-     * TODO returns enum of match type
-     */
-    public Bmv2MatchParam.Type matchType() {
-        return matchType;
-    }
-
-    /**
-     * Returns the header field instance matched by this key.
-     *
-     * @return a header field value
-     */
-    public Bmv2FieldModel field() {
-        return field;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(matchType, field);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2TableKeyModel other = (Bmv2TableKeyModel) obj;
-        return Objects.equal(this.matchType, other.matchType)
-                && Objects.equal(this.field, other.field);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("matchType", matchType)
-                .add("field", field)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2TableModel.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2TableModel.java
deleted file mode 100644
index 8f6fa55..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/Bmv2TableModel.java
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-
-import java.util.List;
-import java.util.Set;
-
-import static com.google.common.base.MoreObjects.toStringHelper;
-
-/**
- * A BMv2 table model.
- */
-@Beta
-public final class Bmv2TableModel {
-
-    private final String name;
-    private final int id;
-    private final String matchType;
-    private final String type;
-    private final int maxSize;
-    private final boolean hasCounters;
-    private final boolean hasTimeouts;
-    private final List<Bmv2TableKeyModel> keys;
-    private final Set<Bmv2ActionModel> actions;
-
-    /**
-     * Creates a new table model.
-     *
-     * @param name           name
-     * @param id             id
-     * @param matchType      match type
-     * @param type           type
-     * @param maxSize        max number of entries
-     * @param withCounters   if table has counters
-     * @param supportTimeout if table supports aging
-     * @param keys           list of match keys
-     * @param actions        list of actions
-     */
-    protected Bmv2TableModel(String name, int id, String matchType, String type,
-                             int maxSize, boolean withCounters, boolean supportTimeout,
-                             List<Bmv2TableKeyModel> keys, Set<Bmv2ActionModel> actions) {
-        this.name = name;
-        this.id = id;
-        this.matchType = matchType;
-        this.type = type;
-        this.maxSize = maxSize;
-        this.hasCounters = withCounters;
-        this.hasTimeouts = supportTimeout;
-        this.keys = keys;
-        this.actions = actions;
-    }
-
-    /**
-     * Returns the name of this table.
-     *
-     * @return a string value
-     */
-    public String name() {
-        return name;
-    }
-
-    /**
-     * Returns the id of this table.
-     *
-     * @return an integer value
-     */
-    public int id() {
-        return id;
-    }
-
-    /**
-     * Return the match type of this table.
-     *
-     * @return a string value
-     */
-    public String matchType() {
-        return matchType;
-    }
-
-    /**
-     * Return the match type of this table.
-     *
-     * @return a string value
-     */
-    public String type() {
-        return type;
-    }
-
-    /**
-     * Returns the maximum number of entries supported by this table.
-     *
-     * @return an integer value
-     */
-    public int maxSize() {
-        return maxSize;
-    }
-
-    /**
-     * Returns true if this table has counters, false otherwise.
-     *
-     * @return a boolean value
-     */
-    public boolean hasCounters() {
-        return hasCounters;
-    }
-
-    /**
-     * Returns true if this table supports aging, false otherwise.
-     *
-     * @return a boolean value
-     */
-    public boolean hasTimeouts() {
-        return hasTimeouts;
-    }
-
-    /**
-     * Returns the list of match keys supported by this table.
-     * The list is ordered accordingly to the model's table definition.
-     *
-     * @return a list of match keys
-     */
-    public List<Bmv2TableKeyModel> keys() {
-        return keys;
-    }
-
-    /**
-     * Returns the set of actions supported by this table.
-     *
-     * @return a list of actions
-     */
-    public Set<Bmv2ActionModel> actions() {
-        return actions;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(name, id, matchType, type, maxSize, hasCounters,
-                                hasTimeouts, keys, actions);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2TableModel other = (Bmv2TableModel) obj;
-        return Objects.equal(this.name, other.name)
-                && Objects.equal(this.id, other.id)
-                && Objects.equal(this.matchType, other.matchType)
-                && Objects.equal(this.type, other.type)
-                && Objects.equal(this.maxSize, other.maxSize)
-                && Objects.equal(this.hasCounters, other.hasCounters)
-                && Objects.equal(this.hasTimeouts, other.hasTimeouts)
-                && Objects.equal(this.keys, other.keys)
-                && Objects.equal(this.actions, other.actions);
-    }
-
-    @Override
-    public String toString() {
-        return toStringHelper(this)
-                .add("name", name)
-                .add("id", id)
-                .add("matchType", matchType)
-                .add("type", type)
-                .add("maxSize", maxSize)
-                .add("hasCounters", hasCounters)
-                .add("hasTimeouts", hasTimeouts)
-                .add("keys", keys)
-                .add("actions", actions)
-                .toString();
-    }
-
-}
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/package-info.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/package-info.java
deleted file mode 100644
index 7489aa4..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/context/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 device context API.
- */
-package org.onosproject.bmv2.api.context;
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/package-info.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/package-info.java
deleted file mode 100644
index ce6d521..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 protocol API.
- */
-package org.onosproject.bmv2.api;
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2Action.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2Action.java
deleted file mode 100644
index a9d3ed8..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2Action.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Lists;
-import org.onlab.util.ImmutableByteSequence;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-/**
- * An action of a BMv2 match-action table entry.
- */
-@Beta
-public final class Bmv2Action {
-
-    private final String name;
-    private final List<ImmutableByteSequence> parameters;
-
-    protected Bmv2Action(String name, List<ImmutableByteSequence> parameters) {
-        // hide constructor
-        this.name = name;
-        this.parameters = parameters;
-    }
-
-    /**
-     * Returns a new action builder.
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Return the name of this action.
-     *
-     * @return action name
-     */
-    public final String name() {
-        return name;
-    }
-
-    /**
-     * Returns an immutable view of the list of parameters of this action.
-     *
-     * @return list of byte sequence
-     */
-    public final List<ImmutableByteSequence> parameters() {
-        return Collections.unmodifiableList(parameters);
-    }
-
-    @Override
-    public final int hashCode() {
-        return Objects.hash(name, parameters);
-    }
-
-    @Override
-    public final boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2Action other = (Bmv2Action) obj;
-        return Objects.equals(this.name, other.name)
-                && Objects.equals(this.parameters, other.parameters);
-    }
-
-    @Override
-    public final String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("name", name)
-                .add("parameters", parameters)
-                .toString();
-    }
-
-    /**
-     * A BMv2 action builder.
-     */
-    public static final class Builder {
-
-        private String name = null;
-        private List<ImmutableByteSequence> parameters;
-
-        private Builder() {
-            this.parameters = Lists.newArrayList();
-        }
-
-        /**
-         * Sets the action name.
-         *
-         * @param actionName a string value
-         * @return this
-         */
-        public Builder withName(String actionName) {
-            this.name = checkNotNull(actionName);
-            return this;
-        }
-
-        /**
-         * Adds a parameter at the end of the parameters list.
-         *
-         * @param parameter a ByteBuffer value
-         * @return this
-         */
-        public Builder addParameter(ImmutableByteSequence parameter) {
-            parameters.add(checkNotNull(parameter));
-            return this;
-        }
-
-        /**
-         * Builds a BMv2 action object.
-         *
-         * @return a BMv2 action
-         */
-        public Bmv2Action build() {
-            checkState(name != null, "action name not set");
-            return new Bmv2Action(name, parameters);
-        }
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2Device.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2Device.java
deleted file mode 100644
index c3efce3..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2Device.java
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import org.onosproject.net.DeviceId;
-
-import java.net.URI;
-import java.net.URISyntaxException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A BMv2 device.
- */
-@Beta
-public final class Bmv2Device {
-
-    public static final String N_A = "n/a";
-
-    public static final String SCHEME = "bmv2";
-    public static final String PROTOCOL = "bmv2-thrift";
-    public static final String MANUFACTURER = "p4.org";
-    public static final String HW_VERSION = "bmv2";
-    public static final String SW_VERSION = "1.0.0";
-    public static final String SERIAL_NUMBER = N_A;
-
-    private final String thriftServerHost;
-    private final int thriftServerPort;
-    private final int internalDeviceId;
-
-    /**
-     * Creates a new BMv2 device object.
-     *
-     * @param thriftServerHost the hostname or IP address of the Thrift RPC server running on the device
-     * @param thriftServerPort the listening port used by the device Thrift RPC server
-     * @param internalDeviceId the internal numeric device ID
-     */
-    public Bmv2Device(String thriftServerHost, int thriftServerPort, int internalDeviceId) {
-        this.thriftServerHost = checkNotNull(thriftServerHost, "host cannot be null");
-        this.thriftServerPort = checkNotNull(thriftServerPort, "port cannot be null");
-        this.internalDeviceId = internalDeviceId;
-    }
-
-    /**
-     * Returns a Bmv2Device representing the given deviceId.
-     *
-     * @param deviceId a deviceId
-     * @return
-     */
-    public static Bmv2Device of(DeviceId deviceId) {
-        return DeviceIdParser.parse(checkNotNull(deviceId, "deviceId cannot be null"));
-    }
-
-    /**
-     * Returns the hostname or IP address of the Thrift RPC server running on the device.
-     *
-     * @return a string value
-     */
-    public String thriftServerHost() {
-        return thriftServerHost;
-    }
-
-    /**
-     * Returns the listening port of the Thrift RPC server running on the device.
-     *
-     * @return an integer value
-     */
-    public int thriftServerPort() {
-        return thriftServerPort;
-    }
-
-    /**
-     * Returns the BMv2-internal device ID, which is an integer arbitrary chosen at device boot.
-     * Such an ID must not be confused with the ONOS-internal {@link org.onosproject.net.DeviceId}.
-     *
-     * @return an integer value
-     */
-    public int internalDeviceId() {
-        return internalDeviceId;
-    }
-
-    /**
-     * Returns a new ONOS device ID for this device.
-     *
-     * @return a new device ID
-     */
-    public DeviceId asDeviceId() {
-        try {
-            return DeviceId.deviceId(new URI(SCHEME, this.thriftServerHost + ":" + this.thriftServerPort,
-                                             String.valueOf(this.internalDeviceId)));
-        } catch (URISyntaxException e) {
-            throw new IllegalArgumentException("Unable to build deviceID for device " + this.toString(), e);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(thriftServerHost, thriftServerPort, internalDeviceId);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2Device other = (Bmv2Device) obj;
-        return Objects.equal(this.thriftServerHost, other.thriftServerHost)
-                && Objects.equal(this.thriftServerPort, other.thriftServerPort)
-                && Objects.equal(this.internalDeviceId, other.internalDeviceId);
-    }
-
-    @Override
-    public String toString() {
-        return asDeviceId().toString();
-    }
-
-    private static class DeviceIdParser {
-
-        private static final Pattern REGEX = Pattern.compile(SCHEME + ":(.+):(\\d+)#(\\d+)");
-
-        public static Bmv2Device parse(DeviceId deviceId) {
-            Matcher matcher = REGEX.matcher(deviceId.toString());
-            if (matcher.find()) {
-                String host = matcher.group(1);
-                int port = Integer.valueOf(matcher.group(2));
-                int internalDeviceId = Integer.valueOf(matcher.group(3));
-                return new Bmv2Device(host, port, internalDeviceId);
-            } else {
-                throw new RuntimeException("Unable to parse bmv2 device id string: " + deviceId.toString());
-            }
-        }
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2DeviceAgent.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2DeviceAgent.java
deleted file mode 100644
index c128aeb..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2DeviceAgent.java
+++ /dev/null
@@ -1,177 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import org.apache.commons.lang3.tuple.Pair;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.net.DeviceId;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * An agent to control a BMv2 device.
- */
-@Beta
-public interface Bmv2DeviceAgent {
-
-    /**
-     * Returns the device ID of this agent.
-     *
-     * @return a device id
-     */
-    DeviceId deviceId();
-
-    /**
-     * Pings the device, returns true if the device is reachable, false otherwise.
-     *
-     * @return true if reachable, false otherwise
-     */
-    boolean ping();
-
-    /**
-     * Adds a new table entry. If successful returns a table-specific identifier of the installed entry.
-     *
-     * @param entry a table entry
-     * @return a long value
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    long addTableEntry(Bmv2TableEntry entry) throws Bmv2RuntimeException;
-
-    /**
-     * Modifies an existing entry at by updating its action.
-     *
-     * @param tableName a string value
-     * @param entryId   a long value
-     * @param action    an action
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    void modifyTableEntry(String tableName, long entryId, Bmv2Action action) throws Bmv2RuntimeException;
-
-    /**
-     * Deletes currently installed entry.
-     *
-     * @param tableName a string value
-     * @param entryId   a long value
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    void deleteTableEntry(String tableName, long entryId) throws Bmv2RuntimeException;
-
-    /**
-     * Sets a default action for the given table.
-     *
-     * @param tableName a string value
-     * @param action    an action value
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    void setTableDefaultAction(String tableName, Bmv2Action action) throws Bmv2RuntimeException;
-
-    /**
-     * Returns information on the ports currently configured in the switch.
-     *
-     * @return collection of port information
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    Collection<Bmv2PortInfo> getPortsInfo() throws Bmv2RuntimeException;
-
-    /**
-     * Returns a list of table entries installed in the given table.
-     *
-     * @param tableName a string value
-     * @return a list of parsed table entries
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    List<Bmv2ParsedTableEntry> getTableEntries(String tableName) throws Bmv2RuntimeException;
-
-    /**
-     * Requests the device to transmit a given packet over the given port.
-     *
-     * @param portNumber a port number
-     * @param packet a byte sequence
-     * @throws Bmv2RuntimeException
-     */
-    void transmitPacket(int portNumber, ImmutableByteSequence packet) throws Bmv2RuntimeException;
-
-    /**
-     * Resets the state of the switch.
-     *
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    void resetState() throws Bmv2RuntimeException;
-
-    /**
-     * Returns the JSON configuration currently used to process packets.
-     *
-     * @return a JSON-formatted string value
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    String dumpJsonConfig() throws Bmv2RuntimeException;
-
-    /**
-     * Returns the MD5 sum of the JSON-formatted configuration currently used to process packets.
-     *
-     * @return a string value
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    String getJsonConfigMd5() throws Bmv2RuntimeException;
-
-    /**
-     * Returns the counter values for a given table and entry.
-     *
-     * @param tableName a table name
-     * @param entryId an entry id
-     * @return a pair of long values, where the left value is the number of bytes and the right the number of packets
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    Pair<Long, Long> readTableEntryCounter(String tableName, long entryId) throws Bmv2RuntimeException;
-
-    /**
-     * Returns the values of a given counter instance.
-     *
-     * @param counterName a counter name
-     * @param index       an integer value
-     * @return a pair of long values, where the left value is the number of bytes and the right value is the number of
-     * packets
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    Pair<Long, Long> readCounter(String counterName, int index) throws Bmv2RuntimeException;
-
-    /**
-     * Returns the ID of the current BMv2 process instance (used to distinguish between different executions of the
-     * same BMv2 device).
-     *
-     * @return an integer value
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    int getProcessInstanceId() throws Bmv2RuntimeException;
-
-    /**
-     * Uploads a new JSON configuration on the device.
-     *
-     * @param jsonString a string value
-     * @throws Bmv2RuntimeException if any error occurs
-     */
-    void uploadNewJsonConfig(String jsonString) throws Bmv2RuntimeException;
-
-    /**
-     * Triggers a configuration swap on the device.
-     *
-     * @throws Bmv2RuntimeException
-     */
-    void swapJsonConfig() throws Bmv2RuntimeException;
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExactMatchParam.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExactMatchParam.java
deleted file mode 100644
index 5b55d28..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExactMatchParam.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import org.onlab.util.ImmutableByteSequence;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A BMv2 exact match parameter.
- */
-@Beta
-public final class Bmv2ExactMatchParam implements Bmv2MatchParam {
-
-    private final ImmutableByteSequence value;
-
-    /**
-     * Creates a new match parameter object that matches exactly on the
-     * given byte sequence.
-     *
-     * @param value a byte sequence value
-     */
-    public Bmv2ExactMatchParam(ImmutableByteSequence value) {
-        this.value = checkNotNull(value, "value cannot be null");
-    }
-
-    @Override
-    public Type type() {
-        return Type.EXACT;
-    }
-
-    /**
-     * Return the byte sequence matched by this parameter.
-     *
-     * @return an immutable byte buffer value
-     */
-    public ImmutableByteSequence value() {
-        return this.value;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(value);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2ExactMatchParam other = (Bmv2ExactMatchParam) obj;
-        return Objects.equal(this.value, other.value);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("value", value)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionSelector.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionSelector.java
deleted file mode 100644
index 1e357c4..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionSelector.java
+++ /dev/null
@@ -1,475 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang3.tuple.Pair;
-import org.onlab.util.KryoNamespace;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2FieldTypeModel;
-import org.onosproject.bmv2.api.context.Bmv2HeaderModel;
-import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils;
-import org.onosproject.net.flow.AbstractExtension;
-import org.onosproject.net.flow.criteria.ExtensionSelector;
-import org.onosproject.net.flow.criteria.ExtensionSelectorType;
-import org.onosproject.store.serializers.KryoNamespaces;
-
-import java.nio.ByteBuffer;
-import java.util.Collections;
-import java.util.Map;
-
-import static com.google.common.base.Preconditions.*;
-import static org.onlab.util.ImmutableByteSequence.copyFrom;
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence;
-
-/**
- * Extension selector for BMv2 used as a wrapper for multiple BMv2 match parameters. Match parameters are
- * encoded using a map where the keys are expected to be field names formatted as {@code headerName.fieldName}
- * (e.g. {@code ethernet.dstAddr}).
- */
-@Beta
-public final class Bmv2ExtensionSelector extends AbstractExtension implements ExtensionSelector {
-
-    private static final KryoNamespace APP_KRYO = new KryoNamespace.Builder()
-            .register(KryoNamespaces.API)
-            .register(Bmv2ExactMatchParam.class)
-            .register(Bmv2TernaryMatchParam.class)
-            .register(Bmv2LpmMatchParam.class)
-            .register(Bmv2ValidMatchParam.class)
-            .build();
-
-    private Map<String, Bmv2MatchParam> parameterMap;
-
-    /**
-     * Creates a new BMv2 extension selector for the given match parameters map.
-     *
-     * @param paramMap a map
-     */
-    private Bmv2ExtensionSelector(Map<String, Bmv2MatchParam> paramMap) {
-        this.parameterMap = paramMap;
-    }
-
-    /**
-     * Returns the match parameters map of this selector.
-     *
-     * @return a match parameter map
-     */
-    public Map<String, Bmv2MatchParam> parameterMap() {
-        return parameterMap;
-    }
-
-
-    @Override
-    public ExtensionSelectorType type() {
-        return ExtensionSelectorType.ExtensionSelectorTypes.BMV2_MATCH_PARAMS.type();
-    }
-
-    @Override
-    public byte[] serialize() {
-        return APP_KRYO.serialize(parameterMap);
-    }
-
-    @Override
-    public void deserialize(byte[] data) {
-        this.parameterMap = APP_KRYO.deserialize(data);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(parameterMap);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2ExtensionSelector other = (Bmv2ExtensionSelector) obj;
-        return Objects.equal(this.parameterMap, other.parameterMap);
-    }
-
-    @Override
-    public String toString() {
-        MoreObjects.ToStringHelper helper = MoreObjects.toStringHelper(this);
-        parameterMap.forEach((name, param) -> {
-            switch (param.type()) {
-                case EXACT:
-                    Bmv2ExactMatchParam e = (Bmv2ExactMatchParam) param;
-                    helper.add(name, e.value());
-                    break;
-                case TERNARY:
-                    Bmv2TernaryMatchParam t = (Bmv2TernaryMatchParam) param;
-                    helper.add(name, t.value() + "&&&" + t.mask());
-                    break;
-                case LPM:
-                    Bmv2LpmMatchParam l = (Bmv2LpmMatchParam) param;
-                    helper.add(name, l.value() + "/" + String.valueOf(l.prefixLength()));
-                    break;
-                case VALID:
-                    Bmv2ValidMatchParam v = (Bmv2ValidMatchParam) param;
-                    helper.add(name, v.flag() ? "VALID" : "NOT_VALID");
-                    break;
-                default:
-                    helper.add(name, param);
-                    break;
-            }
-        });
-        return helper.toString();
-    }
-
-    /**
-     * Returns a new, empty BMv2 extension selector.
-     *
-     * @return a BMv2 extension treatment
-     */
-    public static Bmv2ExtensionSelector empty() {
-        return new Bmv2ExtensionSelector(Collections.emptyMap());
-    }
-
-    /**
-     * Returns a new builder of BMv2 extension selectors.
-     *
-     * @return a builder
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Builder of BMv2 extension selectors.
-     * <p>
-     * Match parameters are built from primitive data types ({@code short}, {@code int}, {@code long} or
-     * {@code byte[]}) and automatically casted to fixed-length byte sequences according to the given BMv2
-     * configuration.
-     */
-    public static final class Builder {
-
-        private final Map<Pair<String, String>, Bmv2MatchParam> parameterMap = Maps.newHashMap();
-        private Bmv2Configuration configuration;
-
-        private Builder() {
-            // ban constructor.
-        }
-
-        /**
-         * Sets the BMv2 configuration to format the match parameters of the selector.
-         *
-         * @param config a BMv2 configuration
-         * @return this
-         */
-        public Builder forConfiguration(Bmv2Configuration config) {
-            this.configuration = config;
-            return this;
-        }
-
-        /**
-         * Adds an exact match parameter for the given header field and value.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      a short value
-         * @return this
-         */
-        public Builder matchExact(String headerName, String fieldName, short value) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             exact(value));
-            return this;
-        }
-
-        /**
-         * Adds an exact match parameter for the given header field and value.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      an integer value
-         * @return this
-         */
-        public Builder matchExact(String headerName, String fieldName, int value) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             exact(value));
-            return this;
-        }
-
-        /**
-         * Adds an exact match parameter for the given header field and value.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      a long value
-         * @return this
-         */
-        public Builder matchExact(String headerName, String fieldName, long value) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             exact(value));
-            return this;
-        }
-
-        /**
-         * Adds an exact match parameter for the given header field and value.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      a byte array
-         * @return this
-         */
-        public Builder matchExact(String headerName, String fieldName, byte[] value) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             exact(value));
-            return this;
-        }
-
-        /**
-         * Adds a ternary match parameter for the given header field, value and mask.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      a short value
-         * @param mask       a short value
-         * @return this
-         */
-        public Builder matchTernary(String headerName, String fieldName, short value, short mask) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             ternary(value, mask));
-            return this;
-        }
-        /**
-         * Adds a ternary match parameter for the given header field, value and mask.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      an integer value
-         * @param mask       an integer value
-         * @return this
-         */
-        public Builder matchTernary(String headerName, String fieldName, int value, int mask) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             ternary(value, mask));
-            return this;
-        }
-        /**
-         * Adds a ternary match parameter for the given header field, value and mask.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      a long value
-         * @param mask       a long value
-         * @return this
-         */
-        public Builder matchTernary(String headerName, String fieldName, long value, long mask) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             ternary(value, mask));
-            return this;
-        }
-        /**
-         * Adds a ternary match parameter for the given header field, value and mask.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param value      a byte array
-         * @param mask       a byte array
-         * @return this
-         */
-        public Builder matchTernary(String headerName, String fieldName, byte[] value, byte[] mask) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             ternary(value, mask));
-            return this;
-        }
-
-        /**
-         * Adds a longest-prefix match (LPM) parameter for the given header field, value and prefix length.
-         *
-         * @param headerName   a string value
-         * @param fieldName    a string value
-         * @param value        a short value
-         * @param prefixLength an integer value
-         * @return this
-         */
-        public Builder matchLpm(String headerName, String fieldName, short value, int prefixLength) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             lpm(value, prefixLength));
-            return this;
-        }
-        /**
-         * Adds a longest-prefix match (LPM) parameter for the given header field, value and prefix length.
-         *
-         * @param headerName   a string value
-         * @param fieldName    a string value
-         * @param value        an integer value
-         * @param prefixLength an integer value
-         * @return this
-         */
-        public Builder matchLpm(String headerName, String fieldName, int value, int prefixLength) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             lpm(value, prefixLength));
-            return this;
-        }
-        /**
-         * Adds a longest-prefix match (LPM) parameter for the given header field, value and prefix length.
-         *
-         * @param headerName   a string value
-         * @param fieldName    a string value
-         * @param value        a long value
-         * @param prefixLength an integer value
-         * @return this
-         */
-        public Builder matchLpm(String headerName, String fieldName, long value, int prefixLength) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             lpm(value, prefixLength));
-            return this;
-        }
-        /**
-         * Adds a longest-prefix match (LPM) parameter for the given header field, value and prefix length.
-         *
-         * @param headerName   a string value
-         * @param fieldName    a string value
-         * @param value        a byte array
-         * @param prefixLength an integer value
-         * @return this
-         */
-        public Builder matchLpm(String headerName, String fieldName, byte[] value, int prefixLength) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             lpm(value, prefixLength));
-            return this;
-        }
-
-        /**
-         * Adds a valid match parameter for the given header field.
-         *
-         * @param headerName a string value
-         * @param fieldName  a string value
-         * @param flag       a boolean value
-         * @return this
-         */
-        public Builder matchValid(String headerName, String fieldName, boolean flag) {
-            parameterMap.put(Pair.of(checkNotNull(headerName, "header name cannot be null"),
-                                     checkNotNull(fieldName, "field name cannot be null")),
-                             new Bmv2ValidMatchParam(flag));
-            return this;
-        }
-
-        /**
-         * Returns a new BMv2 extension selector.
-         *
-         * @return a BMv2 extension selector
-         * @throws NullPointerException     if a given header or field name is not defined in the given configuration
-         * @throws IllegalArgumentException if a given parameter cannot be casted for the given configuration, e.g.
-         *                                  when trying to fit an integer value into a smaller, fixed-length parameter
-         *                                  produces overflow.
-         */
-        public Bmv2ExtensionSelector build() {
-            checkNotNull(configuration, "configuration cannot be null");
-            checkState(parameterMap.size() > 0, "parameter map cannot be empty");
-
-            final Map<String, Bmv2MatchParam> newParameterMap = Maps.newHashMap();
-
-            for (Pair<String, String> key : parameterMap.keySet()) {
-
-                String headerName = key.getLeft();
-                String fieldName = key.getRight();
-
-                Bmv2HeaderModel headerModel = configuration.header(headerName);
-                checkNotNull(headerModel, "no such a header in configuration", headerName);
-
-                Bmv2FieldTypeModel fieldModel = headerModel.type().field(fieldName);
-                checkNotNull(fieldModel, "no such a field in configuration", key);
-
-                int bitWidth = fieldModel.bitWidth();
-
-                Bmv2MatchParam oldParam = parameterMap.get(key);
-                Bmv2MatchParam newParam = null;
-
-                try {
-                    switch (oldParam.type()) {
-                        case EXACT:
-                            Bmv2ExactMatchParam e = (Bmv2ExactMatchParam) oldParam;
-                            newParam = new Bmv2ExactMatchParam(fitByteSequence(e.value(), bitWidth));
-                            break;
-                        case TERNARY:
-                            Bmv2TernaryMatchParam t = (Bmv2TernaryMatchParam) oldParam;
-                            newParam = new Bmv2TernaryMatchParam(fitByteSequence(t.value(), bitWidth),
-                                                                 fitByteSequence(t.mask(), bitWidth));
-                            break;
-                        case LPM:
-                            Bmv2LpmMatchParam l = (Bmv2LpmMatchParam) oldParam;
-                            checkArgument(l.prefixLength() <= bitWidth, "LPM parameter has prefix length too long",
-                                          key);
-                            newParam = new Bmv2LpmMatchParam(fitByteSequence(l.value(), bitWidth),
-                                                             l.prefixLength());
-                            break;
-                        case VALID:
-                            newParam = oldParam;
-                            break;
-                        default:
-                            throw new RuntimeException("Match parameter type not supported: " + oldParam.type());
-                    }
-                } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) {
-                    throw new IllegalArgumentException(e.getMessage() + " [" + key + "]");
-                }
-                // FIXME: should put the pair object instead of building a new string for the key.
-                newParameterMap.put(headerName + "." + fieldName, newParam);
-            }
-
-            return new Bmv2ExtensionSelector(newParameterMap);
-        }
-
-        private static Bmv2MatchParam exact(Object value) {
-            return new Bmv2ExactMatchParam(copyFrom(bb(value)));
-        }
-
-        private static Bmv2MatchParam ternary(Object value, Object mask) {
-            return new Bmv2TernaryMatchParam(copyFrom(bb(value)), copyFrom(bb(mask)));
-        }
-
-        private static Bmv2MatchParam lpm(Object value, int prefixLength) {
-            return new Bmv2LpmMatchParam(copyFrom(bb(value)), prefixLength);
-        }
-
-        private static ByteBuffer bb(Object value) {
-            if (value instanceof Short) {
-                return ByteBuffer.allocate(Short.BYTES).putShort((short) value);
-            } else if (value instanceof Integer) {
-                return ByteBuffer.allocate(Integer.BYTES).putInt((int) value);
-            } else if (value instanceof Long) {
-                return ByteBuffer.allocate(Long.BYTES).putLong((long) value);
-            } else if (value instanceof byte[]) {
-                byte[] bytes = (byte[]) value;
-                return ByteBuffer.allocate(bytes.length).put(bytes);
-            } else {
-                // Never here.
-                return null;
-            }
-        }
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionTreatment.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionTreatment.java
deleted file mode 100644
index 7062f41..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionTreatment.java
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import com.google.common.collect.Maps;
-import org.onlab.util.ImmutableByteSequence;
-import org.onlab.util.KryoNamespace;
-import org.onosproject.bmv2.api.context.Bmv2ActionModel;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2RuntimeDataModel;
-import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils;
-import org.onosproject.net.flow.AbstractExtension;
-import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.flow.instructions.ExtensionTreatmentType;
-import org.onosproject.store.serializers.KryoNamespaces;
-
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.StringJoiner;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.ImmutableByteSequence.copyFrom;
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence;
-import static org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes.BMV2_ACTION;
-
-/**
- * Extension treatment for BMv2 used as a wrapper for a {@link Bmv2Action}.
- */
-@Beta
-public final class Bmv2ExtensionTreatment extends AbstractExtension implements ExtensionTreatment {
-
-    private static final KryoNamespace APP_KRYO = new KryoNamespace.Builder()
-            .register(KryoNamespaces.API)
-            .register(Bmv2ExtensionTreatment.class)
-            .register(Bmv2Action.class)
-            .build();
-
-    private List<String> parameterNames;
-    private Bmv2Action action;
-
-    /**
-     * Creates a new extension treatment for the given BMv2 action.
-     * The list of action parameters name is also required for visualization purposes (i.e. nicer toString()).
-     *
-     * @param action         an action
-     * @param parameterNames a list of strings
-     */
-    private Bmv2ExtensionTreatment(Bmv2Action action, List<String> parameterNames) {
-        this.action = action;
-        this.parameterNames = parameterNames;
-    }
-
-    /**
-     * Returns the action contained by this extension selector.
-     *
-     * @return an action
-     */
-    public Bmv2Action action() {
-        return action;
-    }
-
-    @Override
-    public ExtensionTreatmentType type() {
-        return BMV2_ACTION.type();
-    }
-
-    @Override
-    public byte[] serialize() {
-        return APP_KRYO.serialize(this);
-    }
-
-    @Override
-    public void deserialize(byte[] data) {
-        Bmv2ExtensionTreatment other = APP_KRYO.deserialize(data);
-        action = other.action;
-        parameterNames = other.parameterNames;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(action);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2ExtensionTreatment other = (Bmv2ExtensionTreatment) obj;
-        return Objects.equal(this.action, other.action);
-    }
-
-    @Override
-    public String toString() {
-        StringJoiner stringJoiner = new StringJoiner(", ", "(", ")");
-        for (int i = 0; i < parameterNames.size(); i++) {
-            stringJoiner.add(parameterNames.get(i) + "=" + action.parameters().get(i));
-        }
-        return MoreObjects.toStringHelper(this)
-                .addValue(action.name() + stringJoiner.toString())
-                .toString();
-    }
-
-    /**
-     * Returns a new, empty BMv2 extension treatment.
-     *
-     * @return a BMv2 extension treatment
-     */
-    public static Bmv2ExtensionTreatment empty() {
-        return new Bmv2ExtensionTreatment(null, Collections.emptyList());
-    }
-
-    /**
-     * Returns a new BMv2 extension treatment builder.
-     *
-     * @return a builder
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * A builder of BMv2 extension treatments.
-     *
-     * BMv2 action parameters are built from primitive data types ({@code short}, {@code int}, {@code long} or
-     * {@code byte[]}) and automatically casted to fixed-length byte sequences according to the given BMv2
-     * configuration.
-     */
-    public static final class Builder {
-        private Bmv2Configuration configuration;
-        private String actionName;
-        private final Map<String, ImmutableByteSequence> parameters = Maps.newHashMap();
-
-        private Builder() {
-            // Ban constructor.
-        }
-
-        /**
-         * Sets the BMv2 configuration to format the action parameters.
-         *
-         * @param config a BMv2 configuration
-         * @return this
-         */
-        public Builder forConfiguration(Bmv2Configuration config) {
-            this.configuration = config;
-            return this;
-        }
-
-        /**
-         * Sets the action name.
-         *
-         * @param actionName a string value
-         * @return this
-         */
-        public Builder setActionName(String actionName) {
-            this.actionName = actionName;
-            return this;
-        }
-
-        /**
-         * Adds an action parameter.
-         *
-         * @param parameterName a string value
-         * @param value a short value
-         * @return this
-         */
-        public Builder addParameter(String parameterName, short value) {
-            this.parameters.put(parameterName, copyFrom(bb(value)));
-            return this;
-        }
-
-        /**
-         * Adds an action parameter.
-         *
-         * @param parameterName a string value
-         * @param value an integer value
-         * @return this
-         */
-        public Builder addParameter(String parameterName, int value) {
-            this.parameters.put(parameterName, copyFrom(bb(value)));
-            return this;
-        }
-
-        /**
-         * Adds an action parameter.
-         *
-         * @param parameterName a string value
-         * @param value a long value
-         * @return this
-         */
-        public Builder addParameter(String parameterName, long value) {
-            this.parameters.put(parameterName, copyFrom(bb(value)));
-            return this;
-        }
-
-        /**
-         * Adds an action parameter.
-         *
-         * @param parameterName a string value
-         * @param value a byte array
-         * @return this
-         */
-        public Builder addParameter(String parameterName, byte[] value) {
-            this.parameters.put(parameterName, copyFrom(bb(value)));
-            return this;
-        }
-
-        /**
-         * Returns a new BMv2 extension treatment.
-         *
-         * @return a BMv2 extension treatment
-         * @throws NullPointerException     if the given action or parameter names are not defined in the given
-         *                                  configuration
-         * @throws IllegalArgumentException if a given parameter cannot be casted for the given configuration, e.g.
-         *                                  when trying to fit an integer value into a smaller, fixed-length parameter
-         *                                  produces overflow.
-         */
-        public Bmv2ExtensionTreatment build() {
-            checkNotNull(configuration, "configuration cannot be null");
-            checkNotNull(actionName, "action name cannot be null");
-
-            Bmv2ActionModel actionModel = configuration.action(actionName);
-
-            checkNotNull(actionModel, "no such an action in configuration", actionName);
-            checkArgument(actionModel.runtimeDatas().size() == parameters.size(),
-                          "invalid number of parameters", actionName);
-
-            List<ImmutableByteSequence> newParameters = new ArrayList<>(parameters.size());
-            List<String> parameterNames = new ArrayList<>(parameters.size());
-
-            for (String parameterName : parameters.keySet()) {
-                Bmv2RuntimeDataModel runtimeData = actionModel.runtimeData(parameterName);
-                checkNotNull(runtimeData, "no such an action parameter in configuration",
-                             actionName + "->" + runtimeData.name());
-                int bitWidth = runtimeData.bitWidth();
-                try {
-                    ImmutableByteSequence newSequence = fitByteSequence(parameters.get(parameterName), bitWidth);
-                    int idx = actionModel.runtimeDatas().indexOf(runtimeData);
-                    newParameters.add(idx, newSequence);
-                    parameterNames.add(idx, parameterName);
-                } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) {
-                    throw new IllegalArgumentException(e.getMessage() +
-                                                               " [" + actionName + "->" + runtimeData.name() + "]");
-                }
-            }
-
-            return new Bmv2ExtensionTreatment(new Bmv2Action(actionName, newParameters), parameterNames);
-        }
-
-
-
-        private static ByteBuffer bb(Object value) {
-            if (value instanceof Short) {
-                return ByteBuffer.allocate(Short.BYTES).putShort((short) value);
-            } else if (value instanceof Integer) {
-                return ByteBuffer.allocate(Integer.BYTES).putInt((int) value);
-            } else if (value instanceof Long) {
-                return ByteBuffer.allocate(Long.BYTES).putLong((long) value);
-            } else if (value instanceof byte[]) {
-                byte[] bytes = (byte[]) value;
-                return ByteBuffer.allocate(bytes.length).put(bytes);
-            } else {
-                // Never here.
-                return null;
-            }
-        }
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2FlowRuleWrapper.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2FlowRuleWrapper.java
deleted file mode 100644
index e23059d..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2FlowRuleWrapper.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Objects;
-import org.onosproject.net.flow.FlowRule;
-
-/**
- * A wrapper for a ONOS flow rule installed on a BMv2 device.
- */
-@Beta
-public final class Bmv2FlowRuleWrapper {
-
-    private final FlowRule rule;
-    private final long entryId;
-    private final long installedOnMillis;
-
-    /**
-     * Creates a new flow rule wrapper.
-     *
-     * @param rule              a flow rule
-     * @param entryId           a BMv2 table entry ID
-     * @param installedOnMillis the time (in milliseconds, since January 1, 1970 UTC) when the flow rule was installed
-     *                          on the device
-     */
-    public Bmv2FlowRuleWrapper(FlowRule rule, long entryId, long installedOnMillis) {
-        this.rule = rule;
-        this.entryId = entryId;
-        this.installedOnMillis = installedOnMillis;
-    }
-
-    /**
-     * Returns the flow rule contained by this wrapper.
-     *
-     * @return a flow rule
-     */
-    public FlowRule rule() {
-        return rule;
-    }
-
-    /**
-     * Return the number of seconds since when this flow rule was installed on the device.
-     *
-     * @return an integer value
-     */
-    public long lifeInSeconds() {
-        return (System.currentTimeMillis() - installedOnMillis) / 1000;
-    }
-
-    /**
-     * Returns the the time (in milliseconds, since January 1, 1970 UTC) when the flow rule was installed on
-     * the device.
-     *
-     * @return a long value
-     */
-    public long installedOnMillis() {
-        return installedOnMillis;
-    }
-
-    /**
-     * Returns the BMv2 entry ID of this flow rule.
-     *
-     * @return a long value
-     */
-    public long entryId() {
-        return entryId;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(rule, entryId, installedOnMillis);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2FlowRuleWrapper other = (Bmv2FlowRuleWrapper) obj;
-        return Objects.equal(this.rule, other.rule)
-                && Objects.equal(this.entryId, other.entryId)
-                && Objects.equal(this.installedOnMillis, other.installedOnMillis);
-    }
-
-    @Override
-    public String toString() {
-        return installedOnMillis + "-" + rule.hashCode();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2LpmMatchParam.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2LpmMatchParam.java
deleted file mode 100644
index 5f280b3..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2LpmMatchParam.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import org.onlab.util.ImmutableByteSequence;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A BMv2 longest prefix match (LPM) parameter.
- */
-@Beta
-public final class Bmv2LpmMatchParam implements Bmv2MatchParam {
-
-    private final ImmutableByteSequence value;
-    private final int prefixLength;
-
-    /**
-     * Creates a new LPM parameter using the given byte sequence value and
-     * prefix length.
-     *
-     * @param value        a byte sequence value
-     * @param prefixLength an integer value
-     */
-    public Bmv2LpmMatchParam(ImmutableByteSequence value, int prefixLength) {
-        checkArgument(prefixLength >= 0, "prefix length cannot be negative");
-        this.value = checkNotNull(value);
-        this.prefixLength = prefixLength;
-    }
-
-    @Override
-    public Bmv2MatchParam.Type type() {
-        return Type.LPM;
-    }
-
-    /**
-     * Returns the byte sequence value of this parameter.
-     *
-     * @return a byte sequence value
-     */
-    public ImmutableByteSequence value() {
-        return this.value;
-    }
-
-    /**
-     * Returns the prefix length of this parameter.
-     *
-     * @return an integer value
-     */
-    public int prefixLength() {
-        return this.prefixLength;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(value, prefixLength);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2LpmMatchParam other = (Bmv2LpmMatchParam) obj;
-        return Objects.equal(this.value, other.value)
-                && Objects.equal(this.prefixLength, other.prefixLength);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("value", value)
-                .add("prefixLength", prefixLength)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2MatchKey.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2MatchKey.java
deleted file mode 100644
index 34276aa..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2MatchKey.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.collect.Lists;
-import org.onlab.util.ImmutableByteSequence;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * A match key of a BMv2 match-action table entry.
- */
-@Beta
-public final class Bmv2MatchKey {
-
-    private final List<Bmv2MatchParam> matchParams;
-
-    private Bmv2MatchKey(List<Bmv2MatchParam> matchParams) {
-        // ban constructor
-        this.matchParams = matchParams;
-    }
-
-    /**
-     * Returns a new match key builder.
-     *
-     * @return a match key builder
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Returns the list of match parameters of this match key.
-     *
-     * @return list match parameters
-     */
-    public final List<Bmv2MatchParam> matchParams() {
-        return Collections.unmodifiableList(matchParams);
-    }
-
-    @Override
-    public final int hashCode() {
-        return Objects.hashCode(matchParams);
-    }
-
-    @Override
-    public final boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2MatchKey other = (Bmv2MatchKey) obj;
-
-        return Objects.equals(this.matchParams, other.matchParams);
-    }
-
-    @Override
-    public final String toString() {
-        return MoreObjects.toStringHelper(this)
-                .addValue(matchParams)
-                .toString();
-    }
-
-    /**
-     * Builder of a BMv2 match key.
-     */
-    public static final class Builder {
-
-        private List<Bmv2MatchParam> matchParams;
-
-        private Builder() {
-            this.matchParams = Lists.newArrayList();
-        }
-
-        /**
-         * Adds a match parameter to the match key.
-         *
-         * @param param a match parameter
-         * @return this
-         */
-        public Builder add(Bmv2MatchParam param) {
-            this.matchParams.add(checkNotNull(param));
-            return this;
-        }
-
-        /**
-         * Adds a ternary match parameter where all bits are don't-care.
-         *
-         * @param byteLength length in bytes of the parameter
-         * @return this
-         */
-        public Builder withWildcard(int byteLength) {
-            checkArgument(byteLength > 0, "length must be a positive integer");
-            return add(new Bmv2TernaryMatchParam(
-                    ImmutableByteSequence.ofZeros(byteLength),
-                    ImmutableByteSequence.ofZeros(byteLength)));
-        }
-
-        /**
-         * Builds a new match key object.
-         *
-         * @return match key
-         */
-        public Bmv2MatchKey build() {
-            return new Bmv2MatchKey(this.matchParams);
-        }
-    }
-}
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2MatchParam.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2MatchParam.java
deleted file mode 100644
index 5ff1316..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2MatchParam.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-
-/**
- * Representation of a BMv2 match parameter.
- */
-@Beta
-public interface Bmv2MatchParam {
-
-    /**
-     * Returns the match type of this parameter.
-     *
-     * @return a match type value
-     */
-    Type type();
-
-    /**
-     * BMv2 match types.
-     */
-    enum Type {
-        /**
-         * Exact match type.
-         */
-        EXACT,
-        /**
-         * Ternary match type.
-         */
-        TERNARY,
-        /**
-         * Longest-prefix match type.
-         */
-        LPM,
-        /**
-         * Valid match type.
-         */
-        VALID
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ParsedTableEntry.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ParsedTableEntry.java
deleted file mode 100644
index bf59cf4..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ParsedTableEntry.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-
-/**
- * Representation of a table entry installed on a BMv2 device.
- */
-@Beta
-public final class Bmv2ParsedTableEntry {
-    private final long entryId;
-    private final Bmv2MatchKey matchKey;
-    private final Bmv2Action action;
-    private final int priority;
-
-    /**
-     * Creates a new parsed table entry.
-     *
-     * @param entryId  a long value
-     * @param matchKey a match key
-     * @param action   an action
-     * @param priority an integer value
-     */
-    public Bmv2ParsedTableEntry(long entryId, Bmv2MatchKey matchKey, Bmv2Action action, int priority) {
-        this.entryId = entryId;
-        this.matchKey = matchKey;
-        this.action = action;
-        this.priority = priority;
-    }
-
-    /**
-     * Returns the entry ID.
-     *
-     * @return a long value
-     */
-    public long entryId() {
-        return entryId;
-    }
-
-    /**
-     * Returns the match key.
-     *
-     * @return a match key object
-     */
-    public Bmv2MatchKey matchKey() {
-        return matchKey;
-    }
-
-    /**
-     * Returns the action.
-     *
-     * @return an action object
-     */
-    public Bmv2Action action() {
-        return action;
-    }
-
-    /**
-     * Returns the priority.
-     *
-     * @return an integer value
-     */
-    public int getPriority() {
-        return priority;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(entryId, matchKey, action, priority);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2ParsedTableEntry other = (Bmv2ParsedTableEntry) obj;
-        return Objects.equal(this.entryId, other.entryId)
-                && Objects.equal(this.matchKey, other.matchKey)
-                && Objects.equal(this.action, other.action)
-                && Objects.equal(this.priority, other.priority);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("entryId", entryId)
-                .add("matchKey", matchKey)
-                .add("action", action)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2PortInfo.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2PortInfo.java
deleted file mode 100644
index 568d141..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2PortInfo.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-
-/**
- * Information of a port of a BMv2 device.
- */
-@Beta
-public final class Bmv2PortInfo {
-
-    private final String ifaceName;
-    private final int number;
-    private final boolean isUp;
-
-    /**
-     * Creates a new port description.
-     *
-     * @param ifaceName the common name of the network interface
-     * @param number    a port number
-     * @param isUp      interface status
-     */
-    public Bmv2PortInfo(String ifaceName, int number, boolean isUp) {
-        this.ifaceName = ifaceName;
-        this.number = number;
-        this.isUp = isUp;
-    }
-
-    /**
-     * Returns the common name the network interface used by this port.
-     *
-     * @return a string value
-     */
-    public String ifaceName() {
-        return ifaceName;
-    }
-
-    /**
-     * Returns the number of this port.
-     *
-     * @return an integer value
-     */
-    public int number() {
-        return number;
-    }
-
-    /**
-     * Returns true if the port is up, false otherwise.
-     *
-     * @return a boolean value
-     */
-    public boolean isUp() {
-        return isUp;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(ifaceName, number, isUp);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2PortInfo other = (Bmv2PortInfo) obj;
-        return Objects.equal(this.ifaceName, other.ifaceName)
-                && Objects.equal(this.number, other.number)
-                && Objects.equal(this.isUp, other.isUp);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("ifaceName", ifaceName)
-                .add("number", number)
-                .add("isUp", isUp)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2RuntimeException.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2RuntimeException.java
deleted file mode 100644
index 176e6f0..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2RuntimeException.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-
-/**
- * General exception of the BMv2 runtime APIs.
- */
-@Beta
-public final class Bmv2RuntimeException extends Exception {
-
-    private final Code code;
-    private String codeString;
-
-    public Bmv2RuntimeException(String message) {
-        super(message);
-        this.code = Code.OTHER;
-        this.codeString = message;
-    }
-
-    public Bmv2RuntimeException(Throwable cause) {
-        super(cause);
-        this.code = Code.OTHER;
-        this.codeString = cause.toString();
-    }
-
-    public Bmv2RuntimeException(Code code) {
-        super(code.name());
-        this.code = code;
-    }
-
-    public Code getCode() {
-        return this.code;
-    }
-
-    public String explain() {
-        return (codeString == null) ? code.name() : code.name() + " " + codeString;
-    }
-
-    @Override
-    public String toString() {
-        return getClass().getSimpleName() + " " + explain();
-    }
-
-    public enum Code {
-        TABLE_FULL,
-        TABLE_INVALID_HANDLE,
-        TABLE_EXPIRED_HANDLE,
-        TABLE_COUNTERS_DISABLED,
-        TABLE_METERS_DISABLED,
-        TABLE_AGEING_DISABLED,
-        TABLE_INVALID_TABLE_NAME,
-        TABLE_INVALID_ACTION_NAME,
-        TABLE_WRONG_TABLE_TYPE,
-        TABLE_INVALID_MBR_HANDLE,
-        TABLE_MBR_STILL_USED,
-        TABLE_MBR_ALREADY_IN_GRP,
-        TABLE_MBR_NOT_IN_GRP,
-        TABLE_INVALID_GRP_HANDLE,
-        TABLE_GRP_STILL_USED,
-        TABLE_EMPTY_GRP,
-        TABLE_DUPLICATE_ENTRY,
-        TABLE_BAD_MATCH_KEY,
-        TABLE_INVALID_METER_OPERATION,
-        TABLE_DEFAULT_ACTION_IS_CONST,
-        TABLE_DEFAULT_ENTRY_IS_CONST,
-        TABLE_GENERAL_ERROR,
-        TABLE_UNKNOWN_ERROR,
-
-        DEV_MGR_ERROR_GENERAL,
-        DEV_MGR_UNKNOWN,
-
-        COUNTER_INVALID_NAME,
-        COUNTER_INVALID_INDEX,
-        COUNTER_ERROR_GENERAL,
-        COUNTER_ERROR_UNKNOWN,
-
-        SWAP_CONFIG_DISABLED,
-        SWAP_ONGOING,
-        SWAP_NO_ONGOING,
-        SWAP_ERROR_UKNOWN,
-
-        // TODO: add other codes based on autogenerated Thrift APIs
-
-        OTHER
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TableEntry.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TableEntry.java
deleted file mode 100644
index 6ea97e9..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TableEntry.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-
-import java.util.Objects;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * An entry of a match-action table in a BMv2 device.
- */
-@Beta
-public final class Bmv2TableEntry {
-
-    private static final int NO_PRIORITY_VALUE = -1;
-    private static final int NO_TIMEOUT_VALUE = -1;
-
-    private final String tableName;
-    private final Bmv2MatchKey matchKey;
-    private final Bmv2Action action;
-    private final int priority;
-    private final double timeout;
-
-    private Bmv2TableEntry(String tableName, Bmv2MatchKey matchKey,
-                           Bmv2Action action, int priority, double timeout) {
-        this.tableName = tableName;
-        this.matchKey = matchKey;
-        this.action = action;
-        this.priority = priority;
-        this.timeout = timeout;
-    }
-
-    /**
-     * Returns a new BMv2 table entry builder.
-     *
-     * @return a new builder.
-     */
-    public static Builder builder() {
-        return new Builder();
-    }
-
-    /**
-     * Returns the name of the table where this entry is installed.
-     *
-     * @return table name
-     */
-    public final String tableName() {
-        return this.tableName;
-    }
-
-    /**
-     * Returns the match key of this table entry.
-     *
-     * @return match key
-     */
-    public final Bmv2MatchKey matchKey() {
-        return matchKey;
-    }
-
-    /**
-     * Returns the action of this table entry.
-     *
-     * @return action
-     */
-    public final Bmv2Action action() {
-        return action;
-    }
-
-    /**
-     * Returns true is the entry has a valid priority.
-     *
-     * @return true if priority is set, false elsewhere
-     */
-    public final boolean hasPriority() {
-        return this.priority != NO_PRIORITY_VALUE;
-    }
-
-    /**
-     * Return the priority of this table entry.
-     *
-     * @return priority
-     */
-    public final int priority() {
-        return priority;
-    }
-
-    /**
-     * Returns true is this table entry has a valid timeout.
-     *
-     * @return true if timeout is set, false elsewhere
-     */
-    public final boolean hasTimeout() {
-        return this.timeout != NO_PRIORITY_VALUE;
-    }
-
-    /**
-     * Returns the timeout (in fractional seconds) of this table entry.
-     *
-     * @return a timeout vale (in fractional seconds)
-     */
-    public final double timeout() {
-        return timeout;
-    }
-
-    @Override
-    public final int hashCode() {
-        return Objects.hash(matchKey, action, priority, timeout);
-    }
-
-    @Override
-    public final boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2TableEntry other = (Bmv2TableEntry) obj;
-        return Objects.equals(this.matchKey, other.matchKey)
-                && Objects.equals(this.action, other.action)
-                && Objects.equals(this.priority, other.priority)
-                && Objects.equals(this.timeout, other.timeout);
-    }
-
-    @Override
-    public final String toString() {
-        return com.google.common.base.MoreObjects.toStringHelper(this)
-                .addValue(matchKey)
-                .addValue(action)
-                .add("priority", priority)
-                .add("timeout", timeout)
-                .toString();
-    }
-
-    public static final class Builder {
-
-        private String tableName;
-        private Bmv2MatchKey matchKey;
-        private Bmv2Action action;
-        private int priority = NO_PRIORITY_VALUE;
-        private double timeout = NO_TIMEOUT_VALUE;
-
-        private Builder() {
-            // hide constructor
-        }
-
-        /**
-         * Sets the table name.
-         *
-         * @param tableName a string value
-         * @return this
-         */
-        public Builder withTableName(String tableName) {
-            this.tableName = checkNotNull(tableName, "table name cannot be null");
-            return this;
-        }
-
-        /**
-         * Sets the match key.
-         *
-         * @param matchKey a match key value
-         * @return this
-         */
-        public Builder withMatchKey(Bmv2MatchKey matchKey) {
-            this.matchKey = checkNotNull(matchKey, "match key cannot be null");
-            return this;
-        }
-
-        /**
-         * Sets the action.
-         *
-         * @param action an action value
-         * @return this
-         */
-        public Builder withAction(Bmv2Action action) {
-            this.action = checkNotNull(action, "action cannot be null");
-            return this;
-        }
-
-        public Builder withPriority(int priority) {
-            checkArgument(priority >= 0, "priority cannot be negative");
-            this.priority = priority;
-            return this;
-        }
-
-        /**
-         * Sets the timeout.
-         *
-         * @param timeout a timeout value in fractional seconds
-         * @return this
-         */
-        public Builder withTimeout(double timeout) {
-            checkArgument(timeout > 0, "timeout must be a positive non-zero value");
-            this.timeout = timeout;
-            return this;
-        }
-
-        /**
-         * Build the table entry.
-         *
-         * @return a new table entry object
-         */
-        public Bmv2TableEntry build() {
-            return new Bmv2TableEntry(tableName, matchKey, action, priority,
-                                      timeout);
-
-        }
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TableEntryReference.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TableEntryReference.java
deleted file mode 100644
index 6283239..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TableEntryReference.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import org.onosproject.net.DeviceId;
-
-/**
- * A reference to a table entry installed on a BMv2 device.
- */
-@Beta
-public final class Bmv2TableEntryReference {
-
-
-    private final DeviceId deviceId;
-    private final String tableName;
-    private final Bmv2MatchKey matchKey;
-
-    /**
-     * Creates a new table entry reference.
-     *
-     * @param deviceId a device ID
-     * @param tableName a table name
-     * @param matchKey a match key
-     */
-    public Bmv2TableEntryReference(DeviceId deviceId, String tableName, Bmv2MatchKey matchKey) {
-        this.deviceId = deviceId;
-        this.tableName = tableName;
-        this.matchKey = matchKey;
-    }
-
-    /**
-     * Returns the device ID of this table entry reference.
-     *
-     * @return a device ID
-     */
-    public DeviceId deviceId() {
-        return deviceId;
-    }
-
-    /**
-     * Returns the name of the table of this table entry reference.
-     *
-     * @return a table name
-     */
-    public String tableName() {
-        return tableName;
-    }
-
-    /**
-     * Returns the match key of this table entry reference.
-     *
-     * @return a match key
-     */
-    public Bmv2MatchKey matchKey() {
-        return matchKey;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(deviceId, tableName, matchKey);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2TableEntryReference other = (Bmv2TableEntryReference) obj;
-        return Objects.equal(this.deviceId, other.deviceId)
-                && Objects.equal(this.tableName, other.tableName)
-                && Objects.equal(this.matchKey, other.matchKey);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("deviceId", deviceId)
-                .add("tableName", tableName)
-                .add("matchKey", matchKey)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TernaryMatchParam.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TernaryMatchParam.java
deleted file mode 100644
index 713d532..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2TernaryMatchParam.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-import com.google.common.base.Objects;
-import org.onlab.util.ImmutableByteSequence;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static com.google.common.base.Preconditions.checkState;
-
-/**
- * Representation of a BMv2 ternary match parameter.
- */
-@Beta
-public final class Bmv2TernaryMatchParam implements Bmv2MatchParam {
-
-    private final ImmutableByteSequence value;
-    private final ImmutableByteSequence mask;
-
-    /**
-     * Creates a new ternary match parameter using the given byte sequences of
-     * value and mask.
-     *
-     * @param value a byte sequence value
-     * @param mask  a byte sequence value
-     */
-    public Bmv2TernaryMatchParam(ImmutableByteSequence value,
-                                 ImmutableByteSequence mask) {
-        this.value = checkNotNull(value, "value cannot be null");
-        this.mask = checkNotNull(mask, "value cannot be null");
-        checkState(value.size() == mask.size(),
-                   "value and mask must have equal size");
-    }
-
-    @Override
-    public Type type() {
-        return Type.TERNARY;
-    }
-
-    /**
-     * Returns the byte sequence value of by this parameter.
-     *
-     * @return a byte sequence value
-     */
-    public ImmutableByteSequence value() {
-        return this.value;
-    }
-
-    /**
-     * Returns the byte sequence mask of by this parameter.
-     *
-     * @return a byte sequence value
-     */
-    public ImmutableByteSequence mask() {
-        return this.mask;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(value, mask);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2TernaryMatchParam other = (Bmv2TernaryMatchParam) obj;
-        return Objects.equal(this.value, other.value)
-                && Objects.equal(this.mask, other.mask);
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("value", value)
-                .add("mask", mask)
-                .toString();
-    }
-}
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ValidMatchParam.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ValidMatchParam.java
deleted file mode 100644
index 9312b56..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/Bmv2ValidMatchParam.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
-
-import java.util.Objects;
-
-/**
- * Representation of a BMv2 valid match parameter.
- */
-@Beta
-public final class Bmv2ValidMatchParam implements Bmv2MatchParam {
-
-    private final boolean flag;
-
-    /**
-     * Creates a new valid match parameter using the given boolean flag.
-     *
-     * @param flag a boolean value
-     */
-    public Bmv2ValidMatchParam(boolean flag) {
-        this.flag = flag;
-    }
-
-    @Override
-    public Type type() {
-        return Type.VALID;
-    }
-
-    /**
-     * Returns the boolean flag of this parameter.
-     *
-     * @return a boolean value
-     */
-    public boolean flag() {
-        return flag;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hashCode(flag);
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (obj == null || getClass() != obj.getClass()) {
-            return false;
-        }
-        final Bmv2ValidMatchParam other = (Bmv2ValidMatchParam) obj;
-        return this.flag == other.flag;
-    }
-
-    @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this)
-                .add("flag", flag)
-                .toString();
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/package-info.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/package-info.java
deleted file mode 100644
index d4b1279..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/runtime/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 runtime API.
- */
-package org.onosproject.bmv2.api.runtime;
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2Controller.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2Controller.java
deleted file mode 100644
index 22ba016..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2Controller.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.service;
-
-import com.google.common.annotations.Beta;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.net.DeviceId;
-
-/**
- * A controller of BMv2 devices.
- */
-@Beta
-public interface Bmv2Controller {
-
-    /**
-     * Default port.
-     */
-    int DEFAULT_PORT = 40123;
-
-    /**
-     * Return an agent to operate on the given device.
-     *
-     * @param deviceId a device ID
-     * @return a BMv2 agent
-     * @throws Bmv2RuntimeException if the agent is not available
-     */
-    Bmv2DeviceAgent getAgent(DeviceId deviceId) throws Bmv2RuntimeException;
-
-    /**
-     * Returns true if the given device is reachable from this controller, false otherwise.
-     *
-     * @param deviceId a device ID
-     * @return a boolean value
-     */
-    boolean isReacheable(DeviceId deviceId);
-
-    /**
-     * Register the given device listener.
-     *
-     * @param listener a device listener
-     */
-    void addDeviceListener(Bmv2DeviceListener listener);
-
-    /**
-     * Unregister the given device listener.
-     *
-     * @param listener a device listener
-     */
-    void removeDeviceListener(Bmv2DeviceListener listener);
-
-    /**
-     * Register the given packet listener.
-     *
-     * @param listener a packet listener
-     */
-    void addPacketListener(Bmv2PacketListener listener);
-
-    /**
-     * Unregister the given packet listener.
-     *
-     * @param listener a packet listener
-     */
-    void removePacketListener(Bmv2PacketListener listener);
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2DeviceContextService.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2DeviceContextService.java
deleted file mode 100644
index ed15134..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2DeviceContextService.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.service;
-
-import com.google.common.annotations.Beta;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.net.DeviceId;
-
-/**
- * A service for managing BMv2 device contexts.
- */
-@Beta
-public interface Bmv2DeviceContextService {
-
-    /**
-     * Returns the context of the given device, null if no context has been previously set.
-     *
-     * @param deviceId a device ID
-     * @return a BMv2 device context
-     */
-    Bmv2DeviceContext getContext(DeviceId deviceId);
-
-    /**
-     * Sets the context for the given device.
-     *
-     * @param deviceId a device ID
-     * @param context  a BMv2 device context
-     */
-    void setContext(DeviceId deviceId, Bmv2DeviceContext context);
-
-    /**
-     * Binds the given interpreter with the given class loader so that other ONOS instances in the cluster can properly
-     * load the interpreter.
-     *
-     * @param interpreterClass an interpreter class
-     * @param loader           a class loader
-     */
-    void registerInterpreterClassLoader(Class<? extends Bmv2Interpreter> interpreterClass, ClassLoader loader);
-
-    /**
-     * Returns the default context.
-     *
-     * @return a BMv2 device context
-     */
-    Bmv2DeviceContext defaultContext();
-
-    /**
-     * Sets the default context for the given device.
-     */
-    void setDefaultContext(DeviceId deviceId);
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2DeviceListener.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2DeviceListener.java
deleted file mode 100644
index cb8c444..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2DeviceListener.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.service;
-
-import com.google.common.annotations.Beta;
-import org.onosproject.bmv2.api.runtime.Bmv2Device;
-
-/**
- * A listener of BMv2 device events.
- */
-@Beta
-public interface Bmv2DeviceListener {
-
-    /**
-     * Handles a hello message.
-     *
-     * @param device        the BMv2 device that originated the message
-     * @param instanceId    the ID of the BMv2 process instance
-     * @param jsonConfigMd5 the MD5 sum of the JSON configuration currently running on the device
-     */
-    void handleHello(Bmv2Device device, int instanceId, String jsonConfigMd5);
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2PacketListener.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2PacketListener.java
deleted file mode 100644
index 32629eb..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2PacketListener.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.service;
-
-import com.google.common.annotations.Beta;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.runtime.Bmv2Device;
-
-/**
- * A listener of BMv2 packet events.
- */
-@Beta
-public interface Bmv2PacketListener {
-
-    /**
-     * Handles a packet-in message.
-     *
-     * @param device    the BMv2 device that originated the message
-     * @param inputPort the device port where the packet was received
-     * @param packet    the packet raw data
-     */
-    void handlePacketIn(Bmv2Device device, int inputPort, ImmutableByteSequence packet);
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2TableEntryService.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2TableEntryService.java
deleted file mode 100644
index 5c5ee38..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/Bmv2TableEntryService.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.service;
-
-
-import com.google.common.annotations.Beta;
-import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslator;
-import org.onosproject.bmv2.api.runtime.Bmv2FlowRuleWrapper;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntryReference;
-import org.onosproject.net.DeviceId;
-
-/**
- * A service for managing BMv2 table entries.
- */
-@Beta
-public interface Bmv2TableEntryService {
-
-    /**
-     * Returns a flow rule translator.
-     *
-     * @return a flow rule translator
-     */
-    Bmv2FlowRuleTranslator getFlowRuleTranslator();
-
-    /**
-     * Binds the given ONOS flow rule with a BMv2 table entry reference.
-     *
-     * @param entryRef a table entry reference
-     * @param rule     a BMv2 flow rule wrapper
-     */
-    void bind(Bmv2TableEntryReference entryRef, Bmv2FlowRuleWrapper rule);
-
-    /**
-     * Returns the ONOS flow rule associated with the given BMv2 table entry reference, or null if there's no such a
-     * mapping.
-     *
-     * @param entryRef a table entry reference
-     * @return a BMv2 flow rule wrapper
-     */
-    Bmv2FlowRuleWrapper lookup(Bmv2TableEntryReference entryRef);
-
-    /**
-     * Removes any flow rule previously bound with a given BMv2 table entry reference.
-     *
-     * @param entryRef a table entry reference
-     */
-    void unbind(Bmv2TableEntryReference entryRef);
-
-    /**
-     * Removes all bindings for a given device.
-     *
-     * @param deviceId a device ID
-     */
-    void unbindAll(DeviceId deviceId);
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/package-info.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/package-info.java
deleted file mode 100644
index 07bb1a0..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/service/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 service API.
- */
-package org.onosproject.bmv2.api.service;
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/utils/Bmv2TranslatorUtils.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/utils/Bmv2TranslatorUtils.java
deleted file mode 100644
index 0cc102b..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/utils/Bmv2TranslatorUtils.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.utils;
-
-import com.google.common.annotations.Beta;
-import org.onlab.util.HexString;
-import org.onlab.util.ImmutableByteSequence;
-
-import java.util.Arrays;
-
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Collection of utility methods to deal with flow rule translation.
- */
-@Beta
-public final class Bmv2TranslatorUtils {
-
-    private Bmv2TranslatorUtils() {
-        // Ban constructor.
-    }
-
-    /**
-     * Returns the number of bytes necessary to contain the given bit-width.
-     *
-     * @param bitWidth an integer value
-     * @return an integer value
-     */
-    public static int roundToBytes(int bitWidth) {
-        return (int) Math.ceil((double) bitWidth / 8);
-    }
-
-    /**
-     * Trims or expands the given byte sequence so to fit a given bit-width.
-     *
-     * @param original a byte sequence
-     * @param bitWidth an integer value
-     * @return a new byte sequence
-     * @throws ByteSequenceFitException if the byte sequence cannot be fitted in the given bit-width
-     */
-    public static ImmutableByteSequence fitByteSequence(ImmutableByteSequence original, int bitWidth)
-            throws ByteSequenceFitException {
-
-        checkNotNull(original, "byte sequence cannot be null");
-        checkArgument(bitWidth > 0, "byte width must a non-zero positive integer");
-
-        int newByteWidth = roundToBytes(bitWidth);
-
-        if (original.size() == newByteWidth) {
-            // nothing to do
-            return original;
-        }
-
-        byte[] originalBytes = original.asArray();
-
-        if (newByteWidth > original.size()) {
-            // pad missing bytes with zeros
-            return ImmutableByteSequence.copyFrom(Arrays.copyOf(originalBytes, newByteWidth));
-        }
-
-        byte[] newBytes = new byte[newByteWidth];
-        // ImmutableByteSequence is always big-endian, hence check the array in reverse order
-        int diff = originalBytes.length - newByteWidth;
-        for (int i = originalBytes.length - 1; i > 0; i--) {
-            byte ob = originalBytes[i]; // original byte
-            byte nb; // new byte
-            if (i > diff) {
-                // no need to truncate, copy as is
-                nb = ob;
-            } else if (i == diff) {
-                // truncate this byte, check if we're loosing something
-                byte mask = (byte) ((1 >> ((bitWidth % 8) + 1)) - 1);
-                if ((ob & ~mask) != 0) {
-                    throw new ByteSequenceFitException(originalBytes, bitWidth);
-                } else {
-                    nb = (byte) (ob & mask);
-                }
-            } else {
-                // drop this byte, check if we're loosing something
-                if (originalBytes[i] != 0) {
-                    throw new ByteSequenceFitException(originalBytes, bitWidth);
-                } else {
-                    continue;
-                }
-            }
-            newBytes[i - diff] = nb;
-        }
-
-        return ImmutableByteSequence.copyFrom(newBytes);
-    }
-
-    /**
-     * A byte sequence fit exception.
-     */
-    public static class ByteSequenceFitException extends Exception {
-        public ByteSequenceFitException(byte[] bytes, int bitWidth) {
-            super("cannot fit " + HexString.toHexString(bytes) + " into a " + bitWidth + " bits value");
-        }
-    }
-}
diff --git a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/utils/package-info.java b/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/utils/package-info.java
deleted file mode 100644
index bdae039..0000000
--- a/protocols/bmv2/api/src/main/java/org/onosproject/bmv2/api/utils/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 utils.
- */
-package org.onosproject.bmv2.api.utils;
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/test/java/org/onosproject/bmv2/api/context/Bmv2ConfigurationTest.java b/protocols/bmv2/api/src/test/java/org/onosproject/bmv2/api/context/Bmv2ConfigurationTest.java
deleted file mode 100644
index bc1659d..0000000
--- a/protocols/bmv2/api/src/test/java/org/onosproject/bmv2/api/context/Bmv2ConfigurationTest.java
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.context;
-
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.testing.EqualsTester;
-import org.hamcrest.collection.IsIterableContainingInOrder;
-import org.junit.Before;
-import org.junit.Test;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.hasSize;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.core.IsEqual.equalTo;
-
-/**
- * BMv2 JSON configuration parser test.
- */
-public class Bmv2ConfigurationTest {
-
-    private JsonObject json;
-    private JsonObject json2;
-
-    @Before
-    public void setUp() throws Exception {
-        json = Json.parse(new BufferedReader(new InputStreamReader(
-                this.getClass().getResourceAsStream("/simple.json")))).asObject();
-        json2 = Json.parse(new BufferedReader(new InputStreamReader(
-                this.getClass().getResourceAsStream("/simple.json")))).asObject();
-    }
-
-    @Test
-    public void testParse() throws Exception {
-        Bmv2Configuration config = Bmv2DefaultConfiguration.parse(json);
-        Bmv2Configuration config2 = Bmv2DefaultConfiguration.parse(json2);
-
-        new EqualsTester()
-                .addEqualityGroup(config, config2)
-                .testEquals();
-
-        /* Check header types */
-        Bmv2HeaderTypeModel stdMetaT = config.headerType("standard_metadata_t");
-        Bmv2HeaderTypeModel ethernetT = config.headerType("ethernet_t");
-        Bmv2HeaderTypeModel intrinsicMetaT = config.headerType("intrinsic_metadata_t");
-
-        Bmv2HeaderTypeModel stdMetaT2 = config2.headerType("standard_metadata_t");
-        Bmv2HeaderTypeModel ethernetT2 = config2.headerType("ethernet_t");
-        Bmv2HeaderTypeModel intrinsicMetaT2 = config2.headerType("intrinsic_metadata_t");
-
-        new EqualsTester()
-                .addEqualityGroup(stdMetaT, stdMetaT2)
-                .addEqualityGroup(ethernetT, ethernetT2)
-                .addEqualityGroup(intrinsicMetaT, intrinsicMetaT2)
-                .testEquals();
-
-        // existence
-        assertThat("Json parsed value is null", stdMetaT, notNullValue());
-        assertThat("Json parsed value is null", ethernetT, notNullValue());
-        assertThat("Json parsed value is null", intrinsicMetaT, notNullValue());
-
-        // fields size
-        assertThat("Incorrect size for header type fields",
-                   stdMetaT.fields(), hasSize(8));
-        assertThat("Incorrect size for header type fields",
-                   ethernetT.fields(), hasSize(3));
-        assertThat("Incorrect size for header type fields",
-                   intrinsicMetaT.fields(), hasSize(4));
-
-        // check that fields are in order
-        assertThat("Incorrect order for header type fields",
-                   stdMetaT.fields(), IsIterableContainingInOrder.contains(
-                        stdMetaT.field("ingress_port"),
-                        stdMetaT.field("packet_length"),
-                        stdMetaT.field("egress_spec"),
-                        stdMetaT.field("egress_port"),
-                        stdMetaT.field("egress_instance"),
-                        stdMetaT.field("instance_type"),
-                        stdMetaT.field("clone_spec"),
-                        stdMetaT.field("_padding")));
-
-        /* Check actions */
-        Bmv2ActionModel floodAction = config.action("flood");
-        Bmv2ActionModel dropAction = config.action("_drop");
-        Bmv2ActionModel fwdAction = config.action("set_egress_port");
-
-        Bmv2ActionModel floodAction2 = config2.action("flood");
-        Bmv2ActionModel dropAction2 = config2.action("_drop");
-        Bmv2ActionModel fwdAction2 = config2.action("set_egress_port");
-
-        new EqualsTester()
-                .addEqualityGroup(floodAction, floodAction2)
-                .addEqualityGroup(dropAction, dropAction2)
-                .addEqualityGroup(fwdAction, fwdAction2)
-                .testEquals();
-
-        // existence
-        assertThat("Json parsed value is null", floodAction, notNullValue());
-        assertThat("Json parsed value is null", dropAction, notNullValue());
-        assertThat("Json parsed value is null", fwdAction, notNullValue());
-
-        // runtime data size
-        assertThat("Incorrect size for action runtime data",
-                   floodAction.runtimeDatas().size(), is(equalTo(0)));
-        assertThat("Incorrect size for action runtime data",
-                   dropAction.runtimeDatas().size(), is(equalTo(0)));
-        assertThat("Incorrect size for action runtime data",
-                   fwdAction.runtimeDatas().size(), is(equalTo(1)));
-
-        // runtime data existence and parsing
-        assertThat("Parsed Json value is null",
-                   fwdAction.runtimeData("port"), notNullValue());
-        assertThat("Incorrect value for action runtime data bitwidth",
-                   fwdAction.runtimeData("port").bitWidth(), is(equalTo(9)));
-
-        /* Check tables */
-        Bmv2TableModel table0 = config.table(0);
-        Bmv2TableModel table02 = config2.table(0);
-
-        new EqualsTester()
-                .addEqualityGroup(table0, table02)
-                .testEquals();
-
-        // existence
-        assertThat("Parsed Json value is null", table0, notNullValue());
-
-        // id and name correspondence
-        assertThat("Incorrect value for table name",
-                   table0.name(), is(equalTo("table0")));
-
-        // keys size
-        assertThat("Incorrect size for table keys",
-                   table0.keys().size(), is(equalTo(4)));
-
-        // key match type
-        assertThat("Incorrect value for table key match type",
-                   table0.keys().get(0).matchType(), is(equalTo(Bmv2MatchParam.Type.TERNARY)));
-
-        // header type
-        assertThat("Incorrect value for table key header type",
-                   table0.keys().get(0).field().header().type(), is(equalTo(stdMetaT)));
-    }
-}
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/test/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionsTest.java b/protocols/bmv2/api/src/test/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionsTest.java
deleted file mode 100644
index d3ffbdd..0000000
--- a/protocols/bmv2/api/src/test/java/org/onosproject/bmv2/api/runtime/Bmv2ExtensionsTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.api.runtime;
-
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
-import com.google.common.testing.EqualsTester;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.MacAddress;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2DefaultConfiguration;
-
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.is;
-
-public class Bmv2ExtensionsTest {
-
-    private Bmv2Configuration config;
-
-    @Before
-    public void setUp() throws Exception {
-        JsonObject json = Json.parse(new BufferedReader(new InputStreamReader(
-                this.getClass().getResourceAsStream("/simple.json")))).asObject();
-        config = Bmv2DefaultConfiguration.parse(json);
-    }
-
-    @Test
-    public void testExtensionSelectorBuilder() throws Exception {
-
-        Bmv2ExtensionSelector extSelectorExact = Bmv2ExtensionSelector.builder()
-                .forConfiguration(config)
-                .matchExact("standard_metadata", "ingress_port", (short) 255)
-                .matchExact("ethernet", "etherType", 512)
-                .matchExact("ethernet", "dstAddr", 1024L)
-                .matchExact("ethernet", "srcAddr", MacAddress.BROADCAST.toBytes())
-                .build();
-
-        Bmv2ExtensionSelector extSelectorTernary = Bmv2ExtensionSelector.builder()
-                .forConfiguration(config)
-                .matchTernary("standard_metadata", "ingress_port", (short) 255, (short) 255)
-                .matchTernary("ethernet", "etherType", 512, 512)
-                .matchTernary("ethernet", "dstAddr", 1024L, 1024L)
-                .matchTernary("ethernet", "srcAddr", MacAddress.BROADCAST.toBytes(), MacAddress.NONE.toBytes())
-                .build();
-
-        Bmv2ExtensionSelector extSelectorLpm = Bmv2ExtensionSelector.builder()
-                .forConfiguration(config)
-                .matchLpm("standard_metadata", "ingress_port", (short) 255, 1)
-                .matchLpm("ethernet", "etherType", 512, 2)
-                .matchLpm("ethernet", "dstAddr", 1024L, 3)
-                .matchLpm("ethernet", "srcAddr", MacAddress.BROADCAST.toBytes(), 4)
-                .build();
-
-        Bmv2ExtensionSelector extSelectorValid = Bmv2ExtensionSelector.builder()
-                .forConfiguration(config)
-                .matchValid("standard_metadata", "ingress_port", true)
-                .matchValid("ethernet", "etherType", true)
-                .matchValid("ethernet", "dstAddr", false)
-                .matchValid("ethernet", "srcAddr", false)
-                .build();
-
-        assertThat(extSelectorExact.parameterMap().size(), is(4));
-        assertThat(extSelectorTernary.parameterMap().size(), is(4));
-        assertThat(extSelectorLpm.parameterMap().size(), is(4));
-        assertThat(extSelectorValid.parameterMap().size(), is(4));
-
-        // TODO add more tests, e.g. check for byte sequences content and size.
-    }
-
-    @Test
-    public void testExtensionTreatmentBuilder() throws Exception {
-
-        Bmv2ExtensionTreatment treatment = Bmv2ExtensionTreatment.builder()
-                .forConfiguration(config)
-                .setActionName("set_egress_port")
-                .addParameter("port", 1)
-                .build();
-
-        assertThat(treatment.action().parameters().size(), is(1));
-
-        // TODO add more tests, e.g. check for byte sequences content and size.
-    }
-
-    @Test
-    public void testExtensionSelectorSerialization() throws Exception {
-
-        Bmv2ExtensionSelector original = Bmv2ExtensionSelector.builder()
-                .forConfiguration(config)
-                .matchExact("standard_metadata", "ingress_port", (short) 255)
-                .matchLpm("ethernet", "etherType", 512, 4)
-                .matchTernary("ethernet", "dstAddr", 1024L, 512L)
-                .matchValid("ethernet", "srcAddr", true)
-                .build();
-
-        Bmv2ExtensionSelector other = Bmv2ExtensionSelector.empty();
-        other.deserialize(original.serialize());
-
-        new EqualsTester()
-                .addEqualityGroup(original, other)
-                .testEquals();
-    }
-
-    @Test
-    public void testExtensionTreatmentSerialization() throws Exception {
-
-        Bmv2ExtensionTreatment original = Bmv2ExtensionTreatment.builder()
-                .forConfiguration(config)
-                .setActionName("set_egress_port")
-                .addParameter("port", 1)
-                .build();
-
-        Bmv2ExtensionTreatment other = Bmv2ExtensionTreatment.empty();
-        other.deserialize(original.serialize());
-
-        new EqualsTester()
-                .addEqualityGroup(original, other)
-                .testEquals();
-    }
-}
\ No newline at end of file
diff --git a/protocols/bmv2/api/src/test/resources/simple.json b/protocols/bmv2/api/src/test/resources/simple.json
deleted file mode 100644
index 9be7b89..0000000
--- a/protocols/bmv2/api/src/test/resources/simple.json
+++ /dev/null
@@ -1,397 +0,0 @@
-{
-    "header_types": [
-        {
-            "name": "standard_metadata_t",
-            "id": 0,
-            "fields": [
-                [
-                    "ingress_port",
-                    9
-                ],
-                [
-                    "packet_length",
-                    32
-                ],
-                [
-                    "egress_spec",
-                    9
-                ],
-                [
-                    "egress_port",
-                    9
-                ],
-                [
-                    "egress_instance",
-                    32
-                ],
-                [
-                    "instance_type",
-                    32
-                ],
-                [
-                    "clone_spec",
-                    32
-                ],
-                [
-                    "_padding",
-                    5
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ethernet_t",
-            "id": 1,
-            "fields": [
-                [
-                    "dstAddr",
-                    48
-                ],
-                [
-                    "srcAddr",
-                    48
-                ],
-                [
-                    "etherType",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "intrinsic_metadata_t",
-            "id": 2,
-            "fields": [
-                [
-                    "ingress_global_timestamp",
-                    32
-                ],
-                [
-                    "lf_field_list",
-                    32
-                ],
-                [
-                    "mcast_grp",
-                    16
-                ],
-                [
-                    "egress_rid",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        }
-    ],
-    "headers": [
-        {
-            "name": "standard_metadata",
-            "id": 0,
-            "header_type": "standard_metadata_t",
-            "metadata": true
-        },
-        {
-            "name": "ethernet",
-            "id": 1,
-            "header_type": "ethernet_t",
-            "metadata": false
-        },
-        {
-            "name": "intrinsic_metadata",
-            "id": 2,
-            "header_type": "intrinsic_metadata_t",
-            "metadata": true
-        }
-    ],
-    "header_stacks": [],
-    "parsers": [
-        {
-            "name": "parser",
-            "id": 0,
-            "init_state": "start",
-            "parse_states": [
-                {
-                    "name": "start",
-                    "id": 0,
-                    "parser_ops": [],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": "parse_ethernet"
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_ethernet",
-                    "id": 1,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "ethernet"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "deparsers": [
-        {
-            "name": "deparser",
-            "id": 0,
-            "order": [
-                "ethernet"
-            ]
-        }
-    ],
-    "meter_arrays": [],
-    "actions": [
-        {
-            "name": "set_egress_port",
-            "id": 0,
-            "runtime_data": [
-                {
-                    "name": "port",
-                    "bitwidth": 9
-                }
-            ],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "runtime_data",
-                            "value": 0
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "_drop",
-            "id": 1,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0x1ff"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "flood",
-            "id": 2,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "intrinsic_metadata",
-                                "mcast_grp"
-                            ]
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ]
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "send_to_cpu",
-            "id": 3,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0xff"
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "pipelines": [
-        {
-            "name": "ingress",
-            "id": 0,
-            "init_table": "table0",
-            "tables": [
-                {
-                    "name": "table0",
-                    "id": 0,
-                    "match_type": "ternary",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": false,
-                    "direct_meters": null,
-                    "support_timeout": false,
-                    "key": [
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "dstAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "srcAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "etherType"
-                            ],
-                            "mask": null
-                        }
-                    ],
-                    "actions": [
-                        "set_egress_port",
-                        "flood",
-                        "send_to_cpu",
-                        "_drop"
-                    ],
-                    "next_tables": {
-                        "set_egress_port": null,
-                        "flood": null,
-                        "send_to_cpu": null,
-                        "_drop": null
-                    },
-                    "default_action": null,
-                    "base_default_next": null
-                }
-            ],
-            "conditionals": []
-        },
-        {
-            "name": "egress",
-            "id": 1,
-            "init_table": null,
-            "tables": [],
-            "conditionals": []
-        }
-    ],
-    "calculations": [],
-    "checksums": [],
-    "learn_lists": [],
-    "field_lists": [],
-    "counter_arrays": [],
-    "register_arrays": [],
-    "force_arith": [
-        [
-            "standard_metadata",
-            "ingress_port"
-        ],
-        [
-            "standard_metadata",
-            "packet_length"
-        ],
-        [
-            "standard_metadata",
-            "egress_spec"
-        ],
-        [
-            "standard_metadata",
-            "egress_port"
-        ],
-        [
-            "standard_metadata",
-            "egress_instance"
-        ],
-        [
-            "standard_metadata",
-            "instance_type"
-        ],
-        [
-            "standard_metadata",
-            "clone_spec"
-        ],
-        [
-            "standard_metadata",
-            "_padding"
-        ],
-        [
-            "intrinsic_metadata",
-            "ingress_global_timestamp"
-        ],
-        [
-            "intrinsic_metadata",
-            "lf_field_list"
-        ],
-        [
-            "intrinsic_metadata",
-            "mcast_grp"
-        ],
-        [
-            "intrinsic_metadata",
-            "egress_rid"
-        ]
-    ]
-}
\ No newline at end of file
diff --git a/protocols/bmv2/ctl/pom.xml b/protocols/bmv2/ctl/pom.xml
deleted file mode 100644
index 5909909..0000000
--- a/protocols/bmv2/ctl/pom.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-bmv2-protocol</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-bmv2-protocol-ctl</artifactId>
-
-    <packaging>bundle</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.thrift</groupId>
-            <artifactId>libthrift</artifactId>
-            <version>0.9.3</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-protocol-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-protocol-thrift-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.felix</groupId>
-            <artifactId>org.apache.felix.scr.annotations</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-core-serializers</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-scr-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.onosproject</groupId>
-                <artifactId>onos-maven-plugin</artifactId>
-            </plugin>
-        </plugins>
-    </build>
-
-
-</project>
\ No newline at end of file
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2ControlPlaneThriftServer.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2ControlPlaneThriftServer.java
deleted file mode 100644
index bf44423..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2ControlPlaneThriftServer.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
-import org.apache.thrift.TProcessor;
-import org.apache.thrift.server.TThreadedSelectorServer;
-import org.apache.thrift.transport.TFramedTransport;
-import org.apache.thrift.transport.TNonblockingServerSocket;
-import org.apache.thrift.transport.TNonblockingServerTransport;
-import org.apache.thrift.transport.TNonblockingSocket;
-import org.apache.thrift.transport.TNonblockingTransport;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.nio.channels.SelectionKey;
-import java.nio.channels.SocketChannel;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-
-/**
- * A Thrift TThreadedSelectorServer that keeps track of the clients' IP address.
- */
-final class Bmv2ControlPlaneThriftServer extends TThreadedSelectorServer {
-
-    private static final int MAX_WORKER_THREADS = 20;
-    private static final int MAX_SELECTOR_THREADS = 4;
-    private static final int ACCEPT_QUEUE_LEN = 8;
-
-    private final Map<TTransport, InetAddress> clientAddresses = Maps.newConcurrentMap();
-    private final Set<TrackingSelectorThread> selectorThreads = Sets.newHashSet();
-
-    private AcceptThread acceptThread;
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    /**
-     * Creates a new server.
-     *
-     * @param port            a listening port
-     * @param processor       a processor
-     * @param executorService an executor service
-     * @throws TTransportException
-     */
-    public Bmv2ControlPlaneThriftServer(int port, TProcessor processor, ExecutorService executorService)
-            throws TTransportException {
-        super(new TThreadedSelectorServer.Args(new TNonblockingServerSocket(port))
-                      .workerThreads(MAX_WORKER_THREADS)
-                      .selectorThreads(MAX_SELECTOR_THREADS)
-                      .acceptQueueSizePerThread(ACCEPT_QUEUE_LEN)
-                      .executorService(executorService)
-                      .processor(processor));
-    }
-
-    /**
-     * Returns the IP address of the client associated with the given input framed transport.
-     *
-     * @param inputTransport a framed transport instance
-     * @return the IP address of the client or null
-     */
-    InetAddress getClientAddress(TFramedTransport inputTransport) {
-        return clientAddresses.get(inputTransport);
-    }
-
-    @Override
-    protected boolean startThreads() {
-        try {
-            for (int i = 0; i < MAX_SELECTOR_THREADS; ++i) {
-                selectorThreads.add(new TrackingSelectorThread(ACCEPT_QUEUE_LEN));
-            }
-            acceptThread = new AcceptThread((TNonblockingServerTransport) serverTransport_,
-                                            createSelectorThreadLoadBalancer(selectorThreads));
-            selectorThreads.forEach(Thread::start);
-            acceptThread.start();
-            return true;
-        } catch (IOException e) {
-            log.error("Failed to start threads!", e);
-            return false;
-        }
-    }
-
-    @Override
-    protected void joinThreads() throws InterruptedException {
-        // Wait until the io threads exit.
-        acceptThread.join();
-        for (TThreadedSelectorServer.SelectorThread thread : selectorThreads) {
-            thread.join();
-        }
-    }
-
-    @Override
-    public void stop() {
-        stopped_ = true;
-        // Stop queuing connect attempts asap.
-        stopListening();
-        if (acceptThread != null) {
-            acceptThread.wakeupSelector();
-        }
-        if (selectorThreads != null) {
-            selectorThreads.stream()
-                    .filter(thread -> thread != null)
-                    .forEach(TrackingSelectorThread::wakeupSelector);
-        }
-    }
-
-    private class TrackingSelectorThread extends TThreadedSelectorServer.SelectorThread {
-
-        TrackingSelectorThread(int maxPendingAccepts) throws IOException {
-            super(maxPendingAccepts);
-        }
-
-        @Override
-        protected FrameBuffer createFrameBuffer(TNonblockingTransport trans, SelectionKey selectionKey,
-                                                AbstractSelectThread selectThread) {
-            TrackingFrameBuffer frameBuffer = new TrackingFrameBuffer(trans, selectionKey, selectThread);
-            if (trans instanceof TNonblockingSocket) {
-                try {
-                    SocketChannel socketChannel = ((TNonblockingSocket) trans).getSocketChannel();
-                    InetAddress addr = ((InetSocketAddress) socketChannel.getRemoteAddress()).getAddress();
-                    clientAddresses.put(frameBuffer.getInputFramedTransport(), addr);
-                } catch (IOException e) {
-                    log.warn("Exception while tracking client address", e);
-                    clientAddresses.remove(frameBuffer.getInputFramedTransport());
-                }
-            } else {
-                log.warn("Unknown TNonblockingTransport instance: {}", trans.getClass().getName());
-                clientAddresses.remove(frameBuffer.getInputFramedTransport());
-            }
-            return frameBuffer;
-        }
-    }
-
-    private class TrackingFrameBuffer extends FrameBuffer {
-
-        TrackingFrameBuffer(TNonblockingTransport trans, SelectionKey selectionKey,
-                            AbstractSelectThread selectThread) {
-            super(trans, selectionKey, selectThread);
-        }
-
-        TTransport getInputFramedTransport() {
-            return this.inTrans_;
-        }
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2ControllerImpl.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2ControllerImpl.java
deleted file mode 100644
index 4a63d21..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2ControllerImpl.java
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.CacheLoader;
-import com.google.common.cache.LoadingCache;
-import com.google.common.cache.RemovalListener;
-import com.google.common.cache.RemovalNotification;
-import com.google.common.collect.Maps;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.apache.thrift.TException;
-import org.apache.thrift.TProcessor;
-import org.apache.thrift.protocol.TBinaryProtocol;
-import org.apache.thrift.protocol.TMultiplexedProtocol;
-import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.transport.TFramedTransport;
-import org.apache.thrift.transport.TSocket;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.runtime.Bmv2Device;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.bmv2.api.service.Bmv2DeviceListener;
-import org.onosproject.bmv2.api.service.Bmv2PacketListener;
-import org.onosproject.bmv2.thriftapi.BmConfig;
-import org.onosproject.bmv2.thriftapi.ControlPlaneService;
-import org.onosproject.bmv2.thriftapi.SimpleSwitch;
-import org.onosproject.bmv2.thriftapi.Standard;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.DeviceId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.CopyOnWriteArraySet;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.bmv2.thriftapi.ControlPlaneService.Processor;
-
-/**
- * Default implementation of a BMv2 controller.
- */
-@Component(immediate = true)
-@Service
-public class Bmv2ControllerImpl implements Bmv2Controller {
-
-    private static final String APP_ID = "org.onosproject.bmv2";
-
-    // Seconds after a client is expired (and connection closed) in the cache.
-    private static final int CLIENT_CACHE_TIMEOUT = 60;
-    // Number of connection retries after a network error.
-    private static final int NUM_CONNECTION_RETRIES = 2;
-    // Time between retries in milliseconds.
-    private static final int TIME_BETWEEN_RETRIES = 10;
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    // Cache where clients are removed after a predefined timeout.
-    private final LoadingCache<DeviceId, Pair<TTransport, Bmv2DeviceThriftClient>> agentCache =
-            CacheBuilder.newBuilder()
-                    .expireAfterAccess(CLIENT_CACHE_TIMEOUT, TimeUnit.SECONDS)
-                    .removalListener(new ClientRemovalListener())
-                    .build(new ClientLoader());
-
-    private final TProcessor trackingProcessor = new TrackingProcessor();
-
-    private final ExecutorService executorService = Executors
-            .newFixedThreadPool(32, groupedThreads("onos/bmv2", "controller", log));
-
-    private final Set<Bmv2DeviceListener> deviceListeners = new CopyOnWriteArraySet<>();
-    private final Set<Bmv2PacketListener> packetListeners = new CopyOnWriteArraySet<>();
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    private Bmv2ControlPlaneThriftServer server;
-
-    // TODO: make it configurable trough component config
-    private int serverPort = DEFAULT_PORT;
-
-    @Activate
-    public void activate() {
-        coreService.registerApplication(APP_ID);
-        startServer(serverPort);
-        log.info("Activated");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        stopServer();
-        log.info("Deactivated");
-    }
-
-    private void startServer(int port) {
-        try {
-            log.info("Starting server on port {}...", port);
-            this.server = new Bmv2ControlPlaneThriftServer(port, trackingProcessor, executorService);
-            executorService.execute(server::serve);
-        } catch (TTransportException e) {
-            log.error("Unable to start server", e);
-        }
-    }
-
-    private void stopServer() {
-        // Stop the server if running...
-        if (server != null && !server.isServing()) {
-            server.setShouldStop(true);
-            server.stop();
-        }
-        try {
-            executorService.shutdown();
-            executorService.awaitTermination(5, TimeUnit.SECONDS);
-        } catch (InterruptedException e) {
-            List<Runnable> runningTasks = executorService.shutdownNow();
-            log.warn("Unable to stop server threads: {}", runningTasks);
-        }
-    }
-
-    @Override
-    public Bmv2DeviceAgent getAgent(DeviceId deviceId) throws Bmv2RuntimeException {
-        try {
-            checkNotNull(deviceId, "deviceId cannot be null");
-            return agentCache.get(deviceId).getRight();
-        } catch (ExecutionException e) {
-            throw new Bmv2RuntimeException(e);
-        }
-    }
-
-    @Override
-    public boolean isReacheable(DeviceId deviceId) {
-        try {
-            Bmv2DeviceThriftClient client = (Bmv2DeviceThriftClient) getAgent(deviceId);
-            BmConfig config = client.standardClient.bm_mgmt_get_info();
-            // The BMv2 instance running at this thrift IP and port might have a different BMv2 internal ID.
-            return config.getDevice_id() == Integer.valueOf(deviceId.uri().getFragment());
-        } catch (Bmv2RuntimeException | TException e) {
-            return false;
-        }
-    }
-
-    @Override
-    public void addDeviceListener(Bmv2DeviceListener listener) {
-        if (!deviceListeners.contains(listener)) {
-            deviceListeners.add(listener);
-        }
-    }
-
-    @Override
-    public void removeDeviceListener(Bmv2DeviceListener listener) {
-        deviceListeners.remove(listener);
-    }
-
-    @Override
-    public void addPacketListener(Bmv2PacketListener listener) {
-        if (!packetListeners.contains(listener)) {
-            packetListeners.add(listener);
-        }
-    }
-
-    @Override
-    public void removePacketListener(Bmv2PacketListener listener) {
-        packetListeners.remove(listener);
-    }
-
-    /**
-     * Client cache removal listener. Close the connection on cache removal.
-     */
-    private static class ClientRemovalListener implements
-            RemovalListener<DeviceId, Pair<TTransport, Bmv2DeviceThriftClient>> {
-
-        @Override
-        public void onRemoval(RemovalNotification<DeviceId, Pair<TTransport, Bmv2DeviceThriftClient>> notification) {
-            // close the transport connection
-            Bmv2DeviceThriftClient client = notification.getValue().getRight();
-            TTransport transport = notification.getValue().getLeft();
-            // Locking here is ugly, but needed (see SafeThriftClient).
-            synchronized (transport) {
-                if (transport.isOpen()) {
-                    transport.close();
-                }
-            }
-        }
-    }
-
-    /**
-     * Handles requests from BMv2 devices using the registered listeners.
-     */
-    private final class ServiceHandler implements ControlPlaneService.Iface {
-
-        private final InetAddress clientAddress;
-        private Bmv2Device remoteDevice;
-
-        ServiceHandler(InetAddress clientAddress) {
-            this.clientAddress = clientAddress;
-        }
-
-        @Override
-        public boolean ping() {
-            return true;
-        }
-
-        @Override
-        public void hello(int thriftServerPort, int deviceId, int instanceId, String jsonConfigMd5) {
-            // Store a reference to the remote device for future uses.
-            String host = clientAddress.getHostAddress();
-            remoteDevice = new Bmv2Device(host, thriftServerPort, deviceId);
-
-            if (deviceListeners.size() == 0) {
-                log.debug("Received hello, but there's no listener registered.");
-            } else {
-                deviceListeners.forEach(l -> l.handleHello(remoteDevice, instanceId, jsonConfigMd5));
-            }
-        }
-
-        @Override
-        public void packet_in(int port, ByteBuffer data, int dataLength) {
-            if (remoteDevice == null) {
-                log.debug("Received packet-in, but the remote device is still unknown. Need a hello first...");
-                return;
-            }
-
-            if (packetListeners.size() == 0) {
-                log.debug("Received packet-in, but there's no listener registered.");
-            } else {
-                byte[] bytes = new byte[dataLength];
-                data.get(bytes);
-                ImmutableByteSequence pkt = ImmutableByteSequence.copyFrom(bytes);
-                packetListeners.forEach(l -> l.handlePacketIn(remoteDevice, port, pkt));
-            }
-        }
-    }
-
-    /**
-     * Decorator of a Thrift processor needed in order to keep track of the client's IP address that originated the
-     * request.
-     */
-    private final class TrackingProcessor implements TProcessor {
-
-        // Map transports to processors.
-        private final ConcurrentMap<TTransport, Processor<ServiceHandler>> processors = Maps.newConcurrentMap();
-
-        @Override
-        public boolean process(final TProtocol in, final TProtocol out) throws TException {
-            // Get the client address for this request.
-            InetAddress clientAddress = server.getClientAddress((TFramedTransport) in.getTransport());
-            if (clientAddress != null) {
-                // Get or create a processor for this input transport, i.e. the client on the other side.
-                Processor<ServiceHandler> processor = processors.computeIfAbsent(
-                        in.getTransport(), t -> new Processor<>(new ServiceHandler(clientAddress)));
-                // Delegate to the processor we are decorating.
-                return processor.process(in, out);
-            } else {
-                log.warn("Unable to retrieve client IP address of incoming request");
-                return false;
-            }
-        }
-    }
-
-    /**
-     * Cache loader of BMv2 Thrift clients.
-     */
-    private class ClientLoader extends CacheLoader<DeviceId, Pair<TTransport, Bmv2DeviceThriftClient>> {
-
-        private final SafeThriftClient.Options options = new SafeThriftClient.Options(NUM_CONNECTION_RETRIES,
-                                                                                      TIME_BETWEEN_RETRIES);
-
-        @Override
-        public Pair<TTransport, Bmv2DeviceThriftClient> load(DeviceId deviceId)
-                throws TTransportException {
-            log.debug("Instantiating new client... > deviceId={}", deviceId);
-            // Make the expensive call
-            Bmv2Device device = Bmv2Device.of(deviceId);
-            TTransport transport = new TSocket(device.thriftServerHost(), device.thriftServerPort());
-            TProtocol protocol = new TBinaryProtocol(transport);
-            // Our BMv2 device implements multiple Thrift services, create a client for each one on the same transport.
-            Standard.Client standardClient = new Standard.Client(
-                    new TMultiplexedProtocol(protocol, "standard"));
-            SimpleSwitch.Client simpleSwitch = new SimpleSwitch.Client(
-                    new TMultiplexedProtocol(protocol, "simple_switch"));
-            // Wrap clients so to automatically have synchronization and resiliency to connectivity errors
-            Standard.Iface safeStandardClient = SafeThriftClient.wrap(standardClient,
-                                                                      Standard.Iface.class,
-                                                                      options);
-            SimpleSwitch.Iface safeSimpleSwitchClient = SafeThriftClient.wrap(simpleSwitch,
-                                                                              SimpleSwitch.Iface.class,
-                                                                              options);
-            Bmv2DeviceThriftClient client = new Bmv2DeviceThriftClient(deviceId,
-                                                                       transport,
-                                                                       safeStandardClient,
-                                                                       safeSimpleSwitchClient);
-            return Pair.of(transport, client);
-        }
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DefaultInterpreterImpl.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DefaultInterpreterImpl.java
deleted file mode 100644
index 55bf60c..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DefaultInterpreterImpl.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.google.common.collect.ImmutableBiMap;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.bmv2.api.context.Bmv2InterpreterException;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criterion;
-import org.onosproject.net.flow.instructions.Instruction;
-
-import static org.onlab.util.ImmutableByteSequence.copyFrom;
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.ByteSequenceFitException;
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.fitByteSequence;
-import static org.onosproject.net.PortNumber.CONTROLLER;
-import static org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
-
-/**
- * Implementation of a BMv2 interpreter for the BMv2 default.json configuration.
- */
-public final class Bmv2DefaultInterpreterImpl implements Bmv2Interpreter {
-
-    public static final String TABLE0 = "table0";
-    public static final String SEND_TO_CPU = "send_to_cpu";
-    public static final String PORT = "port";
-    public static final String DROP = "_drop";
-    public static final String SET_EGRESS_PORT = "set_egress_port";
-
-    private static final ImmutableBiMap<Criterion.Type, String> CRITERION_MAP = ImmutableBiMap.of(
-            Criterion.Type.IN_PORT, "standard_metadata.ingress_port",
-            Criterion.Type.ETH_DST, "ethernet.dstAddr",
-            Criterion.Type.ETH_SRC, "ethernet.srcAddr",
-            Criterion.Type.ETH_TYPE, "ethernet.etherType");
-
-    private static final ImmutableBiMap<Integer, String> TABLE_MAP = ImmutableBiMap.of(
-            0, TABLE0);
-
-    @Override
-    public ImmutableBiMap<Criterion.Type, String> criterionTypeMap() {
-        return CRITERION_MAP;
-    }
-
-    @Override
-    public ImmutableBiMap<Integer, String> tableIdMap() {
-        return TABLE_MAP;
-    }
-
-    @Override
-    public Bmv2Action mapTreatment(TrafficTreatment treatment, Bmv2Configuration configuration)
-            throws Bmv2InterpreterException {
-
-        if (treatment.allInstructions().size() == 0) {
-            // No instructions means drop for us.
-            return actionWithName(DROP);
-        } else if (treatment.allInstructions().size() > 1) {
-            // Otherwise, we understand treatments with only 1 instruction.
-            throw new Bmv2InterpreterException("Treatment has multiple instructions");
-        }
-
-        Instruction instruction = treatment.allInstructions().get(0);
-
-        switch (instruction.type()) {
-            case OUTPUT:
-                OutputInstruction outInstruction = (OutputInstruction) instruction;
-                PortNumber port = outInstruction.port();
-                if (!port.isLogical()) {
-                    return buildEgressAction(port, configuration);
-                } else if (port.equals(CONTROLLER)) {
-                    return actionWithName(SEND_TO_CPU);
-                } else {
-                    throw new Bmv2InterpreterException("Egress on logical port not supported: " + port);
-                }
-            case NOACTION:
-                return actionWithName(DROP);
-            default:
-                throw new Bmv2InterpreterException("Instruction type not supported: " + instruction.type().name());
-        }
-    }
-
-    private Bmv2Action buildEgressAction(PortNumber port, Bmv2Configuration configuration)
-            throws Bmv2InterpreterException {
-
-        int portBitWidth = configuration.action(SET_EGRESS_PORT).runtimeData(PORT).bitWidth();
-
-        try {
-            ImmutableByteSequence portBs = fitByteSequence(copyFrom(port.toLong()), portBitWidth);
-            return Bmv2Action.builder()
-                    .withName(SET_EGRESS_PORT)
-                    .addParameter(portBs)
-                    .build();
-        } catch (ByteSequenceFitException e) {
-            throw new Bmv2InterpreterException(e.getMessage());
-        }
-    }
-
-    private Bmv2Action actionWithName(String name) {
-        return Bmv2Action.builder().withName(name).build();
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DeviceContextServiceImpl.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DeviceContextServiceImpl.java
deleted file mode 100644
index e077b6d..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DeviceContextServiceImpl.java
+++ /dev/null
@@ -1,285 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.eclipsesource.json.Json;
-import com.eclipsesource.json.JsonObject;
-import com.esotericsoftware.kryo.Kryo;
-import com.esotericsoftware.kryo.io.Input;
-import com.esotericsoftware.kryo.io.Output;
-import com.google.common.collect.Maps;
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.util.KryoNamespace;
-import org.onlab.util.SharedScheduledExecutors;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2DefaultConfiguration;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.bmv2.api.service.Bmv2DeviceContextService;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.ConsistentMap;
-import org.onosproject.store.service.ConsistentMapException;
-import org.onosproject.store.service.MapEvent;
-import org.onosproject.store.service.MapEventListener;
-import org.onosproject.store.service.Serializer;
-import org.onosproject.store.service.StorageService;
-import org.onosproject.store.service.Versioned;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.Map;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.onosproject.bmv2.api.context.Bmv2DefaultConfiguration.parse;
-import static org.onosproject.store.service.MapEvent.Type.INSERT;
-import static org.onosproject.store.service.MapEvent.Type.UPDATE;
-
-@Component(immediate = true)
-@Service
-public class Bmv2DeviceContextServiceImpl implements Bmv2DeviceContextService {
-
-    private static final String JSON_DEFAULT_CONFIG_PATH = "/default.json";
-    private static final long CHECK_INTERVAL = 5_000; // milliseconds
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private StorageService storageService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private DeviceService deviceService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private MastershipService mastershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    private Bmv2Controller controller;
-
-    private final ScheduledExecutorService scheduledExecutor = SharedScheduledExecutors.getPoolThreadExecutor();
-    private final MapEventListener<DeviceId, Bmv2DeviceContext> contextListener = new ContextMapEventListener();
-    private final ConcurrentMap<DeviceId, Lock> deviceLocks = Maps.newConcurrentMap();
-
-    private ConsistentMap<DeviceId, Bmv2DeviceContext> contexts;
-    private Map<String, ClassLoader> interpreterClassLoaders;
-    private Bmv2DeviceContext defaultContext;
-    private  ScheduledFuture<?> configChecker = null;
-
-    private final Logger log = LoggerFactory.getLogger(getClass());
-
-    @Activate
-    public void activate() {
-        KryoNamespace kryo = new KryoNamespace.Builder()
-                .register(KryoNamespaces.API)
-                .register(new BmvDeviceContextSerializer(), Bmv2DeviceContext.class)
-                .build();
-
-        this.contexts = storageService.<DeviceId, Bmv2DeviceContext>consistentMapBuilder()
-                .withSerializer(Serializer.using(kryo))
-                .withName("onos-bmv2-contexts")
-                .build();
-
-        Bmv2Configuration defaultConfiguration = loadDefaultConfiguration();
-        Bmv2Interpreter defaultInterpreter = new Bmv2DefaultInterpreterImpl();
-        defaultContext = new Bmv2DeviceContext(defaultConfiguration, defaultInterpreter);
-
-        interpreterClassLoaders = Maps.newConcurrentMap();
-        registerInterpreterClassLoader(defaultInterpreter.getClass(), this.getClass().getClassLoader());
-
-        contexts.addListener(contextListener, scheduledExecutor);
-
-        if (configChecker != null &&  configChecker.isCancelled()) {
-            configChecker.cancel(false);
-        }
-        configChecker = scheduledExecutor.scheduleAtFixedRate(this::checkDevices, 0, CHECK_INTERVAL,
-                                                              TimeUnit.MILLISECONDS);
-
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        contexts.removeListener(contextListener);
-        if (configChecker != null) {
-            configChecker.cancel(false);
-        }
-        log.info("Stopped");
-    }
-
-    @Override
-    public Bmv2DeviceContext getContext(DeviceId deviceId) {
-        checkNotNull(deviceId, "device id cannot be null");
-        Versioned<Bmv2DeviceContext> versionedContext = contexts.get(deviceId);
-        return (versionedContext == null) ? null : versionedContext.value();
-    }
-
-    @Override
-    public void setContext(DeviceId deviceId, Bmv2DeviceContext context) {
-        checkNotNull(deviceId, "device id cannot be null");
-        checkNotNull(context, "context cannot be null");
-        if (!interpreterClassLoaders.containsKey(context.interpreter().getClass().getName())) {
-            log.error("Unable to set context, missing class loader for interpreter '{}'. " +
-                              "Please register it with registerInterpreterClassLoader()",
-                      context.interpreter().getClass().getName());
-        } else {
-            try {
-                contexts.put(deviceId, context);
-            } catch (ConsistentMapException.ConcurrentModification e) {
-                log.error("Detected concurrent modification on context map");
-            }
-        }
-    }
-
-    @Override
-    public void registerInterpreterClassLoader(Class<? extends Bmv2Interpreter> interpreterClass, ClassLoader loader) {
-        interpreterClassLoaders.put(interpreterClass.getName(), loader);
-    }
-
-    @Override
-    public Bmv2DeviceContext defaultContext() {
-        return defaultContext;
-    }
-
-    @Override
-    public void setDefaultContext(DeviceId deviceId) {
-        Versioned<Bmv2DeviceContext> previous = contexts.put(deviceId, defaultContext);
-        if (mastershipService.getMasterFor(deviceId) == null) {
-            // Checking for who is the master here is ugly but necessary, as this method is called by Bmv2DeviceProvider
-            // prior to master election. A solution could be to use a separate leadership contest instead of the
-            // mastership service.
-            triggerConfigCheck(deviceId, defaultContext);
-        }
-    }
-
-    private void configCheck(DeviceId deviceId, Bmv2DeviceContext storedContext) {
-        if (storedContext == null) {
-            return;
-        }
-        // Synchronize executions over the same deviceId.
-        Lock lock = deviceLocks.computeIfAbsent(deviceId, did -> new ReentrantLock());
-        lock.lock();
-        try {
-            log.trace("Executing configuration check on {}...", deviceId);
-
-            try {
-                // FIXME: JSON dump is heavy, can we use the JSON MD5 to check the running configuration?
-                String jsonString = controller.getAgent(deviceId).dumpJsonConfig();
-                Bmv2Configuration deviceConfiguration = parse(Json.parse(jsonString).asObject());
-
-                if (!storedContext.configuration().equals(deviceConfiguration)) {
-                    log.info("Triggering configuration swap on {}...", deviceId);
-                    try {
-                        Bmv2DeviceAgent agent = controller.getAgent(deviceId);
-                        String newJsonString = storedContext.configuration().json().toString();
-                        agent.uploadNewJsonConfig(newJsonString);
-                        agent.swapJsonConfig();
-                    } catch (Bmv2RuntimeException e) {
-                        log.error("Unable to swap configuration on {}: {}", deviceId, e.explain());
-                    }
-                }
-            } catch (Bmv2RuntimeException e) {
-                log.warn("Unable to dump JSON configuration from {}: {}", deviceId, e.explain());
-            }
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    private void triggerConfigCheck(DeviceId deviceId, Bmv2DeviceContext context) {
-            scheduledExecutor.schedule(() -> configCheck(deviceId, context), 0, TimeUnit.SECONDS);
-    }
-
-    private void checkDevices() {
-        deviceService.getAvailableDevices().forEach(device -> {
-            if (mastershipService.isLocalMaster(device.id())) {
-                triggerConfigCheck(device.id(), getContext(device.id()));
-            }
-        });
-    }
-
-    protected static Bmv2DefaultConfiguration loadDefaultConfiguration() {
-        try {
-            JsonObject json = Json.parse(new BufferedReader(new InputStreamReader(
-                    Bmv2DeviceContextServiceImpl.class.getResourceAsStream(JSON_DEFAULT_CONFIG_PATH)))).asObject();
-            return parse(json);
-        } catch (IOException e) {
-            throw new RuntimeException("Unable to load default configuration", e);
-        }
-    }
-
-    /**
-     * Listener of context changes that immediately triggers config checks (to swap the config if necessary).
-     */
-    private class ContextMapEventListener implements MapEventListener<DeviceId, Bmv2DeviceContext> {
-        @Override
-        public void event(MapEvent<DeviceId, Bmv2DeviceContext> event) {
-            DeviceId deviceId = event.key();
-            if (event.type().equals(INSERT) || event.type().equals(UPDATE)) {
-                if (mastershipService.isLocalMaster(deviceId)) {
-                    log.trace("Context {} for {}", event.type().name(), deviceId);
-                    triggerConfigCheck(deviceId, event.newValue().value());
-                }
-            }
-        }
-    }
-
-    /**
-     * Context serializer.
-     */
-    private class BmvDeviceContextSerializer extends com.esotericsoftware.kryo.Serializer<Bmv2DeviceContext> {
-
-        @Override
-        public void write(Kryo kryo, Output output, Bmv2DeviceContext context) {
-            kryo.writeObject(output, context.configuration().json().toString());
-            kryo.writeObject(output, context.interpreter().getClass().getName());
-        }
-
-        @Override
-        public Bmv2DeviceContext read(Kryo kryo, Input input, Class<Bmv2DeviceContext> type) {
-            String jsonStr = kryo.readObject(input, String.class);
-            String interpreterClassName = kryo.readObject(input, String.class);
-            Bmv2Configuration configuration = parse(Json.parse(jsonStr).asObject());
-            ClassLoader loader = interpreterClassLoaders.get(interpreterClassName);
-            if (loader == null) {
-                throw new IllegalStateException("No class loader registered for interpreter: " + interpreterClassName);
-            }
-            try {
-                Bmv2Interpreter interpreter = (Bmv2Interpreter) loader.loadClass(interpreterClassName).newInstance();
-                return new Bmv2DeviceContext(configuration, interpreter);
-            } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) {
-                throw new RuntimeException("Unable to load interpreter class", e);
-            }
-        }
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DeviceThriftClient.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DeviceThriftClient.java
deleted file mode 100644
index 5bd5228..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2DeviceThriftClient.java
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.thrift.TException;
-import org.apache.thrift.transport.TTransport;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2ExactMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2LpmMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchKey;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2ParsedTableEntry;
-import org.onosproject.bmv2.api.runtime.Bmv2PortInfo;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntry;
-import org.onosproject.bmv2.api.runtime.Bmv2TernaryMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2ValidMatchParam;
-import org.onosproject.bmv2.thriftapi.BmActionEntry;
-import org.onosproject.bmv2.thriftapi.BmAddEntryOptions;
-import org.onosproject.bmv2.thriftapi.BmCounterValue;
-import org.onosproject.bmv2.thriftapi.BmMatchParam;
-import org.onosproject.bmv2.thriftapi.BmMatchParamExact;
-import org.onosproject.bmv2.thriftapi.BmMatchParamLPM;
-import org.onosproject.bmv2.thriftapi.BmMatchParamTernary;
-import org.onosproject.bmv2.thriftapi.BmMatchParamType;
-import org.onosproject.bmv2.thriftapi.BmMatchParamValid;
-import org.onosproject.bmv2.thriftapi.BmMtEntry;
-import org.onosproject.bmv2.thriftapi.SimpleSwitch;
-import org.onosproject.bmv2.thriftapi.Standard;
-import org.onosproject.net.DeviceId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-import java.util.Collection;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.onlab.util.ImmutableByteSequence.copyFrom;
-import static org.onosproject.bmv2.ctl.Bmv2TExceptionParser.parseTException;
-
-/**
- * Implementation of a Thrift client to control a BMv2 device.
- */
-public final class Bmv2DeviceThriftClient implements Bmv2DeviceAgent {
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    // FIXME: make context_id arbitrary for each call
-    // See: https://github.com/p4lang/behavioral-model/blob/master/modules/bm_sim/include/bm_sim/context.h
-    private static final int CONTEXT_ID = 0;
-
-    protected final Standard.Iface standardClient;
-    private final SimpleSwitch.Iface simpleSwitchClient;
-    private final TTransport transport;
-    private final DeviceId deviceId;
-
-    // ban constructor
-    protected Bmv2DeviceThriftClient(DeviceId deviceId, TTransport transport, Standard.Iface standardClient,
-                                     SimpleSwitch.Iface simpleSwitchClient) {
-        this.deviceId = deviceId;
-        this.transport = transport;
-        this.standardClient = standardClient;
-        this.simpleSwitchClient = simpleSwitchClient;
-    }
-
-    @Override
-    public DeviceId deviceId() {
-        return deviceId;
-    }
-
-    @Override
-    public boolean ping() {
-        try {
-            return this.simpleSwitchClient.ping();
-        } catch (TException e) {
-            return false;
-        }
-    }
-
-    @Override
-    public final long addTableEntry(Bmv2TableEntry entry) throws Bmv2RuntimeException {
-
-        log.debug("Adding table entry... > deviceId={}, entry={}", deviceId, entry);
-
-        long entryId = -1;
-
-        try {
-            BmAddEntryOptions options = new BmAddEntryOptions();
-
-            if (entry.hasPriority()) {
-                options.setPriority(entry.priority());
-            }
-
-            entryId = standardClient.bm_mt_add_entry(
-                    CONTEXT_ID,
-                    entry.tableName(),
-                    buildMatchParamsList(entry.matchKey()),
-                    entry.action().name(),
-                    buildActionParamsList(entry.action()),
-                    options);
-
-            if (entry.hasTimeout()) {
-                /* bmv2 accepts timeouts in milliseconds */
-                int msTimeout = (int) Math.round(entry.timeout() * 1_000);
-                standardClient.bm_mt_set_entry_ttl(
-                        CONTEXT_ID, entry.tableName(), entryId, msTimeout);
-            }
-
-            log.debug("Table entry added! > deviceId={}, entryId={}/{}", deviceId, entry.tableName(), entryId);
-
-            return entryId;
-
-        } catch (TException e) {
-            log.debug("Exception while adding table entry: {} > deviceId={}, tableName={}",
-                      e, deviceId, entry.tableName());
-            if (entryId != -1) {
-                // entry is in inconsistent state (unable to add timeout), remove it
-                try {
-                    deleteTableEntry(entry.tableName(), entryId);
-                } catch (Bmv2RuntimeException e1) {
-                    log.debug("Unable to remove failed table entry: {} > deviceId={}, tableName={}",
-                              e1, deviceId, entry.tableName());
-                }
-            }
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public final void modifyTableEntry(String tableName,
-                                       long entryId, Bmv2Action action)
-            throws Bmv2RuntimeException {
-
-        log.debug("Modifying table entry... > deviceId={}, entryId={}/{}", deviceId, tableName, entryId);
-
-        try {
-            standardClient.bm_mt_modify_entry(
-                    CONTEXT_ID,
-                    tableName,
-                    entryId,
-                    action.name(),
-                    buildActionParamsList(action));
-            log.debug("Table entry modified! > deviceId={}, entryId={}/{}", deviceId, tableName, entryId);
-        } catch (TException e) {
-            log.debug("Exception while modifying table entry: {} > deviceId={}, entryId={}/{}",
-                      e, deviceId, tableName, entryId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public final void deleteTableEntry(String tableName,
-                                       long entryId) throws Bmv2RuntimeException {
-
-        log.debug("Deleting table entry... > deviceId={}, entryId={}/{}", deviceId, tableName, entryId);
-
-        try {
-            standardClient.bm_mt_delete_entry(CONTEXT_ID, tableName, entryId);
-            log.debug("Table entry deleted! > deviceId={}, entryId={}/{}", deviceId, tableName, entryId);
-        } catch (TException e) {
-            log.debug("Exception while deleting table entry: {} > deviceId={}, entryId={}/{}",
-                      e, deviceId, tableName, entryId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public final void setTableDefaultAction(String tableName, Bmv2Action action)
-            throws Bmv2RuntimeException {
-
-        log.debug("Setting table default... > deviceId={}, tableName={}, action={}", deviceId, tableName, action);
-
-        try {
-            standardClient.bm_mt_set_default_action(
-                    CONTEXT_ID,
-                    tableName,
-                    action.name(),
-                    buildActionParamsList(action));
-            log.debug("Table default set! > deviceId={}, tableName={}, action={}", deviceId, tableName, action);
-        } catch (TException e) {
-            log.debug("Exception while setting table default : {} > deviceId={}, tableName={}, action={}",
-                      e, deviceId, tableName, action);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public Collection<Bmv2PortInfo> getPortsInfo() throws Bmv2RuntimeException {
-
-        log.debug("Retrieving port info... > deviceId={}", deviceId);
-
-        try {
-            return standardClient.bm_dev_mgr_show_ports().stream()
-                    .map(p -> new Bmv2PortInfo(p.getIface_name(), p.getPort_num(), p.isIs_up()))
-                    .collect(Collectors.toList());
-        } catch (TException e) {
-            log.debug("Exception while retrieving port info: {} > deviceId={}", e, deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public List<Bmv2ParsedTableEntry> getTableEntries(String tableName) throws Bmv2RuntimeException {
-
-        log.debug("Retrieving table entries... > deviceId={}, tableName={}", deviceId, tableName);
-
-        List<BmMtEntry> bmEntries;
-        try {
-            bmEntries = standardClient.bm_mt_get_entries(CONTEXT_ID, tableName);
-        } catch (TException e) {
-            log.debug("Exception while retrieving table entries: {} > deviceId={}, tableName={}",
-                      e, deviceId, tableName);
-            throw parseTException(e);
-        }
-
-        List<Bmv2ParsedTableEntry> parsedEntries = Lists.newArrayList();
-
-        entryLoop:
-        for (BmMtEntry bmEntry : bmEntries) {
-
-            Bmv2MatchKey.Builder matchKeyBuilder = Bmv2MatchKey.builder();
-            for (BmMatchParam bmParam : bmEntry.getMatch_key()) {
-                Bmv2MatchParam param;
-                switch (bmParam.getType()) {
-                    case EXACT:
-                        param = new Bmv2ExactMatchParam(copyFrom(bmParam.getExact().getKey()));
-                        break;
-                    case LPM:
-                        param = new Bmv2LpmMatchParam(copyFrom(bmParam.getLpm().getKey()),
-                                                      bmParam.getLpm().getPrefix_length());
-                        break;
-                    case TERNARY:
-                        param = new Bmv2TernaryMatchParam(copyFrom(bmParam.getTernary().getKey()),
-                                                          copyFrom(bmParam.getTernary().getMask()));
-                        break;
-                    case VALID:
-                        param = new Bmv2ValidMatchParam(bmParam.getValid().isKey());
-                        break;
-                    default:
-                        log.warn("Parsing of match type {} unsupported, skipping table entry.",
-                                 bmParam.getType().name());
-                        continue entryLoop;
-                }
-                matchKeyBuilder.add(param);
-            }
-
-            Bmv2Action.Builder actionBuilder = Bmv2Action.builder();
-            BmActionEntry bmActionEntry = bmEntry.getAction_entry();
-            switch (bmActionEntry.getAction_type()) {
-                case ACTION_DATA:
-                    actionBuilder.withName(bmActionEntry.getAction_name());
-                    bmActionEntry.getAction_data()
-                            .stream()
-                            .map(ImmutableByteSequence::copyFrom)
-                            .forEach(actionBuilder::addParameter);
-                    break;
-                default:
-                    log.warn("Parsing of action action type {} unsupported, skipping table entry.",
-                             bmActionEntry.getAction_type().name());
-                    continue entryLoop;
-            }
-
-            parsedEntries.add(new Bmv2ParsedTableEntry(bmEntry.getEntry_handle(), matchKeyBuilder.build(),
-                                                       actionBuilder.build(), bmEntry.getOptions().getPriority()));
-        }
-
-        return parsedEntries;
-    }
-
-    @Override
-    public void transmitPacket(int portNumber, ImmutableByteSequence packet) throws Bmv2RuntimeException {
-
-        log.debug("Requesting packet transmission... > portNumber={}, packetSize={}", portNumber, packet.size());
-
-        try {
-
-            simpleSwitchClient.packet_out(portNumber, ByteBuffer.wrap(packet.asArray()));
-            log.debug("Packet transmission requested! > portNumber={}, packetSize={}", portNumber, packet.size());
-        } catch (TException e) {
-            log.debug("Exception while requesting packet transmission: {} > portNumber={}, packetSize={}",
-                      e, portNumber, packet.size());
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public void resetState() throws Bmv2RuntimeException {
-
-        log.debug("Resetting device state... > deviceId={}", deviceId);
-
-        try {
-            standardClient.bm_reset_state();
-            log.debug("Device state reset! > deviceId={}", deviceId);
-        } catch (TException e) {
-            log.debug("Exception while resetting device state: {} > deviceId={}", e, deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public String dumpJsonConfig() throws Bmv2RuntimeException {
-
-        log.debug("Dumping device config... > deviceId={}", deviceId);
-
-        try {
-            String config = standardClient.bm_get_config();
-            log.debug("Device config dumped! > deviceId={}, configLength={}", deviceId, config.length());
-            return config;
-        } catch (TException e) {
-            log.debug("Exception while dumping device config: {} > deviceId={}", e, deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public Pair<Long, Long> readTableEntryCounter(String tableName, long entryId) throws Bmv2RuntimeException {
-
-        log.debug("Reading table entry counters... > deviceId={}, tableName={}, entryId={}",
-                  deviceId, tableName, entryId);
-
-        try {
-            BmCounterValue counterValue = standardClient.bm_mt_read_counter(CONTEXT_ID, tableName, entryId);
-            log.debug("Table entry counters retrieved! > deviceId={}, tableName={}, entryId={}, bytes={}, packets={}",
-                      deviceId, tableName, entryId, counterValue.bytes, counterValue.packets);
-            return Pair.of(counterValue.bytes, counterValue.packets);
-        } catch (TException e) {
-            log.debug("Exception while reading table counters: {} > deviceId={}, tableName={}, entryId={}",
-                      e.toString(), deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public Pair<Long, Long> readCounter(String counterName, int index) throws Bmv2RuntimeException {
-
-        log.debug("Reading table entry counters... > deviceId={}, counterName={}, index={}",
-                  deviceId, counterName, index);
-
-        try {
-            BmCounterValue counterValue = standardClient.bm_counter_read(CONTEXT_ID, counterName, index);
-            log.debug("Table entry counters retrieved! >deviceId={}, counterName={}, index={}, bytes={}, packets={}",
-                      deviceId, counterName, index, counterValue.bytes, counterValue.packets);
-            return Pair.of(counterValue.bytes, counterValue.packets);
-        } catch (TException e) {
-            log.debug("Exception while reading table counters: {} > deviceId={}, counterName={}, index={}",
-                      e.toString(), deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public int getProcessInstanceId() throws Bmv2RuntimeException {
-        log.debug("Getting process instance ID... > deviceId={}", deviceId);
-        try {
-            int instanceId = simpleSwitchClient.get_process_instance_id();
-            log.debug("TProcess instance ID retrieved! > deviceId={}, instanceId={}",
-                      deviceId, instanceId);
-            return instanceId;
-        } catch (TException e) {
-            log.debug("Exception while getting process instance ID: {} > deviceId={}", e.toString(), deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public String getJsonConfigMd5() throws Bmv2RuntimeException {
-
-        log.debug("Getting device config md5... > deviceId={}", deviceId);
-
-        try {
-            String md5 = standardClient.bm_get_config_md5();
-            log.debug("Device config md5 received! > deviceId={}, configMd5={}", deviceId, md5);
-            return md5;
-        } catch (TException e) {
-            log.debug("Exception while getting device config md5: {} > deviceId={}", e, deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public void uploadNewJsonConfig(String jsonString) throws Bmv2RuntimeException {
-
-        log.debug("Loading new JSON config on device... > deviceId={}, jsonStringLength={}",
-                  deviceId, jsonString.length());
-
-        try {
-            standardClient.bm_load_new_config(jsonString);
-            log.debug("JSON config loaded! > deviceId={}", deviceId);
-        } catch (TException e) {
-            log.debug("Exception while loading JSON config: {} > deviceId={}", e, deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    @Override
-    public void swapJsonConfig() throws Bmv2RuntimeException {
-
-        log.debug("Swapping JSON config on device... > deviceId={}", deviceId);
-
-        try {
-            standardClient.bm_swap_configs();
-            simpleSwitchClient.force_swap();
-            log.debug("JSON config swapped! > deviceId={}", deviceId);
-        } catch (TException e) {
-            log.debug("Exception while swapping JSON config: {} > deviceId={}", e, deviceId);
-            throw parseTException(e);
-        }
-    }
-
-    /**
-     * Builds a list of Bmv2/Thrift compatible match parameters.
-     *
-     * @param matchKey a bmv2 matchKey
-     * @return list of thrift-compatible bm match parameters
-     */
-    private static List<BmMatchParam> buildMatchParamsList(Bmv2MatchKey matchKey) {
-        List<BmMatchParam> paramsList = Lists.newArrayList();
-        matchKey.matchParams().forEach(x -> {
-            ByteBuffer value;
-            ByteBuffer mask;
-            switch (x.type()) {
-                case EXACT:
-                    value = ByteBuffer.wrap(((Bmv2ExactMatchParam) x).value().asArray());
-                    paramsList.add(
-                            new BmMatchParam(BmMatchParamType.EXACT)
-                                    .setExact(new BmMatchParamExact(value)));
-                    break;
-                case TERNARY:
-                    value = ByteBuffer.wrap(((Bmv2TernaryMatchParam) x).value().asArray());
-                    mask = ByteBuffer.wrap(((Bmv2TernaryMatchParam) x).mask().asArray());
-                    paramsList.add(
-                            new BmMatchParam(BmMatchParamType.TERNARY)
-                                    .setTernary(new BmMatchParamTernary(value, mask)));
-                    break;
-                case LPM:
-                    value = ByteBuffer.wrap(((Bmv2LpmMatchParam) x).value().asArray());
-                    int prefixLength = ((Bmv2LpmMatchParam) x).prefixLength();
-                    paramsList.add(
-                            new BmMatchParam(BmMatchParamType.LPM)
-                                    .setLpm(new BmMatchParamLPM(value, prefixLength)));
-                    break;
-                case VALID:
-                    boolean flag = ((Bmv2ValidMatchParam) x).flag();
-                    paramsList.add(
-                            new BmMatchParam(BmMatchParamType.VALID)
-                                    .setValid(new BmMatchParamValid(flag)));
-                    break;
-                default:
-                    // should never be here
-                    throw new RuntimeException("Unknown match param type " + x.type().name());
-            }
-        });
-        return paramsList;
-    }
-
-    /**
-     * Build a list of Bmv2/Thrift compatible action parameters.
-     *
-     * @param action an action object
-     * @return list of ByteBuffers
-     */
-    private static List<ByteBuffer> buildActionParamsList(Bmv2Action action) {
-        List<ByteBuffer> buffers = Lists.newArrayList();
-        action.parameters().forEach(p -> buffers.add(ByteBuffer.wrap(p.asArray())));
-        return buffers;
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2FlowRuleTranslatorImpl.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2FlowRuleTranslatorImpl.java
deleted file mode 100644
index ef9427e..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2FlowRuleTranslatorImpl.java
+++ /dev/null
@@ -1,394 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.Sets;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.context.Bmv2ActionModel;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.context.Bmv2FieldModel;
-import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslator;
-import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslatorException;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.bmv2.api.context.Bmv2InterpreterException;
-import org.onosproject.bmv2.api.context.Bmv2RuntimeDataModel;
-import org.onosproject.bmv2.api.context.Bmv2TableKeyModel;
-import org.onosproject.bmv2.api.context.Bmv2TableModel;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.bmv2.api.runtime.Bmv2ExactMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionSelector;
-import org.onosproject.bmv2.api.runtime.Bmv2ExtensionTreatment;
-import org.onosproject.bmv2.api.runtime.Bmv2LpmMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchKey;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntry;
-import org.onosproject.bmv2.api.runtime.Bmv2TernaryMatchParam;
-import org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criterion;
-import org.onosproject.net.flow.criteria.EthCriterion;
-import org.onosproject.net.flow.criteria.EthTypeCriterion;
-import org.onosproject.net.flow.criteria.ExtensionCriterion;
-import org.onosproject.net.flow.criteria.PortCriterion;
-import org.onosproject.net.flow.instructions.ExtensionTreatment;
-import org.onosproject.net.flow.instructions.ExtensionTreatmentType.ExtensionTreatmentTypes;
-import org.onosproject.net.flow.instructions.Instruction;
-import org.onosproject.net.flow.instructions.Instructions;
-import org.onosproject.net.flow.instructions.Instructions.ExtensionInstructionWrapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.onosproject.bmv2.api.utils.Bmv2TranslatorUtils.roundToBytes;
-import static org.onosproject.net.flow.criteria.Criterion.Type.EXTENSION;
-import static org.onosproject.net.flow.criteria.ExtensionSelectorType.ExtensionSelectorTypes.BMV2_MATCH_PARAMS;
-
-/**
- * Default implementation of a BMv2 flow rule translator.
- */
-@Beta
-public class Bmv2FlowRuleTranslatorImpl implements Bmv2FlowRuleTranslator {
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    @Override
-    public Bmv2TableEntry translate(FlowRule rule, Bmv2DeviceContext context)
-            throws Bmv2FlowRuleTranslatorException {
-
-        Bmv2Configuration configuration = context.configuration();
-        Bmv2Interpreter interpreter = context.interpreter();
-
-        int tableId = rule.tableId();
-        String tableName = interpreter.tableIdMap().get(tableId);
-
-        Bmv2TableModel table = (tableName == null) ? configuration.table(tableId) : configuration.table(tableName);
-
-        if (table == null) {
-            throw new Bmv2FlowRuleTranslatorException("Unknown table ID: " + tableId);
-        }
-
-        /* Translate selector */
-        Bmv2MatchKey bmv2MatchKey = buildMatchKey(interpreter, rule.selector(), table);
-
-        /* Translate treatment */
-        TrafficTreatment treatment = rule.treatment();
-        Bmv2Action bmv2Action = null;
-        // If treatment has only 1 instruction of type extension, use that
-        for (Instruction inst : treatment.allInstructions()) {
-            if (inst.type() == Instruction.Type.EXTENSION) {
-                if (treatment.allInstructions().size() == 1) {
-                    bmv2Action = getActionFromExtension((ExtensionInstructionWrapper) inst);
-                } else {
-                    throw new Bmv2FlowRuleTranslatorException("Unable to translate traffic treatment, found multiple " +
-                                                                      "instructions of which one is an extension: " +
-                                                                      treatment.toString());
-                }
-            }
-        }
-
-        if (bmv2Action == null) {
-            // No extension, use interpreter to build action.
-            try {
-                bmv2Action = interpreter.mapTreatment(treatment, configuration);
-            } catch (Bmv2InterpreterException e) {
-                throw new Bmv2FlowRuleTranslatorException("Unable to translate treatment. " + e.toString());
-            }
-        }
-
-        if (bmv2Action == null) {
-            // Interpreter returned null.
-            throw new Bmv2FlowRuleTranslatorException("Unable to translate treatment");
-        }
-
-        // Check action
-        Bmv2ActionModel actionModel = configuration.action(bmv2Action.name());
-        if (actionModel == null) {
-            throw new Bmv2FlowRuleTranslatorException("Unknown action " + bmv2Action.name());
-        }
-        if (!table.actions().contains(actionModel)) {
-            throw new Bmv2FlowRuleTranslatorException("Action " + bmv2Action.name()
-                                                              + " is not defined for table " + tableName);
-        }
-        if (actionModel.runtimeDatas().size() != bmv2Action.parameters().size()) {
-            throw new Bmv2FlowRuleTranslatorException("Wrong number of parameters for action "
-                                                              + actionModel.name() + ", expected "
-                                                              + actionModel.runtimeDatas().size() + ", but found "
-                                                              + bmv2Action.parameters().size());
-        }
-        for (int i = 0; i < actionModel.runtimeDatas().size(); i++) {
-            Bmv2RuntimeDataModel data = actionModel.runtimeDatas().get(i);
-            ImmutableByteSequence param = bmv2Action.parameters().get(i);
-            if (param.size() != roundToBytes(data.bitWidth())) {
-                throw new Bmv2FlowRuleTranslatorException("Wrong byte-width for parameter " + data.name()
-                                                                  + " of action " + actionModel.name()
-                                                                  + ", expected " + roundToBytes(data.bitWidth())
-                                                                  + " bytes, but found " + param.size());
-            }
-        }
-
-        Bmv2TableEntry.Builder tableEntryBuilder = Bmv2TableEntry.builder();
-
-        // In BMv2 0 is the highest priority.
-        int newPriority = Integer.MAX_VALUE - rule.priority();
-
-        tableEntryBuilder
-                .withTableName(table.name())
-                .withPriority(newPriority)
-                .withMatchKey(bmv2MatchKey)
-                .withAction(bmv2Action);
-
-        if (!rule.isPermanent()) {
-            if (table.hasTimeouts()) {
-                tableEntryBuilder.withTimeout((double) rule.timeout());
-            } else {
-                log.warn("Flow rule is temporary but table {} doesn't support timeouts, translating to permanent",
-                         table.name());
-            }
-
-        }
-
-        return tableEntryBuilder.build();
-    }
-
-    private Bmv2TernaryMatchParam buildTernaryParam(Bmv2FieldModel field, Criterion criterion, int bitWidth)
-            throws Bmv2FlowRuleTranslatorException {
-
-        // Value and mask will be filled according to criterion type
-        ImmutableByteSequence value;
-        ImmutableByteSequence mask = null;
-
-        int byteWidth = roundToBytes(bitWidth);
-
-        switch (criterion.type()) {
-            case IN_PORT:
-                long port = ((PortCriterion) criterion).port().toLong();
-                value = ImmutableByteSequence.copyFrom(port);
-                break;
-            case ETH_DST:
-                EthCriterion c = (EthCriterion) criterion;
-                value = ImmutableByteSequence.copyFrom(c.mac().toBytes());
-                if (c.mask() != null) {
-                    mask = ImmutableByteSequence.copyFrom(c.mask().toBytes());
-                }
-                break;
-            case ETH_SRC:
-                EthCriterion c2 = (EthCriterion) criterion;
-                value = ImmutableByteSequence.copyFrom(c2.mac().toBytes());
-                if (c2.mask() != null) {
-                    mask = ImmutableByteSequence.copyFrom(c2.mask().toBytes());
-                }
-                break;
-            case ETH_TYPE:
-                short ethType = ((EthTypeCriterion) criterion).ethType().toShort();
-                value = ImmutableByteSequence.copyFrom(ethType);
-                break;
-            // TODO: implement building for other criterion types (easy with DefaultCriterion of ONOS-4034)
-            default:
-                throw new Bmv2FlowRuleTranslatorException("Feature not implemented, ternary builder for criterion" +
-                                                                  "type: " + criterion.type().name());
-        }
-
-        // Fit byte sequence in field model bit-width.
-        try {
-            value = Bmv2TranslatorUtils.fitByteSequence(value, bitWidth);
-        } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) {
-            throw new Bmv2FlowRuleTranslatorException(
-                    "Fit exception for criterion " + criterion.type().name() + " value, " + e.getMessage());
-        }
-
-        if (mask == null) {
-            // no mask, all ones
-            mask = ImmutableByteSequence.ofOnes(byteWidth);
-        } else {
-            try {
-                mask = Bmv2TranslatorUtils.fitByteSequence(mask, bitWidth);
-            } catch (Bmv2TranslatorUtils.ByteSequenceFitException e) {
-                throw new Bmv2FlowRuleTranslatorException(
-                        "Fit exception for criterion " + criterion.type().name() + " mask, " + e.getMessage());
-            }
-        }
-
-        return new Bmv2TernaryMatchParam(value, mask);
-    }
-
-    private Bmv2Action getActionFromExtension(Instructions.ExtensionInstructionWrapper inst)
-            throws Bmv2FlowRuleTranslatorException {
-
-        ExtensionTreatment extTreatment = inst.extensionInstruction();
-
-        if (extTreatment.type() == ExtensionTreatmentTypes.BMV2_ACTION.type()) {
-            if (extTreatment instanceof Bmv2ExtensionTreatment) {
-                return ((Bmv2ExtensionTreatment) extTreatment).action();
-            } else {
-                throw new Bmv2FlowRuleTranslatorException("Unable to decode treatment extension: " + extTreatment);
-            }
-        } else {
-            throw new Bmv2FlowRuleTranslatorException("Unsupported treatment extension type: " + extTreatment.type());
-        }
-    }
-
-    private Bmv2MatchKey buildMatchKey(Bmv2Interpreter interpreter, TrafficSelector selector, Bmv2TableModel tableModel)
-            throws Bmv2FlowRuleTranslatorException {
-
-        // Find a bmv2 extension selector (if any) and get the parameter map.
-        Optional<Bmv2ExtensionSelector> extSelector = selector.criteria().stream()
-                .filter(c -> c.type().equals(EXTENSION))
-                .map(c -> (ExtensionCriterion) c)
-                .map(ExtensionCriterion::extensionSelector)
-                .filter(c -> c.type().equals(BMV2_MATCH_PARAMS.type()))
-                .map(c -> (Bmv2ExtensionSelector) c)
-                .findFirst();
-        Map<String, Bmv2MatchParam> extParamMap =
-                (extSelector.isPresent()) ? extSelector.get().parameterMap() : Collections.emptyMap();
-
-        Set<Criterion> translatedCriteria = Sets.newHashSet();
-        Set<String> usedExtParams = Sets.newHashSet();
-
-        Bmv2MatchKey.Builder matchKeyBuilder = Bmv2MatchKey.builder();
-
-        keysLoop:
-        for (Bmv2TableKeyModel keyModel : tableModel.keys()) {
-
-            // use fieldName dot notation (e.g. ethernet.dstAddr)
-            String fieldName = keyModel.field().header().name() + "." + keyModel.field().type().name();
-
-            int bitWidth = keyModel.field().type().bitWidth();
-            int byteWidth = roundToBytes(bitWidth);
-
-            Criterion.Type criterionType = interpreter.criterionTypeMap().inverse().get(fieldName);
-
-            if (!extParamMap.containsKey(fieldName) &&
-                    (criterionType == null || selector.getCriterion(criterionType) == null)) {
-                // Neither an extension nor a mapping / criterion is available for this field.
-                switch (keyModel.matchType()) {
-                    case TERNARY:
-                        // Wildcard field
-                        matchKeyBuilder.withWildcard(byteWidth);
-                        break;
-                    case LPM:
-                        // LPM with prefix 0
-                        matchKeyBuilder.add(new Bmv2LpmMatchParam(ImmutableByteSequence.ofZeros(byteWidth), 0));
-                        break;
-                    default:
-                        throw new Bmv2FlowRuleTranslatorException("No value found for required match field "
-                                                                          + fieldName);
-                }
-                // Next key
-                continue keysLoop;
-            }
-
-            Bmv2MatchParam matchParam;
-
-            if (extParamMap.containsKey(fieldName)) {
-                // Parameter found in extension
-                if (criterionType != null && selector.getCriterion(criterionType) != null) {
-                    // Found also a criterion that can be mapped. This is bad.
-                    throw new Bmv2FlowRuleTranslatorException("Both an extension and a criterion mapping are defined " +
-                                                                      "for match field " + fieldName);
-                }
-
-                matchParam = extParamMap.get(fieldName);
-                usedExtParams.add(fieldName);
-
-                // Check parameter type and size
-                if (!keyModel.matchType().equals(matchParam.type())) {
-                    throw new Bmv2FlowRuleTranslatorException("Wrong match type for parameter " + fieldName
-                                                                      + ", expected " + keyModel.matchType().name()
-                                                                      + ", but found " + matchParam.type().name());
-                }
-                int foundByteWidth;
-                switch (keyModel.matchType()) {
-                    case EXACT:
-                        Bmv2ExactMatchParam m1 = (Bmv2ExactMatchParam) matchParam;
-                        foundByteWidth = m1.value().size();
-                        break;
-                    case TERNARY:
-                        Bmv2TernaryMatchParam m2 = (Bmv2TernaryMatchParam) matchParam;
-                        foundByteWidth = m2.value().size();
-                        break;
-                    case LPM:
-                        Bmv2LpmMatchParam m3 = (Bmv2LpmMatchParam) matchParam;
-                        foundByteWidth = m3.value().size();
-                        break;
-                    case VALID:
-                        foundByteWidth = -1;
-                        break;
-                    default:
-                        // should never be her
-                        throw new RuntimeException("Unrecognized match type " + keyModel.matchType().name());
-                }
-                if (foundByteWidth != -1 && foundByteWidth != byteWidth) {
-                    throw new Bmv2FlowRuleTranslatorException("Wrong byte-width for match parameter " + fieldName
-                                                                      + ", expected " + byteWidth + ", but found "
-                                                                      + foundByteWidth);
-                }
-
-            } else {
-                // A criterion mapping is available for this key
-                Criterion criterion = selector.getCriterion(criterionType);
-                translatedCriteria.add(criterion);
-                switch (keyModel.matchType()) {
-                    case TERNARY:
-                        matchParam = buildTernaryParam(keyModel.field(), criterion, bitWidth);
-                        break;
-                    default:
-                        // TODO: implement other match param builders (exact, LPM, etc.)
-                        throw new Bmv2FlowRuleTranslatorException("Feature not yet implemented, match param builder: "
-                                                                          + keyModel.matchType().name());
-                }
-            }
-
-            matchKeyBuilder.add(matchParam);
-        }
-
-        // Check if all criteria have been translated
-        Set<Criterion> ignoredCriteria = selector.criteria()
-                .stream()
-                .filter(c -> !c.type().equals(EXTENSION))
-                .filter(c -> !translatedCriteria.contains(c))
-                .collect(Collectors.toSet());
-
-        if (ignoredCriteria.size() > 0) {
-            throw new Bmv2FlowRuleTranslatorException("The following criteria cannot be translated for table "
-                                                              + tableModel.name() + ": " + ignoredCriteria.toString());
-        }
-
-        // Check is all extension parameters have been used
-        Set<String> ignoredExtParams = extParamMap.keySet()
-                .stream()
-                .filter(k -> !usedExtParams.contains(k))
-                .collect(Collectors.toSet());
-
-        if (ignoredExtParams.size() > 0) {
-            throw new Bmv2FlowRuleTranslatorException("The following extension match parameters cannot be used for " +
-                                                              "table " + tableModel.name() + ": "
-                                                              + ignoredExtParams.toString());
-        }
-
-        return matchKeyBuilder.build();
-    }
-
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2TExceptionParser.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2TExceptionParser.java
deleted file mode 100644
index 6ce3fbd..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2TExceptionParser.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-
-import org.apache.thrift.TException;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.thriftapi.InvalidCounterOperation;
-import org.onosproject.bmv2.thriftapi.InvalidDevMgrOperation;
-import org.onosproject.bmv2.thriftapi.InvalidLearnOperation;
-import org.onosproject.bmv2.thriftapi.InvalidMcOperation;
-import org.onosproject.bmv2.thriftapi.InvalidMeterOperation;
-import org.onosproject.bmv2.thriftapi.InvalidRegisterOperation;
-import org.onosproject.bmv2.thriftapi.InvalidSwapOperation;
-import org.onosproject.bmv2.thriftapi.InvalidTableOperation;
-
-import static org.onosproject.bmv2.api.runtime.Bmv2RuntimeException.Code;
-
-/**
- * Utility class to translate a Thrift exception into a Bmv2RuntimeException.
- */
-final class Bmv2TExceptionParser {
-
-    private Bmv2TExceptionParser() {
-        // ban constructor.
-    }
-
-    static Bmv2RuntimeException parseTException(TException cause) {
-        try {
-            return new Bmv2RuntimeException(getCode(cause));
-        } catch (ParserException e) {
-            return new Bmv2RuntimeException(e.codeString);
-        }
-    }
-
-    private static Code getCode(TException e) throws ParserException {
-        if (e instanceof InvalidTableOperation) {
-            InvalidTableOperation t = (InvalidTableOperation) e;
-            switch (t.getCode()) {
-                case TABLE_FULL:
-                    return Code.TABLE_FULL;
-                case INVALID_HANDLE:
-                    return Code.TABLE_INVALID_HANDLE;
-                case EXPIRED_HANDLE:
-                    return Code.TABLE_EXPIRED_HANDLE;
-                case COUNTERS_DISABLED:
-                    return Code.TABLE_COUNTERS_DISABLED;
-                case METERS_DISABLED:
-                    return Code.TABLE_METERS_DISABLED;
-                case AGEING_DISABLED:
-                    return Code.TABLE_AGEING_DISABLED;
-                case INVALID_TABLE_NAME:
-                    return Code.TABLE_INVALID_TABLE_NAME;
-                case INVALID_ACTION_NAME:
-                    return Code.TABLE_INVALID_ACTION_NAME;
-                case WRONG_TABLE_TYPE:
-                    return Code.TABLE_WRONG_TABLE_TYPE;
-                case INVALID_MBR_HANDLE:
-                    return Code.TABLE_INVALID_MBR_HANDLE;
-                case MBR_STILL_USED:
-                    return Code.TABLE_MBR_STILL_USED;
-                case MBR_ALREADY_IN_GRP:
-                    return Code.TABLE_MBR_ALREADY_IN_GRP;
-                case MBR_NOT_IN_GRP:
-                    return Code.TABLE_MBR_NOT_IN_GRP;
-                case INVALID_GRP_HANDLE:
-                    return Code.TABLE_INVALID_GRP_HANDLE;
-                case GRP_STILL_USED:
-                    return Code.TABLE_GRP_STILL_USED;
-                case EMPTY_GRP:
-                    return Code.TABLE_EMPTY_GRP;
-                case DUPLICATE_ENTRY:
-                    return Code.TABLE_DUPLICATE_ENTRY;
-                case BAD_MATCH_KEY:
-                    return Code.TABLE_BAD_MATCH_KEY;
-                case INVALID_METER_OPERATION:
-                    return Code.TABLE_INVALID_METER_OPERATION;
-                case DEFAULT_ACTION_IS_CONST:
-                    return Code.TABLE_DEFAULT_ACTION_IS_CONST;
-                case DEFAULT_ENTRY_IS_CONST:
-                    return Code.TABLE_DEFAULT_ENTRY_IS_CONST;
-                case ERROR:
-                    return Code.TABLE_GENERAL_ERROR;
-                default:
-                    return Code.TABLE_UNKNOWN_ERROR;
-            }
-        } else if (e instanceof InvalidCounterOperation) {
-            InvalidCounterOperation t = (InvalidCounterOperation) e;
-            switch (t.getCode()) {
-                case INVALID_COUNTER_NAME:
-                    return Code.COUNTER_INVALID_NAME;
-                case INVALID_INDEX:
-                    return Code.COUNTER_INVALID_INDEX;
-                case ERROR:
-                    return Code.COUNTER_ERROR_GENERAL;
-                default:
-                    return Code.COUNTER_ERROR_UNKNOWN;
-            }
-        } else if (e instanceof InvalidDevMgrOperation) {
-            InvalidDevMgrOperation t = (InvalidDevMgrOperation) e;
-            switch (t.getCode()) {
-                case ERROR:
-                    return Code.DEV_MGR_ERROR_GENERAL;
-                default:
-                    return Code.DEV_MGR_UNKNOWN;
-            }
-        } else if (e instanceof InvalidSwapOperation) {
-            InvalidSwapOperation t = (InvalidSwapOperation) e;
-            switch (t.getCode()) {
-                case CONFIG_SWAP_DISABLED:
-                    return Code.SWAP_CONFIG_DISABLED;
-                case ONGOING_SWAP:
-                    return Code.SWAP_ONGOING;
-                case NO_ONGOING_SWAP:
-                    return Code.SWAP_NO_ONGOING;
-                default:
-                    return Code.SWAP_ERROR_UKNOWN;
-            }
-        } else if (e instanceof InvalidMeterOperation) {
-            // TODO
-            throw new ParserException(e.toString());
-        } else if (e instanceof InvalidRegisterOperation) {
-            // TODO
-            throw new ParserException(e.toString());
-        } else if (e instanceof InvalidLearnOperation) {
-            // TODO
-            throw new ParserException(e.toString());
-        } else if (e instanceof InvalidMcOperation) {
-            // TODO
-            throw new ParserException(e.toString());
-        } else {
-            throw new ParserException(e.toString());
-        }
-    }
-
-    private static class ParserException extends Exception {
-
-        private String codeString;
-
-        public ParserException(String codeString) {
-            this.codeString = codeString;
-        }
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2TableEntryServiceImpl.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2TableEntryServiceImpl.java
deleted file mode 100644
index 38f627d..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/Bmv2TableEntryServiceImpl.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.apache.felix.scr.annotations.Service;
-import org.onlab.util.KryoNamespace;
-import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslator;
-import org.onosproject.bmv2.api.runtime.Bmv2ExactMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2FlowRuleWrapper;
-import org.onosproject.bmv2.api.runtime.Bmv2LpmMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2MatchKey;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntryReference;
-import org.onosproject.bmv2.api.runtime.Bmv2TernaryMatchParam;
-import org.onosproject.bmv2.api.runtime.Bmv2ValidMatchParam;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.bmv2.api.service.Bmv2DeviceContextService;
-import org.onosproject.bmv2.api.service.Bmv2TableEntryService;
-import org.onosproject.net.DeviceId;
-import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.EventuallyConsistentMap;
-import org.onosproject.store.service.StorageService;
-import org.onosproject.store.service.WallClockTimestamp;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Implementation of the Bmv2TableEntryService.
- */
-@Component(immediate = true)
-@Service
-public class Bmv2TableEntryServiceImpl implements Bmv2TableEntryService {
-
-    private final Logger log = LoggerFactory.getLogger(this.getClass());
-
-    private final Bmv2FlowRuleTranslator translator = new Bmv2FlowRuleTranslatorImpl();
-
-    private EventuallyConsistentMap<Bmv2TableEntryReference, Bmv2FlowRuleWrapper> flowRules;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected StorageService storageService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected Bmv2Controller controller;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected Bmv2DeviceContextService contextService;
-
-
-    @Activate
-    public void activate() {
-        KryoNamespace kryo = new KryoNamespace.Builder()
-                .register(KryoNamespaces.API)
-                .register(Bmv2TableEntryReference.class)
-                .register(Bmv2MatchKey.class)
-                .register(Bmv2ExactMatchParam.class)
-                .register(Bmv2TernaryMatchParam.class)
-                .register(Bmv2LpmMatchParam.class)
-                .register(Bmv2ValidMatchParam.class)
-                .register(Bmv2FlowRuleWrapper.class)
-                .build();
-
-        flowRules = storageService.<Bmv2TableEntryReference, Bmv2FlowRuleWrapper>eventuallyConsistentMapBuilder()
-                .withSerializer(kryo)
-                .withTimestampProvider((k, v) -> new WallClockTimestamp())
-                .withName("onos-bmv2-flowrules")
-                .build();
-
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        log.info("Stopped");
-    }
-
-    @Override
-    public Bmv2FlowRuleTranslator getFlowRuleTranslator() {
-        return translator;
-    }
-
-    @Override
-    public Bmv2FlowRuleWrapper lookup(Bmv2TableEntryReference entryRef) {
-        checkNotNull(entryRef, "table entry reference cannot be null");
-        return flowRules.get(entryRef);
-    }
-
-    @Override
-    public void bind(Bmv2TableEntryReference entryRef, Bmv2FlowRuleWrapper rule) {
-        checkNotNull(entryRef, "table entry reference cannot be null");
-        checkNotNull(rule, "bmv2 flow rule cannot be null");
-        flowRules.put(entryRef, rule);
-    }
-
-    @Override
-    public void unbind(Bmv2TableEntryReference entryRef) {
-        checkNotNull(entryRef, "table entry reference cannot be null");
-        flowRules.remove(entryRef);
-    }
-
-    @Override
-    public void unbindAll(DeviceId deviceId) {
-        flowRules.keySet()
-                .stream()
-                .filter(entryRef -> entryRef.deviceId().equals(deviceId))
-                .forEach(flowRules::remove);
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/SafeThriftClient.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/SafeThriftClient.java
deleted file mode 100644
index f6e4813..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/SafeThriftClient.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/*
- * Most of the code of this class was copied from:
- * http://liveramp.com/engineering/reconnecting-thrift-client/
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.google.common.collect.ImmutableSet;
-import org.apache.thrift.TServiceClient;
-import org.apache.thrift.transport.TTransport;
-import org.apache.thrift.transport.TTransportException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Proxy;
-import java.util.Set;
-
-/**
- * Thrift client wrapper that attempts a few reconnects before giving up a method call execution. It also provides
- * synchronization between calls over the same transport.
- */
-public final class SafeThriftClient {
-
-    private static final Logger LOG = LoggerFactory.getLogger(SafeThriftClient.class);
-
-    /**
-     * List of causes which suggest a restart might fix things (defined as constants in {@link TTransportException}).
-     */
-    private static final Set<Integer> RESTARTABLE_CAUSES = ImmutableSet.of(TTransportException.NOT_OPEN,
-                                                                           TTransportException.END_OF_FILE,
-                                                                           TTransportException.TIMED_OUT,
-                                                                           TTransportException.UNKNOWN);
-
-    private SafeThriftClient() {
-        // ban constructor.
-    }
-
-    /**
-     * Reflectively wraps an already existing Thrift client.
-     *
-     * @param baseClient      the client to wrap
-     * @param clientInterface the interface that the client implements
-     * @param options         options that control behavior of the reconnecting client
-     * @param <T>
-     * @param <C>
-     * @return
-     */
-    public static <T extends TServiceClient, C> C wrap(T baseClient, Class<C> clientInterface, Options options) {
-        Object proxyObject = Proxy.newProxyInstance(clientInterface.getClassLoader(),
-                                                    new Class<?>[]{clientInterface},
-                                                    new ReconnectingClientProxy<T>(baseClient,
-                                                                                   options.getNumRetries(),
-                                                                                   options.getTimeBetweenRetries()));
-
-        return (C) proxyObject;
-    }
-
-    /**
-     * Reflectively wraps an already existing Thrift client.
-     *
-     * @param baseClient the client to wrap
-     * @param options    options that control behavior of the reconnecting client
-     * @param <T>
-     * @param <C>
-     * @return
-     */
-    public static <T extends TServiceClient, C> C wrap(T baseClient, Options options) {
-        Class<?>[] interfaces = baseClient.getClass().getInterfaces();
-
-        for (Class<?> iface : interfaces) {
-            if (iface.getSimpleName().equals("Iface")
-                    && iface.getEnclosingClass().equals(baseClient.getClass().getEnclosingClass())) {
-                return (C) wrap(baseClient, iface, options);
-            }
-        }
-
-        throw new RuntimeException("Class needs to implement Iface directly. Use wrap(TServiceClient, Class) instead.");
-    }
-
-    /**
-     * Reflectively wraps an already existing Thrift client.
-     *
-     * @param baseClient      the client to wrap
-     * @param clientInterface the interface that the client implements
-     * @param <T>
-     * @param <C>
-     * @return
-     */
-    public static <T extends TServiceClient, C> C wrap(T baseClient, Class<C> clientInterface) {
-        return wrap(baseClient, clientInterface, Options.defaults());
-    }
-
-    /**
-     * Reflectively wraps an already existing Thrift client.
-     *
-     * @param baseClient the client to wrap
-     * @param <T>
-     * @param <C>
-     * @return
-     */
-    public static <T extends TServiceClient, C> C wrap(T baseClient) {
-        return wrap(baseClient, Options.defaults());
-    }
-
-    /**
-     * Reconnection options for {@link SafeThriftClient}.
-     */
-    public static class Options {
-        private int numRetries;
-        private long timeBetweenRetries;
-
-        /**
-         * Creates new options with the given parameters.
-         *
-         * @param numRetries         the maximum number of times to try reconnecting before giving up and throwing an
-         *                           exception
-         * @param timeBetweenRetries the number of milliseconds to wait in between reconnection attempts.
-         */
-        public Options(int numRetries, long timeBetweenRetries) {
-            this.numRetries = numRetries;
-            this.timeBetweenRetries = timeBetweenRetries;
-        }
-
-        private static Options defaults() {
-            return new Options(5, 10000L);
-        }
-
-        private int getNumRetries() {
-            return numRetries;
-        }
-
-        private long getTimeBetweenRetries() {
-            return timeBetweenRetries;
-        }
-    }
-
-    /**
-     * Helper proxy class. Attempts to call method on proxy object wrapped in try/catch. If it fails, it attempts a
-     * reconnect and tries the method again.
-     *
-     * @param <T>
-     */
-    private static class ReconnectingClientProxy<T extends TServiceClient> implements InvocationHandler {
-        private final T baseClient;
-        private final TTransport transport;
-        private final int maxRetries;
-        private final long timeBetweenRetries;
-
-        public ReconnectingClientProxy(T baseClient, int maxRetries, long timeBetweenRetries) {
-            this.baseClient = baseClient;
-            this.transport = baseClient.getInputProtocol().getTransport();
-            this.maxRetries = maxRetries;
-            this.timeBetweenRetries = timeBetweenRetries;
-        }
-
-        private void reconnectOrThrowException()
-                throws TTransportException {
-            int errors = 0;
-            try {
-                if (transport.isOpen()) {
-                    transport.close();
-                }
-            } catch (Exception e) {
-                // Thrift seems to have a bug where if the transport is already closed a SocketException is thrown.
-                // However, such an exception is not advertised by .close(), hence the general-purpose catch.
-                LOG.debug("Exception while closing transport", e);
-            }
-
-            while (errors < maxRetries) {
-                try {
-                    LOG.debug("Attempting to reconnect...");
-                    transport.open();
-                    LOG.debug("Reconnection successful");
-                    break;
-                } catch (TTransportException e) {
-                    LOG.debug("Error while reconnecting:", e);
-                    errors++;
-
-                    if (errors < maxRetries) {
-                        try {
-                            LOG.debug("Sleeping for {} milliseconds before retrying", timeBetweenRetries);
-                            Thread.sleep(timeBetweenRetries);
-                        } catch (InterruptedException e2) {
-                            Thread.currentThread().interrupt();
-                            throw new RuntimeException(e);
-                        }
-                    }
-                }
-            }
-
-            if (errors >= maxRetries) {
-                throw new TTransportException("Failed to reconnect");
-            }
-        }
-
-        @Override
-        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-
-            // Thrift transport layer is not thread-safe (it's a wrapper on a socket), hence we need locking.
-            synchronized (transport) {
-
-                LOG.debug("Invoking method... > fromThread={}, method={}, args={}",
-                          Thread.currentThread().getId(), method.getName(), args);
-
-                try {
-
-                    return method.invoke(baseClient, args);
-                } catch (InvocationTargetException e) {
-                    if (e.getTargetException() instanceof TTransportException) {
-                        TTransportException cause = (TTransportException) e.getTargetException();
-
-                        if (RESTARTABLE_CAUSES.contains(cause.getType())) {
-                            // Try to reconnect. If fail, a TTransportException will be thrown.
-                            reconnectOrThrowException();
-                            try {
-                                // If here, transport has been successfully open, hence new exceptions will be thrown.
-                                return method.invoke(baseClient, args);
-                            } catch (InvocationTargetException e1) {
-                                LOG.debug("Exception: {}", e1.getTargetException());
-                                throw e1.getTargetException();
-                            }
-                        }
-                    }
-                    // Target exception is neither a TTransportException nor a restartable cause.
-                    LOG.debug("Exception: {}", e.getTargetException());
-                    throw e.getTargetException();
-                }
-            }
-        }
-    }
-}
diff --git a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/package-info.java b/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/package-info.java
deleted file mode 100644
index dcd9a28..0000000
--- a/protocols/bmv2/ctl/src/main/java/org/onosproject/bmv2/ctl/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * BMv2 Thrift client implementation.
- */
-package org.onosproject.bmv2.ctl;
\ No newline at end of file
diff --git a/protocols/bmv2/ctl/src/main/resources/default.json b/protocols/bmv2/ctl/src/main/resources/default.json
deleted file mode 100644
index abc0452..0000000
--- a/protocols/bmv2/ctl/src/main/resources/default.json
+++ /dev/null
@@ -1,730 +0,0 @@
-{
-    "header_types": [
-        {
-            "name": "standard_metadata_t",
-            "id": 0,
-            "fields": [
-                [
-                    "ingress_port",
-                    9
-                ],
-                [
-                    "packet_length",
-                    32
-                ],
-                [
-                    "egress_spec",
-                    9
-                ],
-                [
-                    "egress_port",
-                    9
-                ],
-                [
-                    "egress_instance",
-                    32
-                ],
-                [
-                    "instance_type",
-                    32
-                ],
-                [
-                    "clone_spec",
-                    32
-                ],
-                [
-                    "_padding",
-                    5
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "intrinsic_metadata_t",
-            "id": 1,
-            "fields": [
-                [
-                    "ingress_global_timestamp",
-                    32
-                ],
-                [
-                    "lf_field_list",
-                    32
-                ],
-                [
-                    "mcast_grp",
-                    16
-                ],
-                [
-                    "egress_rid",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ethernet_t",
-            "id": 2,
-            "fields": [
-                [
-                    "dstAddr",
-                    48
-                ],
-                [
-                    "srcAddr",
-                    48
-                ],
-                [
-                    "etherType",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "ipv4_t",
-            "id": 3,
-            "fields": [
-                [
-                    "version",
-                    4
-                ],
-                [
-                    "ihl",
-                    4
-                ],
-                [
-                    "diffserv",
-                    8
-                ],
-                [
-                    "totalLen",
-                    16
-                ],
-                [
-                    "identification",
-                    16
-                ],
-                [
-                    "flags",
-                    3
-                ],
-                [
-                    "fragOffset",
-                    13
-                ],
-                [
-                    "ttl",
-                    8
-                ],
-                [
-                    "protocol",
-                    8
-                ],
-                [
-                    "hdrChecksum",
-                    16
-                ],
-                [
-                    "srcAddr",
-                    32
-                ],
-                [
-                    "dstAddr",
-                    32
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "tcp_t",
-            "id": 4,
-            "fields": [
-                [
-                    "srcPort",
-                    16
-                ],
-                [
-                    "dstPort",
-                    16
-                ],
-                [
-                    "seqNo",
-                    32
-                ],
-                [
-                    "ackNo",
-                    32
-                ],
-                [
-                    "dataOffset",
-                    4
-                ],
-                [
-                    "res",
-                    3
-                ],
-                [
-                    "ecn",
-                    3
-                ],
-                [
-                    "ctrl",
-                    6
-                ],
-                [
-                    "window",
-                    16
-                ],
-                [
-                    "checksum",
-                    16
-                ],
-                [
-                    "urgentPtr",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        },
-        {
-            "name": "udp_t",
-            "id": 5,
-            "fields": [
-                [
-                    "srcPort",
-                    16
-                ],
-                [
-                    "dstPort",
-                    16
-                ],
-                [
-                    "length_",
-                    16
-                ],
-                [
-                    "checksum",
-                    16
-                ]
-            ],
-            "length_exp": null,
-            "max_length": null
-        }
-    ],
-    "headers": [
-        {
-            "name": "standard_metadata",
-            "id": 0,
-            "header_type": "standard_metadata_t",
-            "metadata": true
-        },
-        {
-            "name": "intrinsic_metadata",
-            "id": 1,
-            "header_type": "intrinsic_metadata_t",
-            "metadata": true
-        },
-        {
-            "name": "ethernet",
-            "id": 2,
-            "header_type": "ethernet_t",
-            "metadata": false
-        },
-        {
-            "name": "ipv4",
-            "id": 3,
-            "header_type": "ipv4_t",
-            "metadata": false
-        },
-        {
-            "name": "tcp",
-            "id": 4,
-            "header_type": "tcp_t",
-            "metadata": false
-        },
-        {
-            "name": "udp",
-            "id": 5,
-            "header_type": "udp_t",
-            "metadata": false
-        }
-    ],
-    "header_stacks": [],
-    "parsers": [
-        {
-            "name": "parser",
-            "id": 0,
-            "init_state": "start",
-            "parse_states": [
-                {
-                    "name": "start",
-                    "id": 0,
-                    "parser_ops": [],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": "parse_ethernet"
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_ethernet",
-                    "id": 1,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "ethernet"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ethernet",
-                                "etherType"
-                            ]
-                        }
-                    ],
-                    "transitions": [
-                        {
-                            "value": "0x0800",
-                            "mask": null,
-                            "next_state": "parse_ipv4"
-                        },
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_ipv4",
-                    "id": 2,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "ipv4"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "ipv4",
-                                "fragOffset"
-                            ]
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "ipv4",
-                                "protocol"
-                            ]
-                        }
-                    ],
-                    "transitions": [
-                        {
-                            "value": "0x000006",
-                            "mask": null,
-                            "next_state": "parse_tcp"
-                        },
-                        {
-                            "value": "0x000011",
-                            "mask": null,
-                            "next_state": "parse_udp"
-                        },
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_tcp",
-                    "id": 3,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "tcp"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                },
-                {
-                    "name": "parse_udp",
-                    "id": 4,
-                    "parser_ops": [
-                        {
-                            "op": "extract",
-                            "parameters": [
-                                {
-                                    "type": "regular",
-                                    "value": "udp"
-                                }
-                            ]
-                        }
-                    ],
-                    "transition_key": [],
-                    "transitions": [
-                        {
-                            "value": "default",
-                            "mask": null,
-                            "next_state": null
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "deparsers": [
-        {
-            "name": "deparser",
-            "id": 0,
-            "order": [
-                "ethernet",
-                "ipv4",
-                "udp",
-                "tcp"
-            ]
-        }
-    ],
-    "meter_arrays": [],
-    "actions": [
-        {
-            "name": "_drop",
-            "id": 0,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0x1ff"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "count_packet",
-            "id": 1,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "count",
-                    "parameters": [
-                        {
-                            "type": "counter_array",
-                            "value": "ingress_port_counter"
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ]
-                        }
-                    ]
-                },
-                {
-                    "op": "count",
-                    "parameters": [
-                        {
-                            "type": "counter_array",
-                            "value": "egress_port_counter"
-                        },
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "send_to_cpu",
-            "id": 2,
-            "runtime_data": [],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "hexstr",
-                            "value": "0xff"
-                        }
-                    ]
-                }
-            ]
-        },
-        {
-            "name": "set_egress_port",
-            "id": 3,
-            "runtime_data": [
-                {
-                    "name": "port",
-                    "bitwidth": 9
-                }
-            ],
-            "primitives": [
-                {
-                    "op": "modify_field",
-                    "parameters": [
-                        {
-                            "type": "field",
-                            "value": [
-                                "standard_metadata",
-                                "egress_spec"
-                            ]
-                        },
-                        {
-                            "type": "runtime_data",
-                            "value": 0
-                        }
-                    ]
-                }
-            ]
-        }
-    ],
-    "pipelines": [
-        {
-            "name": "ingress",
-            "id": 0,
-            "init_table": "table0",
-            "tables": [
-                {
-                    "name": "port_count_table",
-                    "id": 0,
-                    "match_type": "exact",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": false,
-                    "direct_meters": null,
-                    "support_timeout": false,
-                    "key": [],
-                    "actions": [
-                        "count_packet"
-                    ],
-                    "next_tables": {
-                        "count_packet": null
-                    },
-                    "default_action": null,
-                    "base_default_next": null
-                },
-                {
-                    "name": "table0",
-                    "id": 1,
-                    "match_type": "ternary",
-                    "type": "simple",
-                    "max_size": 16384,
-                    "with_counters": true,
-                    "direct_meters": null,
-                    "support_timeout": true,
-                    "key": [
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "standard_metadata",
-                                "ingress_port"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "dstAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "srcAddr"
-                            ],
-                            "mask": null
-                        },
-                        {
-                            "match_type": "ternary",
-                            "target": [
-                                "ethernet",
-                                "etherType"
-                            ],
-                            "mask": null
-                        }
-                    ],
-                    "actions": [
-                        "set_egress_port",
-                        "send_to_cpu",
-                        "_drop"
-                    ],
-                    "next_tables": {
-                        "set_egress_port": "_condition_0",
-                        "send_to_cpu": "_condition_0",
-                        "_drop": "_condition_0"
-                    },
-                    "default_action": null,
-                    "base_default_next": "_condition_0"
-                }
-            ],
-            "conditionals": [
-                {
-                    "name": "_condition_0",
-                    "id": 0,
-                    "expression": {
-                        "type": "expression",
-                        "value": {
-                            "op": "<",
-                            "left": {
-                                "type": "field",
-                                "value": [
-                                    "standard_metadata",
-                                    "egress_spec"
-                                ]
-                            },
-                            "right": {
-                                "type": "hexstr",
-                                "value": "0xfe"
-                            }
-                        }
-                    },
-                    "true_next": "port_count_table",
-                    "false_next": null
-                }
-            ]
-        },
-        {
-            "name": "egress",
-            "id": 1,
-            "init_table": null,
-            "tables": [],
-            "conditionals": []
-        }
-    ],
-    "calculations": [],
-    "checksums": [],
-    "learn_lists": [],
-    "field_lists": [],
-    "counter_arrays": [
-        {
-            "name": "ingress_port_counter",
-            "id": 0,
-            "is_direct": false,
-            "size": 254
-        },
-        {
-            "name": "egress_port_counter",
-            "id": 1,
-            "is_direct": false,
-            "size": 254
-        },
-        {
-            "name": "table0_counter",
-            "id": 2,
-            "is_direct": true,
-            "binding": "table0"
-        }
-    ],
-    "register_arrays": [],
-    "force_arith": [
-        [
-            "standard_metadata",
-            "ingress_port"
-        ],
-        [
-            "standard_metadata",
-            "packet_length"
-        ],
-        [
-            "standard_metadata",
-            "egress_spec"
-        ],
-        [
-            "standard_metadata",
-            "egress_port"
-        ],
-        [
-            "standard_metadata",
-            "egress_instance"
-        ],
-        [
-            "standard_metadata",
-            "instance_type"
-        ],
-        [
-            "standard_metadata",
-            "clone_spec"
-        ],
-        [
-            "standard_metadata",
-            "_padding"
-        ],
-        [
-            "intrinsic_metadata",
-            "ingress_global_timestamp"
-        ],
-        [
-            "intrinsic_metadata",
-            "lf_field_list"
-        ],
-        [
-            "intrinsic_metadata",
-            "mcast_grp"
-        ],
-        [
-            "intrinsic_metadata",
-            "egress_rid"
-        ]
-    ]
-}
\ No newline at end of file
diff --git a/protocols/bmv2/ctl/src/test/java/org/onosproject/bmv2/ctl/Bmv2FlowRuleTranslatorImplTest.java b/protocols/bmv2/ctl/src/test/java/org/onosproject/bmv2/ctl/Bmv2FlowRuleTranslatorImplTest.java
deleted file mode 100644
index 41a774f..0000000
--- a/protocols/bmv2/ctl/src/test/java/org/onosproject/bmv2/ctl/Bmv2FlowRuleTranslatorImplTest.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.bmv2.ctl;
-
-import com.google.common.testing.EqualsTester;
-import org.junit.Test;
-import org.onlab.packet.MacAddress;
-import org.onosproject.bmv2.api.context.Bmv2Configuration;
-import org.onosproject.bmv2.api.context.Bmv2DeviceContext;
-import org.onosproject.bmv2.api.context.Bmv2FlowRuleTranslator;
-import org.onosproject.bmv2.api.context.Bmv2Interpreter;
-import org.onosproject.bmv2.api.runtime.Bmv2TableEntry;
-import org.onosproject.bmv2.api.runtime.Bmv2TernaryMatchParam;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.DefaultApplicationId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.flow.DefaultFlowRule;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.FlowRule;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-
-import java.util.Random;
-
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.onosproject.bmv2.ctl.Bmv2DefaultInterpreterImpl.TABLE0;
-
-/**
- * Tests for {@link Bmv2FlowRuleTranslatorImpl}.
- */
-public class Bmv2FlowRuleTranslatorImplTest {
-
-    private Random random = new Random();
-    private Bmv2Configuration configuration = Bmv2DeviceContextServiceImpl.loadDefaultConfiguration();
-    private Bmv2Interpreter interpreter = new Bmv2DefaultInterpreterImpl();
-    private Bmv2DeviceContext context = new Bmv2DeviceContext(configuration, interpreter);
-    private Bmv2FlowRuleTranslator translator = new Bmv2FlowRuleTranslatorImpl();
-
-    @Test
-    public void testTranslate() throws Exception {
-
-        DeviceId deviceId = DeviceId.NONE;
-        ApplicationId appId = new DefaultApplicationId(1, "test");
-        int tableId = 0;
-        MacAddress ethDstMac = MacAddress.valueOf(random.nextLong());
-        MacAddress ethSrcMac = MacAddress.valueOf(random.nextLong());
-        short ethType = (short) (0x0000FFFF & random.nextInt());
-        short outPort = (short) random.nextInt(65);
-        short inPort = (short) random.nextInt(65);
-        int timeout = random.nextInt(100);
-        int priority = random.nextInt(100);
-
-        TrafficSelector matchInPort1 = DefaultTrafficSelector
-                .builder()
-                .matchInPort(PortNumber.portNumber(inPort))
-                .matchEthDst(ethDstMac)
-                .matchEthSrc(ethSrcMac)
-                .matchEthType(ethType)
-                .build();
-
-        TrafficTreatment outPort2 = DefaultTrafficTreatment
-                .builder()
-                .setOutput(PortNumber.portNumber(outPort))
-                .build();
-
-        FlowRule rule1 = DefaultFlowRule.builder()
-                .forDevice(deviceId)
-                .forTable(tableId)
-                .fromApp(appId)
-                .withSelector(matchInPort1)
-                .withTreatment(outPort2)
-                .makeTemporary(timeout)
-                .withPriority(priority)
-                .build();
-
-        FlowRule rule2 = DefaultFlowRule.builder()
-                .forDevice(deviceId)
-                .forTable(tableId)
-                .fromApp(appId)
-                .withSelector(matchInPort1)
-                .withTreatment(outPort2)
-                .makeTemporary(timeout)
-                .withPriority(priority)
-                .build();
-
-        Bmv2TableEntry entry1 = translator.translate(rule1, context);
-        Bmv2TableEntry entry2 = translator.translate(rule1, context);
-
-        // check equality, i.e. same rules must produce same entries
-        new EqualsTester()
-                .addEqualityGroup(rule1, rule2)
-                .addEqualityGroup(entry1, entry2)
-                .testEquals();
-
-        int numMatchParams = configuration.table(TABLE0).keys().size();
-        // parse values stored in entry1
-        Bmv2TernaryMatchParam inPortParam = (Bmv2TernaryMatchParam) entry1.matchKey().matchParams().get(0);
-        Bmv2TernaryMatchParam ethDstParam = (Bmv2TernaryMatchParam) entry1.matchKey().matchParams().get(1);
-        Bmv2TernaryMatchParam ethSrcParam = (Bmv2TernaryMatchParam) entry1.matchKey().matchParams().get(2);
-        Bmv2TernaryMatchParam ethTypeParam = (Bmv2TernaryMatchParam) entry1.matchKey().matchParams().get(3);
-        double expectedTimeout = (double) (configuration.table(TABLE0).hasTimeouts() ? rule1.timeout() : -1);
-
-        // check that the number of parameters in the entry is the same as the number of table keys
-        assertThat("Incorrect number of match parameters",
-                   entry1.matchKey().matchParams().size(), is(equalTo(numMatchParams)));
-
-        // check that values stored in entry are the same used for the flow rule
-        assertThat("Incorrect inPort match param value",
-                   inPortParam.value().asReadOnlyBuffer().getShort(), is(equalTo(inPort)));
-        assertThat("Incorrect ethDestMac match param value",
-                   ethDstParam.value().asArray(), is(equalTo(ethDstMac.toBytes())));
-        assertThat("Incorrect ethSrcMac match param value",
-                   ethSrcParam.value().asArray(), is(equalTo(ethSrcMac.toBytes())));
-        assertThat("Incorrect ethType match param value",
-                   ethTypeParam.value().asReadOnlyBuffer().getShort(), is(equalTo(ethType)));
-        assertThat("Incorrect priority value",
-                   entry1.priority(), is(equalTo(Integer.MAX_VALUE - rule1.priority())));
-        assertThat("Incorrect timeout value",
-                   entry1.timeout(), is(equalTo(expectedTimeout)));
-
-    }
-}
\ No newline at end of file
diff --git a/protocols/bmv2/pom.xml b/protocols/bmv2/pom.xml
deleted file mode 100644
index 23b4acd..0000000
--- a/protocols/bmv2/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-protocols</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-bmv2-protocol</artifactId>
-
-    <modules>
-        <module>api</module>
-        <module>ctl</module>
-        <module>thrift-api</module>
-    </modules>
-
-    <packaging>pom</packaging>
-
-    <description>BMv2 protocol subsystem</description>
-
-</project>
\ No newline at end of file
diff --git a/protocols/bmv2/thrift-api/pom.xml b/protocols/bmv2/thrift-api/pom.xml
deleted file mode 100644
index 3514bed..0000000
--- a/protocols/bmv2/thrift-api/pom.xml
+++ /dev/null
@@ -1,239 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-bmv2-protocol</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-bmv2-protocol-thrift-api</artifactId>
-
-    <packaging>bundle</packaging>
-
-    <properties>
-        <!-- BMv2 Commit ID and Thrift version -->
-        <bmv2.commit>8f675d0284e9e014f1b8ed502ba54e61d68108cf</bmv2.commit>
-        <bmv2.thrift.version>0.9.3</bmv2.thrift.version>
-        <bmv2.baseurl>https://cdn.rawgit.com/opennetworkinglab/onos-bmv2/${bmv2.commit}</bmv2.baseurl>
-        <bmv2.thrift.javanamespace>org.onosproject.bmv2.thriftapi</bmv2.thrift.javanamespace>
-        <bmv2.thrift.srcdir>${project.build.directory}/thrift-sources/${bmv2.commit}/</bmv2.thrift.srcdir>
-        <thrift.exedir>${project.build.directory}/thrift-compiler/</thrift.exedir>
-        <thrift.exefilename>thrift-${os.detected.classifier}.exe</thrift.exefilename>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.thrift</groupId>
-            <artifactId>libthrift</artifactId>
-            <version>0.9.3</version>
-        </dependency>
-    </dependencies>
-
-    <repositories>
-        <!-- Needed for thrift-compiler, which is hosted on GitHub -->
-        <repository>
-            <id>jitpack.io</id>
-            <url>https://jitpack.io</url>
-        </repository>
-    </repositories>
-
-    <build>
-        <extensions>
-            <extension>
-                <groupId>kr.motd.maven</groupId>
-                <artifactId>os-maven-plugin</artifactId>
-                <version>1.4.0.Final</version>
-            </extension>
-        </extensions>
-
-        <plugins>
-            <!-- Download Thrift source files from BMv2 Github repo -->
-            <plugin>
-                <groupId>com.googlecode.maven-download-plugin</groupId>
-                <artifactId>download-maven-plugin</artifactId>
-                <version>1.3.0</version>
-                <executions>
-                    <execution>
-                        <id>download-bmv2-thrift-standard</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>wget</goal>
-                        </goals>
-                        <configuration>
-                            <url>${bmv2.baseurl}/thrift_src/standard.thrift</url>
-                            <outputDirectory>${bmv2.thrift.srcdir}</outputDirectory>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>download-bmv2-thrift-simple_pre</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>wget</goal>
-                        </goals>
-                        <configuration>
-                            <url>${bmv2.baseurl}/thrift_src/simple_pre.thrift</url>
-                            <outputDirectory>${bmv2.thrift.srcdir}</outputDirectory>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>download-bmv2-thrift-simple_pre_lag</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>wget</goal>
-                        </goals>
-                        <configuration>
-                            <url>${bmv2.baseurl}/thrift_src/simple_pre_lag.thrift</url>
-                            <outputDirectory>${bmv2.thrift.srcdir}</outputDirectory>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>download-bmv2-thrift-simple_switch</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>wget</goal>
-                        </goals>
-                        <configuration>
-                            <url>${bmv2.baseurl}/targets/simple_switch/thrift/simple_switch.thrift</url>
-                            <outputDirectory>${bmv2.thrift.srcdir}</outputDirectory>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>download-bmv2-thrift-simple_switch-cpservice</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>wget</goal>
-                        </goals>
-                        <configuration>
-                            <url>${bmv2.baseurl}/targets/simple_switch/thrift/control_plane.thrift</url>
-                            <outputDirectory>${bmv2.thrift.srcdir}</outputDirectory>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Extract Thrift compiler -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>unpack</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>unpack</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>com.github.ccascone</groupId>
-                                    <artifactId>mvn-thrift-compiler</artifactId>
-                                    <version>1.1_${bmv2.thrift.version}</version>
-                                    <type>jar</type>
-                                    <includes>${thrift.exefilename}</includes>
-                                    <outputDirectory>${project.build.directory}/thrift-compiler</outputDirectory>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Add missing java namespace to Thrift files -->
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <version>1.4.0</version>
-                <executions>
-                    <execution>
-                        <id>add-bmv2-thrift-java-namespace</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                        <configuration>
-                            <executable>${project.basedir}/src/patch.sh</executable>
-                            <arguments>
-                                <argument>${bmv2.thrift.srcdir}</argument>
-                                <argument>${bmv2.thrift.javanamespace}</argument>
-                            </arguments>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>set-thrift-compiler-permissions</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                        <configuration>
-                            <executable>chmod</executable>
-                            <arguments>
-                                <argument>+x</argument>
-                                <argument>${thrift.exedir}/${thrift.exefilename}</argument>
-                            </arguments>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Compile Thrift files -->
-            <plugin>
-                <groupId>org.apache.thrift.tools</groupId>
-                <artifactId>maven-thrift-plugin</artifactId>
-                <version>0.1.11</version>
-                <configuration>
-                    <thriftSourceRoot>${bmv2.thrift.srcdir}</thriftSourceRoot>
-                    <thriftExecutable>${thrift.exedir}/${thrift.exefilename}</thriftExecutable>
-                    <outputDirectory>${project.build.directory}/generated-sources</outputDirectory>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>thrift-sources</id>
-                        <phase>initialize</phase>
-                        <goals>
-                            <goal>compile</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Make generated sources visible -->
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <version>1.4</version>
-                <executions>
-                    <execution>
-                        <id>add-thrift-sources-to-path</id>
-                        <phase>generate-sources</phase>
-                        <goals>
-                            <goal>add-source</goal>
-                        </goals>
-                        <configuration>
-                            <sources>
-                                <source>
-                                    ${project.build.directory}/generated-sources
-                                </source>
-                            </sources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
\ No newline at end of file
diff --git a/protocols/bmv2/thrift-api/src/patch.sh b/protocols/bmv2/thrift-api/src/patch.sh
deleted file mode 100755
index 7f7ffb9..0000000
--- a/protocols/bmv2/thrift-api/src/patch.sh
+++ /dev/null
@@ -1,29 +0,0 @@
-#! /bin/bash
-#
-# Copyright 2014-2016 Open Networking Laboratory
-#
-# 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.
-
-# exit on errors
-set -e
-
-srcdir=$1
-ns=$2
-
-# add java namespace at beginning of file
-for f in ${srcdir}/*.thrift
-do
-    if ! grep -q ${ns} ${f}; then
-        echo "namespace java ${ns}" | cat - ${f} > temp && mv temp ${f}
-    fi
-done
\ No newline at end of file
diff --git a/protocols/pom.xml b/protocols/pom.xml
index 8d40b53..b823f9c 100644
--- a/protocols/pom.xml
+++ b/protocols/pom.xml
@@ -40,7 +40,6 @@
         <module>ospf</module>
         <module>isis</module>
         <module>snmp</module>
-        <module>bmv2</module>
         <module>lisp</module>
         <module>restconf</module>
         <module>tl1</module>
diff --git a/providers/bmv2/app/features.xml b/providers/bmv2/app/features.xml
deleted file mode 100644
index 76c36e6..0000000
--- a/providers/bmv2/app/features.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="${project.artifactId}-${project.version}">
-    <feature name="${project.artifactId}" version="${project.version}"
-             description="${project.description}">
-        <feature>onos-drivers-bmv2</feature>
-        <bundle>mvn:${project.groupId}/${project.artifactId}/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-bmv2-provider-device/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-bmv2-provider-packet/${project.version}</bundle>
-        <bundle>mvn:org.apache.thrift/libthrift/0.9.3</bundle>
-        <bundle>mvn:${project.groupId}/onos-bmv2-protocol-api/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-bmv2-protocol-ctl/${project.version}</bundle>
-        <bundle>mvn:${project.groupId}/onos-bmv2-protocol-thrift-api/${project.version}</bundle>
-    </feature>
-</features>
-
diff --git a/providers/bmv2/app/pom.xml b/providers/bmv2/app/pom.xml
deleted file mode 100644
index 25f1cd6..0000000
--- a/providers/bmv2/app/pom.xml
+++ /dev/null
@@ -1,53 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-bmv2-providers</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-bmv2-app</artifactId>
-    <packaging>bundle</packaging>
-
-    <description>ONOS BMv2 southbound providers</description>
-
-    <properties>
-        <onos.app.name>org.onosproject.bmv2</onos.app.name>
-        <onos.app.title>BMv2 Providers</onos.app.title>
-        <onos.app.category>Provider</onos.app.category>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-provider-device</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-provider-packet</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/providers/bmv2/device/pom.xml b/providers/bmv2/device/pom.xml
deleted file mode 100644
index ba62b49..0000000
--- a/providers/bmv2/device/pom.xml
+++ /dev/null
@@ -1,44 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-bmv2-providers</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-bmv2-provider-device</artifactId>
-    <packaging>bundle</packaging>
-
-    <description>ONOS BMv2 device provider</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-core-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-protocol-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2DeviceProvider.java b/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2DeviceProvider.java
deleted file mode 100644
index 53f8c5b..0000000
--- a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2DeviceProvider.java
+++ /dev/null
@@ -1,377 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.provider.bmv2.device.impl;
-
-import com.google.common.collect.Maps;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.util.SharedScheduledExecutors;
-import org.onosproject.bmv2.api.runtime.Bmv2Device;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.bmv2.api.service.Bmv2DeviceContextService;
-import org.onosproject.bmv2.api.service.Bmv2DeviceListener;
-import org.onosproject.bmv2.api.service.Bmv2TableEntryService;
-import org.onosproject.common.net.AbstractDeviceProvider;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.core.CoreService;
-import org.onosproject.incubator.net.config.basics.ConfigException;
-import org.onosproject.mastership.MastershipService;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.MastershipRole;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.config.ConfigFactory;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.config.NetworkConfigListener;
-import org.onosproject.net.config.NetworkConfigRegistry;
-import org.onosproject.net.device.DeviceDescription;
-import org.onosproject.net.device.DeviceDescriptionDiscovery;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.device.PortDescription;
-import org.onosproject.net.device.PortStatistics;
-import org.onosproject.net.driver.DefaultDriverData;
-import org.onosproject.net.driver.DefaultDriverHandler;
-import org.onosproject.net.driver.Driver;
-import org.onosproject.net.provider.ProviderId;
-import org.slf4j.Logger;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
-import static org.onlab.util.Tools.groupedThreads;
-import static org.onosproject.bmv2.api.runtime.Bmv2Device.*;
-import static org.onosproject.net.Device.Type.SWITCH;
-import static org.onosproject.net.config.basics.SubjectFactories.APP_SUBJECT_FACTORY;
-import static org.onosproject.provider.bmv2.device.impl.Bmv2PortStatisticsGetter.getPortStatistics;
-import static org.onosproject.provider.bmv2.device.impl.Bmv2PortStatisticsGetter.initCounters;
-import static org.slf4j.LoggerFactory.getLogger;
-
-/**
- * BMv2 device provider.
- */
-@Component(immediate = true)
-public class Bmv2DeviceProvider extends AbstractDeviceProvider {
-
-    private static final String APP_NAME = "org.onosproject.bmv2";
-
-    private static final int POLL_PERIOD = 5_000; // milliseconds
-
-    private final Logger log = getLogger(this.getClass());
-
-    private final ExecutorService executorService = Executors
-            .newFixedThreadPool(16, groupedThreads("onos/bmv2", "device-discovery", log));
-
-    private final ScheduledExecutorService scheduledExecutorService = SharedScheduledExecutors.getPoolThreadExecutor();
-
-    private final NetworkConfigListener cfgListener = new InternalNetworkConfigListener();
-
-    private final ConfigFactory cfgFactory = new InternalConfigFactory();
-
-    private final Map<DeviceId, DeviceDescription> lastDescriptions = Maps.newHashMap();
-
-    private final ConcurrentMap<DeviceId, Lock> deviceLocks = Maps.newConcurrentMap();
-
-    private final InternalDeviceListener deviceListener = new InternalDeviceListener();
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected NetworkConfigRegistry netCfgService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected MastershipService mastershipService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected Bmv2Controller controller;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected Bmv2DeviceContextService contextService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected Bmv2TableEntryService tableEntryService;
-
-    private ApplicationId appId;
-    private ScheduledFuture<?> poller;
-
-    /**
-     * Creates a Bmv2 device provider with the supplied identifier.
-     */
-    public Bmv2DeviceProvider() {
-        super(new ProviderId("bmv2", "org.onosproject.provider.device"));
-    }
-
-    @Override
-    protected void activate() {
-        appId = coreService.registerApplication(APP_NAME);
-        netCfgService.registerConfigFactory(cfgFactory);
-        netCfgService.addListener(cfgListener);
-        controller.addDeviceListener(deviceListener);
-        if (poller != null) {
-            poller.cancel(false);
-        }
-        poller = scheduledExecutorService.scheduleAtFixedRate(this::pollDevices, 1_000, POLL_PERIOD, MILLISECONDS);
-        super.activate();
-    }
-
-    @Override
-    protected void deactivate() {
-        if (poller != null) {
-            poller.cancel(false);
-        }
-        controller.removeDeviceListener(deviceListener);
-        try {
-            lastDescriptions.forEach((did, value) -> {
-                executorService.execute(() -> disconnectDevice(did));
-            });
-            executorService.awaitTermination(1000, MILLISECONDS);
-        } catch (InterruptedException e) {
-            log.error("Device discovery threads did not terminate");
-        }
-        executorService.shutdownNow();
-        netCfgService.unregisterConfigFactory(cfgFactory);
-        netCfgService.removeListener(cfgListener);
-        super.deactivate();
-    }
-
-    @Override
-    public void triggerProbe(DeviceId deviceId) {
-        // Asynchronously trigger probe task.
-        executorService.execute(() -> executeProbe(deviceId));
-    }
-
-    private void executeProbe(DeviceId did) {
-        boolean reachable = isReachable(did);
-        log.debug("Probed device: id={}, reachable={}", did.toString(), reachable);
-        if (reachable) {
-            discoverDevice(did);
-        } else {
-            disconnectDevice(did);
-        }
-    }
-
-    @Override
-    public void roleChanged(DeviceId deviceId, MastershipRole newRole) {
-        log.debug("roleChanged() is not yet implemented");
-        // TODO: implement mastership handling
-    }
-
-    @Override
-    public boolean isReachable(DeviceId deviceId) {
-        return controller.isReacheable(deviceId);
-    }
-
-    @Override
-    public void changePortState(DeviceId deviceId, PortNumber portNumber, boolean enable) {
-        log.warn("changePortState() not supported");
-    }
-
-    private void discoverDevice(DeviceId did) {
-        // Serialize discovery for the same device.
-        Lock lock = deviceLocks.computeIfAbsent(did, k -> new ReentrantLock());
-        lock.lock();
-        try {
-            log.debug("Starting device discovery... deviceId={}", did);
-
-            if (contextService.getContext(did) == null) {
-                // Device is a first timer.
-                log.info("Setting DEFAULT context for {}", did);
-                // It is important to do this before creating the device in the core
-                // so other services won't find a null context.
-                contextService.setDefaultContext(did);
-                // Abort discovery, we'll receive a new hello once the swap has been performed.
-                return;
-            }
-
-            DeviceDescription lastDescription = lastDescriptions.get(did);
-            DeviceDescription thisDescription = getDeviceDescription(did);
-
-            if (thisDescription != null) {
-                boolean descriptionChanged = lastDescription == null ||
-                        (!Objects.equals(thisDescription, lastDescription) ||
-                                !Objects.equals(thisDescription.annotations(), lastDescription.annotations()));
-                if (descriptionChanged || !deviceService.isAvailable(did)) {
-                    resetDeviceState(did);
-                    initPortCounters(did);
-                    providerService.deviceConnected(did, thisDescription);
-                    updatePortsAndStats(did);
-                }
-                lastDescriptions.put(did, thisDescription);
-            } else {
-                log.warn("Unable to get device description for {}", did);
-                lastDescriptions.put(did, lastDescription);
-            }
-        } finally {
-            lock.unlock();
-        }
-    }
-
-    private DeviceDescription getDeviceDescription(DeviceId did) {
-        Device device = deviceService.getDevice(did);
-        DeviceDescriptionDiscovery discovery = null;
-        if (device == null) {
-            // Device not yet in the core. Manually get a driver.
-            Driver driver = driverService.getDriver(MANUFACTURER, HW_VERSION, SW_VERSION);
-            if (driver.hasBehaviour(DeviceDescriptionDiscovery.class)) {
-                discovery = driver.createBehaviour(new DefaultDriverHandler(new DefaultDriverData(driver, did)),
-                                                   DeviceDescriptionDiscovery.class);
-            }
-        } else if (device.is(DeviceDescriptionDiscovery.class)) {
-            discovery = device.as(DeviceDescriptionDiscovery.class);
-        }
-        if (discovery == null) {
-            log.warn("No DeviceDescriptionDiscovery behavior for device {}", did);
-            return null;
-        } else {
-            return discovery.discoverDeviceDetails();
-        }
-    }
-
-    private void resetDeviceState(DeviceId did) {
-        try {
-            controller.getAgent(did).resetState();
-            // Tables emptied. Reset all bindings.
-            tableEntryService.unbindAll(did);
-        } catch (Bmv2RuntimeException e) {
-            log.warn("Unable to reset {}: {}", did, e.toString());
-        }
-    }
-
-    private void initPortCounters(DeviceId did) {
-        try {
-            initCounters(controller.getAgent(did));
-        } catch (Bmv2RuntimeException e) {
-            log.warn("Unable to init counter on {}: {}", did, e.explain());
-        }
-    }
-
-    private void updatePortsAndStats(DeviceId did) {
-        Device device = deviceService.getDevice(did);
-        if (device.is(DeviceDescriptionDiscovery.class)) {
-            DeviceDescriptionDiscovery discovery = device.as(DeviceDescriptionDiscovery.class);
-            List<PortDescription> portDescriptions = discovery.discoverPortDetails();
-            if (portDescriptions != null) {
-                providerService.updatePorts(did, portDescriptions);
-            }
-        } else {
-            log.warn("No DeviceDescriptionDiscovery behavior for device {}", did);
-        }
-        try {
-            Collection<PortStatistics> portStats = getPortStatistics(controller.getAgent(did),
-                                                                     deviceService.getPorts(did));
-            providerService.updatePortStatistics(did, portStats);
-        } catch (Bmv2RuntimeException e) {
-            log.warn("Unable to get port statistics for {}: {}", did, e.explain());
-        }
-    }
-
-    private void disconnectDevice(DeviceId did) {
-        log.debug("Disconnecting device from core... deviceId={}", did);
-        providerService.deviceDisconnected(did);
-        lastDescriptions.remove(did);
-    }
-
-    private void pollDevices() {
-        for (Device device: deviceService.getAvailableDevices(SWITCH)) {
-            if (device.id().uri().getScheme().equals(SCHEME) &&
-                    mastershipService.isLocalMaster(device.id())) {
-                executorService.execute(() -> pollingTask(device.id()));
-            }
-        }
-    }
-
-    private void pollingTask(DeviceId deviceId) {
-        log.debug("Polling device {}...", deviceId);
-        if (isReachable(deviceId)) {
-            updatePortsAndStats(deviceId);
-        } else {
-            disconnectDevice(deviceId);
-        }
-    }
-
-    /**
-     * Internal net-cfg config factory.
-     */
-    private class InternalConfigFactory extends ConfigFactory<ApplicationId, Bmv2ProviderConfig> {
-
-        InternalConfigFactory() {
-            super(APP_SUBJECT_FACTORY, Bmv2ProviderConfig.class, "devices", true);
-        }
-
-        @Override
-        public Bmv2ProviderConfig createConfig() {
-            return new Bmv2ProviderConfig();
-        }
-    }
-
-    /**
-     * Internal net-cfg event listener.
-     */
-    private class InternalNetworkConfigListener implements NetworkConfigListener {
-
-        @Override
-        public void event(NetworkConfigEvent event) {
-            Bmv2ProviderConfig cfg = netCfgService.getConfig(appId, Bmv2ProviderConfig.class);
-            if (cfg != null) {
-                try {
-                    cfg.getDevicesInfo().stream().forEach(info -> {
-                        // FIXME: require also bmv2 internal device id from net-cfg (now is default 0)
-                        Bmv2Device bmv2Device = new Bmv2Device(info.ip().toString(), info.port(), 0);
-                        triggerProbe(bmv2Device.asDeviceId());
-                    });
-                } catch (ConfigException e) {
-                    log.error("Unable to read config: " + e);
-                }
-            } else {
-                log.error("Unable to read config (was null)");
-            }
-        }
-
-        @Override
-        public boolean isRelevant(NetworkConfigEvent event) {
-            return event.configClass().equals(Bmv2ProviderConfig.class) &&
-                    (event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
-                            event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED);
-        }
-    }
-
-    /**
-     * Listener triggered by the BMv2 controller each time a hello message is received.
-     */
-    private class InternalDeviceListener implements Bmv2DeviceListener {
-        @Override
-        public void handleHello(Bmv2Device device, int instanceId, String jsonConfigMd5) {
-            log.debug("Received hello from {}", device);
-            triggerProbe(device.asDeviceId());
-        }
-    }
-}
diff --git a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2PortStatisticsGetter.java b/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2PortStatisticsGetter.java
deleted file mode 100644
index ff94ab0..0000000
--- a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2PortStatisticsGetter.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.provider.bmv2.device.impl;
-
-import com.google.common.collect.Lists;
-import org.apache.commons.lang3.tuple.Pair;
-import org.onosproject.bmv2.api.runtime.Bmv2Action;
-import org.onosproject.bmv2.api.runtime.Bmv2DeviceAgent;
-import org.onosproject.bmv2.api.runtime.Bmv2RuntimeException;
-import org.onosproject.net.Port;
-import org.onosproject.net.device.DefaultPortStatistics;
-import org.onosproject.net.device.PortStatistics;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Collection;
-import java.util.List;
-
-/**
- * Utility class to read port statistics from a BMv2 device.
- */
-final class Bmv2PortStatisticsGetter {
-
-    // TODO: make counters configuration dependent
-
-    private static final String TABLE_NAME = "port_count_table";
-    private static final String ACTION_NAME = "count_packet";
-    private static final String EGRESS_COUNTER = "egress_port_counter";
-    private static final String INGRESS_COUNTER = "ingress_port_counter";
-
-    private static final Logger log = LoggerFactory.getLogger(Bmv2PortStatisticsGetter.class);
-
-    private Bmv2PortStatisticsGetter() {
-        // ban constructor.
-    }
-
-    /**
-     * Returns a collection of port statistics for given ports using the given BMv2 device agent.
-     *
-     * @param deviceAgent a device agent
-     * @param ports       a collection of ports
-     * @return a collection of port statistics
-     */
-    static Collection<PortStatistics> getPortStatistics(Bmv2DeviceAgent deviceAgent, Collection<Port> ports) {
-
-        List<PortStatistics> ps = Lists.newArrayList();
-
-        for (Port port : ports) {
-            int portNumber = (int) port.number().toLong();
-            try {
-                Pair<Long, Long> egressCounter = deviceAgent.readCounter(EGRESS_COUNTER, portNumber);
-                Pair<Long, Long> ingressCounter = deviceAgent.readCounter(INGRESS_COUNTER, portNumber);
-                ps.add(DefaultPortStatistics.builder()
-                               .setPort(portNumber)
-                               .setBytesSent(egressCounter.getLeft())
-                               .setPacketsSent(egressCounter.getRight())
-                               .setBytesReceived(ingressCounter.getLeft())
-                               .setPacketsReceived(ingressCounter.getRight())
-                               .build());
-            } catch (Bmv2RuntimeException e) {
-                log.info("Unable to read port statistics from {}: {}", port, e.explain());
-            }
-        }
-
-        return ps;
-    }
-
-    /**
-     * Initialize port counters on the given device agent.
-     *
-     * @param deviceAgent a device agent.
-     */
-    static void initCounters(Bmv2DeviceAgent deviceAgent) {
-        try {
-            deviceAgent.setTableDefaultAction(TABLE_NAME, Bmv2Action.builder().withName(ACTION_NAME).build());
-        } catch (Bmv2RuntimeException e) {
-            log.debug("Failed to provision counters on {}: {}", deviceAgent.deviceId(), e.explain());
-        }
-    }
-}
-
diff --git a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2ProviderConfig.java b/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2ProviderConfig.java
deleted file mode 100644
index 0accf9b..0000000
--- a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/Bmv2ProviderConfig.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.provider.bmv2.device.impl;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.google.common.annotations.Beta;
-import com.google.common.collect.Sets;
-import org.onlab.packet.IpAddress;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.incubator.net.config.basics.ConfigException;
-import org.onosproject.net.config.Config;
-
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-
-/**
- * Configuration decoder for Bmv2 provider.
- */
-@Beta
-public class Bmv2ProviderConfig extends Config<ApplicationId> {
-    public static final String CONFIG_VALUE_ERROR = "Error parsing config value";
-    private static final String IP = "ip";
-    private static final int DEFAULT_THRIFT_PORT = 9090;
-    private static final String PORT = "port";
-
-    /**
-     * Retrieves a set of Bmv2DeviceInfo containing all the device
-     * configuration pertaining to the Bmv2 device provider.
-     *
-     * @return set of device configurations.
-     * @throws ConfigException if configuration can't be read
-     */
-    public Set<Bmv2DeviceInfo> getDevicesInfo() throws ConfigException {
-        Set<Bmv2DeviceInfo> deviceInfos = Sets.newHashSet();
-
-        try {
-            for (JsonNode node : array) {
-                String ip = node.path(IP).asText();
-                IpAddress ipAddr = ip.isEmpty() ? null : IpAddress.valueOf(ip);
-                int port = node.path(PORT).asInt(DEFAULT_THRIFT_PORT);
-                deviceInfos.add(new Bmv2DeviceInfo(ipAddr, port));
-
-            }
-        } catch (IllegalArgumentException e) {
-            throw new ConfigException(CONFIG_VALUE_ERROR, e);
-        }
-
-        return deviceInfos;
-    }
-
-    /**
-     * Contains information about a Bmv2 device retrieved from the net-cfg
-     * subsystem.
-     */
-    public static class Bmv2DeviceInfo {
-        private final IpAddress ip;
-        private final int port;
-
-        /**
-         * Build an information object containing the given device specifics.
-         *
-         * @param ip   ip
-         * @param port port
-         */
-        public Bmv2DeviceInfo(IpAddress ip, int port) {
-            // TODO use generalized host string instead of IP address
-            this.ip = checkNotNull(ip, "ip cannot be null");
-            this.port = checkNotNull(port, "port cannot be null");
-        }
-
-        /**
-         * Returns IpAddress of the device.
-         *
-         * @return ip
-         */
-        public IpAddress ip() {
-            return ip;
-        }
-
-        /**
-         * Returns port of the device.
-         *
-         * @return port
-         */
-        public int port() {
-            return port;
-        }
-    }
-
-}
diff --git a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/package-info.java b/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/package-info.java
deleted file mode 100644
index 1607b3c..0000000
--- a/providers/bmv2/device/src/main/java/org/onosproject/provider/bmv2/device/impl/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * Provider that use BMv2 Thrift RPCs as a mean of infrastructure device discovery.
- */
-package org.onosproject.provider.bmv2.device.impl;
\ No newline at end of file
diff --git a/providers/bmv2/packet/pom.xml b/providers/bmv2/packet/pom.xml
deleted file mode 100644
index cb4fe23..0000000
--- a/providers/bmv2/packet/pom.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-bmv2-providers</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-bmv2-provider-packet</artifactId>
-
-    <packaging>bundle</packaging>
-
-    <description>ONOS BMv2 packet provider</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-core-common</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.onosproject</groupId>
-            <artifactId>onos-bmv2-protocol-api</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-    </dependencies>
-</project>
\ No newline at end of file
diff --git a/providers/bmv2/packet/src/main/java/org/onosproject/provider/bmv2/packet/impl/Bmv2PacketProvider.java b/providers/bmv2/packet/src/main/java/org/onosproject/provider/bmv2/packet/impl/Bmv2PacketProvider.java
deleted file mode 100644
index c6945f9..0000000
--- a/providers/bmv2/packet/src/main/java/org/onosproject/provider/bmv2/packet/impl/Bmv2PacketProvider.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.provider.bmv2.packet.impl;
-
-import org.apache.felix.scr.annotations.Activate;
-import org.apache.felix.scr.annotations.Component;
-import org.apache.felix.scr.annotations.Deactivate;
-import org.apache.felix.scr.annotations.Reference;
-import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.packet.Ethernet;
-import org.onlab.util.ImmutableByteSequence;
-import org.onosproject.bmv2.api.runtime.Bmv2Device;
-import org.onosproject.bmv2.api.service.Bmv2Controller;
-import org.onosproject.bmv2.api.service.Bmv2PacketListener;
-import org.onosproject.core.CoreService;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.Device;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Port;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.device.DeviceService;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.packet.DefaultInboundPacket;
-import org.onosproject.net.packet.DefaultOutboundPacket;
-import org.onosproject.net.packet.DefaultPacketContext;
-import org.onosproject.net.packet.InboundPacket;
-import org.onosproject.net.packet.OutboundPacket;
-import org.onosproject.net.packet.PacketContext;
-import org.onosproject.net.packet.PacketProgrammable;
-import org.onosproject.net.packet.PacketProvider;
-import org.onosproject.net.packet.PacketProviderRegistry;
-import org.onosproject.net.packet.PacketProviderService;
-import org.onosproject.net.provider.AbstractProvider;
-import org.onosproject.net.provider.ProviderId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.nio.ByteBuffer;
-import java.util.Optional;
-
-import static org.onosproject.net.PortNumber.FLOOD;
-import static org.onosproject.net.flow.DefaultTrafficTreatment.emptyTreatment;
-import static org.onosproject.net.flow.instructions.Instruction.Type.OUTPUT;
-import static org.onosproject.net.flow.instructions.Instructions.OutputInstruction;
-
-/**
- * Implementation of a packet provider for BMv2.
- */
-@Component(immediate = true)
-public class Bmv2PacketProvider extends AbstractProvider implements PacketProvider {
-
-    private final Logger log = LoggerFactory.getLogger(Bmv2PacketProvider.class);
-    private static final String APP_NAME = "org.onosproject.bmv2";
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected Bmv2Controller controller;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected CoreService coreService;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected PacketProviderRegistry providerRegistry;
-
-    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
-    protected DeviceService deviceService;
-
-    private PacketProviderService providerService;
-
-    private InternalPacketListener packetListener = new InternalPacketListener();
-
-    /**
-     * Creates a new BMv2 packet provider.
-     */
-    public Bmv2PacketProvider() {
-        super(new ProviderId("bmv2", "org.onosproject.provider.packet"));
-    }
-
-    @Activate
-    protected void activate() {
-        providerService = providerRegistry.register(this);
-        coreService.registerApplication(APP_NAME);
-        controller.addPacketListener(packetListener);
-        log.info("Started");
-    }
-
-    @Deactivate
-    public void deactivate() {
-        controller.removePacketListener(packetListener);
-        providerRegistry.unregister(this);
-        providerService = null;
-        log.info("Stopped");
-    }
-
-    @Override
-    public void emit(OutboundPacket packet) {
-        if (packet != null) {
-            DeviceId deviceId = packet.sendThrough();
-            Device device = deviceService.getDevice(deviceId);
-            if (device.is(PacketProgrammable.class)) {
-                PacketProgrammable packetProgrammable = device.as(PacketProgrammable.class);
-                packetProgrammable.emit(packet);
-            } else {
-                log.info("No PacketProgrammable behavior for device {}", deviceId);
-            }
-        }
-    }
-
-    /**
-     * Internal packet context implementation.
-     */
-    private class Bmv2PacketContext extends DefaultPacketContext {
-
-        Bmv2PacketContext(long time, InboundPacket inPkt, OutboundPacket outPkt, boolean block) {
-            super(time, inPkt, outPkt, block);
-        }
-
-        @Override
-        public void send() {
-
-            if (this.block()) {
-                log.info("Unable to send, packet context not blocked");
-                return;
-            }
-
-            DeviceId deviceId = outPacket().sendThrough();
-            ByteBuffer rawData = outPacket().data();
-
-            TrafficTreatment treatment;
-            if (outPacket().treatment() == null) {
-                treatment = (treatmentBuilder() == null) ? emptyTreatment() : treatmentBuilder().build();
-            } else {
-                treatment = outPacket().treatment();
-            }
-
-            // BMv2 doesn't support FLOOD for packet-outs.
-            // Workaround here is to perform multiple emits, one for each device port != packet inPort.
-            Optional<OutputInstruction> floodInst = treatment.allInstructions()
-                    .stream()
-                    .filter(i -> i.type().equals(OUTPUT))
-                    .map(i -> (OutputInstruction) i)
-                    .filter(i -> i.port().equals(FLOOD))
-                    .findAny();
-
-            if (floodInst.isPresent() && treatment.allInstructions().size() == 1) {
-                // Only one instruction and is FLOOD. Do the trick.
-                PortNumber inPort = inPacket().receivedFrom().port();
-                deviceService.getPorts(outPacket().sendThrough())
-                        .stream()
-                        .map(Port::number)
-                        .filter(port -> !port.equals(inPort))
-                        .map(outPort -> DefaultTrafficTreatment.builder().setOutput(outPort).build())
-                        .map(outTreatment -> new DefaultOutboundPacket(deviceId, outTreatment, rawData))
-                        .forEach(Bmv2PacketProvider.this::emit);
-            } else {
-                // Not FLOOD treatment, what to do is up to driver.
-                emit(new DefaultOutboundPacket(deviceId, treatment, rawData));
-            }
-        }
-    }
-
-    /**
-     * Internal packet listener to handle packet-in events received from the BMv2 controller.
-     */
-    private class InternalPacketListener implements Bmv2PacketListener {
-
-        @Override
-        public void handlePacketIn(Bmv2Device device, int inputPort, ImmutableByteSequence packet) {
-            Ethernet ethPkt = new Ethernet();
-            ethPkt.deserialize(packet.asArray(), 0, packet.size());
-
-            DeviceId deviceId = device.asDeviceId();
-            ConnectPoint receivedFrom = new ConnectPoint(deviceId, PortNumber.portNumber(inputPort));
-
-            ByteBuffer rawData = ByteBuffer.wrap(packet.asArray());
-
-            InboundPacket inPkt = new DefaultInboundPacket(receivedFrom, ethPkt, rawData);
-            OutboundPacket outPkt = new DefaultOutboundPacket(deviceId, null, rawData);
-
-            PacketContext pktCtx = new Bmv2PacketContext(System.currentTimeMillis(), inPkt, outPkt, false);
-
-            providerService.processPacket(pktCtx);
-        }
-    }
-}
diff --git a/providers/bmv2/packet/src/main/java/org/onosproject/provider/bmv2/packet/impl/package-info.java b/providers/bmv2/packet/src/main/java/org/onosproject/provider/bmv2/packet/impl/package-info.java
deleted file mode 100644
index 3d83ead..0000000
--- a/providers/bmv2/packet/src/main/java/org/onosproject/provider/bmv2/packet/impl/package-info.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-/**
- * Provider that use Thrift as a mean of listening for packet-ins and emitting packet-outs.
- */
-package org.onosproject.provider.bmv2.packet.impl;
\ No newline at end of file
diff --git a/providers/bmv2/pom.xml b/providers/bmv2/pom.xml
deleted file mode 100644
index ef5a3b3..0000000
--- a/providers/bmv2/pom.xml
+++ /dev/null
@@ -1,40 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  ~ Copyright 2016-present Open Networking Laboratory
-  ~
-  ~ 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.
-  -->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0"
-         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <parent>
-        <artifactId>onos-providers</artifactId>
-        <groupId>org.onosproject</groupId>
-        <version>1.11.0-SNAPSHOT</version>
-    </parent>
-
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>onos-bmv2-providers</artifactId>
-    <packaging>pom</packaging>
-
-    <description>ONOS BMv2 providers</description>
-
-    <modules>
-        <module>app</module>
-        <module>device</module>
-        <module>packet</module>
-    </modules>
-
-</project>
\ No newline at end of file
diff --git a/providers/pom.xml b/providers/pom.xml
index 639c123..ea91290 100644
--- a/providers/pom.xml
+++ b/providers/pom.xml
@@ -45,7 +45,6 @@
         <module>lldpcommon</module>
         <module>lldp</module>
         <module>netcfglinks</module>
-        <module>bmv2</module>
         <module>isis</module>
         <module>lisp</module>
         <module>ospf</module>
diff --git a/tools/build/conf/src/main/resources/onos/suppressions.xml b/tools/build/conf/src/main/resources/onos/suppressions.xml
index c2922fb..a40ce9c 100644
--- a/tools/build/conf/src/main/resources/onos/suppressions.xml
+++ b/tools/build/conf/src/main/resources/onos/suppressions.xml
@@ -47,9 +47,6 @@
               files=".*/thirdparty/.*.java"/>
 
     <suppress checks="Javadoc.*"
-              files=".*/protocols/bmv2/.*.java"/>
-
-    <suppress checks="Javadoc.*"
               files=".*/kafkaintegration/.*.java"/>
 
     <suppress checks="Javadoc.*"
diff --git a/tools/build/onos-validate-change-version.excludes b/tools/build/onos-validate-change-version.excludes
index 88bf63f..a064421 100755
--- a/tools/build/onos-validate-change-version.excludes
+++ b/tools/build/onos-validate-change-version.excludes
@@ -31,9 +31,7 @@
 \./protocols/snmp/
 \./protocols/restconf
 \./providers/snmp/
-\./providers/bmv2/
 \./providers/ietfte/
-\./drivers/bmv2/
 \./apps/kafka-integration/
 \./pom.xml.versionsBackup
 \./tools/build/buck-publish-api