diff --git a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
index d88a296..7c229b6 100644
--- a/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/apps/forwarding/Forwarding.java
@@ -36,7 +36,6 @@
 import net.onrc.onos.core.topology.Port;
 import net.onrc.onos.core.topology.Switch;
 import net.onrc.onos.core.topology.Topology;
-import net.onrc.onos.core.util.FlowPath;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 
@@ -48,7 +47,7 @@
 import com.google.common.collect.ListMultimap;
 
 public class Forwarding implements /*IOFMessageListener,*/ IFloodlightModule,
-        IForwardingService, IPacketListener, ChangedListener {
+        IPacketListener, ChangedListener {
     private static final Logger log = LoggerFactory.getLogger(Forwarding.class);
 
     private static final int SLEEP_TIME_FOR_DB_HOST_INSTALLED = 100; // milliseconds
@@ -60,8 +59,6 @@
     private static final ScheduledExecutorService EXECUTOR_SERVICE =
             Executors.newScheduledThreadPool(NUMBER_OF_THREAD_FOR_EXECUTOR);
 
-    private final String callerId = "Forwarding";
-
     private final HighLevelIntentChangedHandler highLevelIntentChangedHandler =
             new HighLevelIntentChangedHandler();
 
@@ -171,18 +168,12 @@
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
-        List<Class<? extends IFloodlightService>> services =
-                new ArrayList<Class<? extends IFloodlightService>>(1);
-        services.add(IForwardingService.class);
-        return services;
+        return null;
     }
 
     @Override
     public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
-        Map<Class<? extends IFloodlightService>, IFloodlightService> impls =
-                new HashMap<Class<? extends IFloodlightService>, IFloodlightService>(1);
-        impls.put(IForwardingService.class, this);
-        return impls;
+        return null;
     }
 
     @Override
@@ -471,14 +462,6 @@
         pathRuntime.executeIntentOperations(operations);
     }
 
-    @Override
-    public void flowsInstalled(Collection<FlowPath> installedFlowPaths) {
-    }
-
-    @Override
-    public void flowRemoved(FlowPath removedFlowPath) {
-    }
-
     public void flowRemoved(ShortestPathIntent spfIntent) {
         if (log.isTraceEnabled()) {
             log.trace("ShortestPathIntent {} was removed", spfIntent.getId());
diff --git a/src/main/java/net/onrc/onos/apps/forwarding/IForwardingService.java b/src/main/java/net/onrc/onos/apps/forwarding/IForwardingService.java
deleted file mode 100644
index e8a8d7a..0000000
--- a/src/main/java/net/onrc/onos/apps/forwarding/IForwardingService.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package net.onrc.onos.apps.forwarding;
-
-import java.util.Collection;
-
-import net.floodlightcontroller.core.module.IFloodlightService;
-import net.onrc.onos.core.util.FlowPath;
-
-/**
- * Temporary interface that allows the Forwarding module to be
- * notified when a flow has been installed.
- * <p/>
- * This should be refactored to a listener framework in the future.
- */
-public interface IForwardingService extends IFloodlightService {
-    /**
-     * Notify the Forwarding module that a collection of flows has been
-     * installed in the network.
-     *
-     * @param installedFlowPaths the collection of FlowPaths that have
-     *                           been installed in the network.
-     */
-    public void flowsInstalled(Collection<FlowPath> installedFlowPaths);
-
-    /**
-     * Notify the Forwarding module that a flow has expired and been
-     * removed from the network.
-     *
-     * @param removedFlowPath The FlowPath that was removed
-     */
-    public void flowRemoved(FlowPath removedFlowPath);
-}
diff --git a/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java b/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
index 49128ea..7118f71 100644
--- a/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
+++ b/src/main/java/net/onrc/onos/apps/sdnip/SdnIp.java
@@ -36,21 +36,8 @@
 import net.onrc.onos.core.intent.runtime.IPathCalcRuntimeService;
 import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService;
 import net.onrc.onos.core.main.config.IConfigInfoService;
-import net.onrc.onos.core.packet.Ethernet;
-import net.onrc.onos.core.packet.IPv4;
 import net.onrc.onos.core.registry.IControllerRegistryService;
-import net.onrc.onos.core.util.CallerId;
-import net.onrc.onos.core.util.DataPath;
 import net.onrc.onos.core.util.Dpid;
-import net.onrc.onos.core.util.FlowEntryAction;
-import net.onrc.onos.core.util.FlowEntryActions;
-import net.onrc.onos.core.util.FlowEntryMatch;
-import net.onrc.onos.core.util.FlowId;
-import net.onrc.onos.core.util.FlowPath;
-import net.onrc.onos.core.util.FlowPathFlags;
-import net.onrc.onos.core.util.FlowPathType;
-import net.onrc.onos.core.util.FlowPathUserState;
-import net.onrc.onos.core.util.IPv4Net;
 import net.onrc.onos.core.util.PortNumber;
 import net.onrc.onos.core.util.SwitchPort;
 import net.sf.json.JSONArray;
@@ -67,7 +54,6 @@
 import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.HashMultimap;
-import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.SetMultimap;
 import com.google.common.net.InetAddresses;
@@ -81,7 +67,6 @@
         IArpRequester, IOFSwitchListener, IConfigInfoService {
 
     private static final Logger log = LoggerFactory.getLogger(SdnIp.class);
-    private final CallerId callerId = new CallerId("SDNIP");
 
     private IFloodlightProviderService floodlightProvider;
     private ILinkDiscoveryService linkDiscoveryService;
@@ -151,7 +136,7 @@
     private Map<InetAddress, Path> pushedPaths;
     private Map<Prefix, Path> prefixToPath;
     // private Multimap<Prefix, PushedFlowMod> pushedFlows;
-    private Multimap<Prefix, FlowId> pushedFlowIds;
+    //private Multimap<Prefix, FlowId> pushedFlowIds;
 
     // XXX FlowCache has been removed
     //private FlowCache flowCache;
@@ -297,7 +282,7 @@
         pushedPaths = new HashMap<>();
         prefixToPath = new HashMap<>();
         // pushedFlows = HashMultimap.<Prefix, PushedFlowMod>create();
-        pushedFlowIds = HashMultimap.create();
+        // pushedFlowIds = HashMultimap.create();
 
         //flowCache = new FlowCache(floodlightProvider);
 
@@ -532,6 +517,7 @@
         log.debug("Adding flows for prefix {}, next hop mac {}",
                 prefix, nextHopMacAddress);
 
+        /*
         FlowPath flowPath = new FlowPath();
         flowPath.setInstallerId(callerId);
 
@@ -585,9 +571,9 @@
             flowEntryMatch.enableDstIPv4Net(dstIPv4Net);
             flowPath.setFlowEntryMatch(flowEntryMatch);
 
-            /*
+             *
              * Create the Flow Entry Action(s): dst-MAC rewrite action
-             */
+             *
             FlowEntryActions flowEntryActions = new FlowEntryActions();
             FlowEntryAction flowEntryAction1 = new FlowEntryAction();
             flowEntryAction1.setActionSetEthernetDstAddr(nextHopMacAddress);
@@ -610,8 +596,9 @@
 
                 pushedFlowIds.put(prefix, flowPath.flowId());
             }
-            */
+
         }
+        */
     }
 
     private void processRibDelete(RibUpdate update) {
@@ -667,7 +654,7 @@
         // removeAll() statement should be replaced with the second removeAll()
         // statement.
         //
-        pushedFlowIds.removeAll(prefix);
+        // pushedFlowIds.removeAll(prefix);
         /*
         Collection<FlowId> flowIds = pushedFlowIds.removeAll(prefix);
         for (FlowId flowId : flowIds) {
@@ -764,11 +751,12 @@
     }
 
     private void calculateAndPushPath(Path path, MACAddress dstMacAddress) {
-        Interface dstInterface = path.getDstInterface();
+        // Interface dstInterface = path.getDstInterface();
 
         log.debug("Setting up path to {}, {}", path.getDstIpAddress().getHostAddress(),
                 dstMacAddress);
 
+        /*
         FlowPath flowPath = new FlowPath();
 
         flowPath.setInstallerId(callerId);
@@ -818,7 +806,7 @@
             // Entries
             log.debug("FlowPath of MAC based forwarding: {}", flowPath.toString());
             // TODO: Add the flow by using the new Path Intent framework
-            /*
+
             if (flowManagerService.addFlow(flowPath) == null) {
                 log.error("Failed to set up MAC based forwarding path to {}, {}",
                         path.getDstIpAddress().getHostAddress(),dstMacAddress);
@@ -827,8 +815,9 @@
                 log.debug("Successfully set up MAC based forwarding path to {}, {}",
                         path.getDstIpAddress().getHostAddress(),dstMacAddress);
             }
-            */
+
         }
+        */
     }
 
     @Override
@@ -892,210 +881,6 @@
         pathRuntime.executeIntentOperations(operations);
     }
 
-    /*
-     * Proactively install all BGP traffic paths from BGP host attachment point
-     * in SDN network to all the virtual gateways to BGP peers in other networks.
-     */
-    private void setupBgpPaths() {
-
-        for (BgpPeer bgpPeer : bgpPeers.values()) {
-
-            FlowPath flowPath = new FlowPath();
-            flowPath.setInstallerId(callerId);
-
-            // Set flowPath FlowPathType and FlowPathUserState
-            flowPath.setFlowPathType(FlowPathType.FP_TYPE_SHORTEST_PATH);
-            flowPath.setFlowPathUserState(FlowPathUserState.FP_USER_ADD);
-
-            // Install flow paths between BGPd and its peers
-            // There is no need to set the FlowPathFlags
-            flowPath.setFlowPathFlags(new FlowPathFlags(0));
-
-            Interface peerInterface = interfaces.get(bgpPeer.getInterfaceName());
-            // Create the Flow Path Match condition(s)
-            FlowEntryMatch flowEntryMatch = new FlowEntryMatch();
-            flowEntryMatch.enableEthernetFrameType(Ethernet.TYPE_IPV4);
-
-            // Match both source address and dest address
-            IPv4Net dstIPv4Net = new IPv4Net(bgpPeer.getIpAddress().getHostAddress()
-                    + "/32");
-
-            flowEntryMatch.enableDstIPv4Net(dstIPv4Net);
-
-            IPv4Net srcIPv4Net = new IPv4Net(peerInterface.getIpAddress()
-                    .getHostAddress() + "/32");
-            flowEntryMatch.enableSrcIPv4Net(srcIPv4Net);
-
-            // Match TCP protocol
-            flowEntryMatch.enableIpProto(IPv4.PROTOCOL_TCP);
-
-            // Match destination TCP port
-            flowEntryMatch.enableDstTcpUdpPort(BGP_PORT);
-            flowPath.setFlowEntryMatch(flowEntryMatch);
-
-            /**
-             * Create the DataPath: BGP -> BGP peer
-             */
-            // Flow path for src-TCP-port
-            DataPath dataPath = new DataPath();
-
-            SwitchPort srcPort =
-                    new SwitchPort(bgpdAttachmentPoint.dpid(),
-                            bgpdAttachmentPoint.port());
-            dataPath.setSrcPort(srcPort);
-
-            SwitchPort dstPort =
-                    new SwitchPort(new Dpid(peerInterface.getDpid()),
-                            new PortNumber(peerInterface.getSwitchPort().port()));
-            dataPath.setDstPort(dstPort);
-
-            flowPath.setDataPath(dataPath);
-
-            // TODO: Add the flow by using the new Path Intent framework
-            /*
-            if (flowManagerService.addFlow(flowPath) == null) {
-                log.error("Failed to set up path BGP -> peer {}"+"; dst-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            else {
-                log.debug("Successfully set up path BGP -> peer {}"+"; dst-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            */
-
-            // Disable dst-TCP-port, and set src-TCP-port
-            flowEntryMatch.disableDstTcpUdpPort();
-            flowEntryMatch.enableSrcTcpUdpPort(BGP_PORT);
-            flowPath.setFlowEntryMatch(flowEntryMatch);
-
-            // Create a new FlowId
-            flowPath.setFlowId(new FlowId());
-
-            // TODO: Add the flow by using the new Path Intent framework
-            /*
-            if (flowManagerService.addFlow(flowPath) == null) {
-                log.error("Failed to set up path BGP -> Peer {}" + "; src-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            else {
-                log.debug("Successfully set up path BGP -> Peer {}" + "; src-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            */
-
-            /**
-             * Create the DataPath: BGP <-BGP peer
-             */
-            // Reversed BGP flow path for src-TCP-port
-            flowPath.setFlowId(new FlowId());
-
-            DataPath reverseDataPath = new DataPath();
-
-            SwitchPort reverseDstPort =
-                    new SwitchPort(bgpdAttachmentPoint.dpid(),
-                            bgpdAttachmentPoint.port());
-            reverseDataPath.setDstPort(reverseDstPort);
-
-            SwitchPort reverseSrcPort =
-                    new SwitchPort(new Dpid(peerInterface.getDpid()),
-                            new PortNumber(peerInterface.getSwitchPort().port()));
-            reverseDataPath.setSrcPort(reverseSrcPort);
-            flowPath.setDataPath(reverseDataPath);
-
-            // Reverse the dst IP and src IP addresses
-            flowEntryMatch.enableDstIPv4Net(srcIPv4Net);
-            flowEntryMatch.enableSrcIPv4Net(dstIPv4Net);
-            flowPath.setFlowEntryMatch(flowEntryMatch);
-
-            log.debug("Reversed BGP FlowPath: {}", flowPath.toString());
-
-            // TODO: Add the flow by using the new Path Intent framework
-            /*
-            if (flowManagerService.addFlow(flowPath) == null) {
-
-                log.error("Failed to set up path BGP <- Peer {}" + "; src-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            else {
-                log.debug("Successfully set up path BGP <- Peer {}" + "; src-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            */
-
-            // Reversed BGP flow path for dst-TCP-port
-            flowPath.setFlowId(new FlowId());
-
-            // Disable src-TCP-port, and set the dst-TCP-port
-            flowEntryMatch.disableSrcTcpUdpPort();
-            flowEntryMatch.enableDstTcpUdpPort(BGP_PORT);
-            flowPath.setFlowEntryMatch(flowEntryMatch);
-
-            log.debug("Reversed BGP FlowPath: {}", flowPath.toString());
-
-            // TODO: Add the flow by using the new Path Intent framework
-            /*
-            if (flowManagerService.addFlow(flowPath) == null) {
-                log.error("Failed to setting up path BGP <- Peer {}" + "; dst-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            else {
-                log.debug("Successfully setting up path BGP <- Peer {}" + "; dst-TCP-port:179",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            */
-
-            /**
-             * ICMP paths between BGPd and its peers
-             */
-            // match ICMP protocol BGP <- Peer
-            flowPath.setFlowId(new FlowId());
-
-            flowEntryMatch.enableIpProto(IPv4.PROTOCOL_ICMP);
-            flowEntryMatch.disableSrcTcpUdpPort();
-            flowEntryMatch.disableDstTcpUdpPort();
-
-            flowPath.setFlowEntryMatch(flowEntryMatch);
-
-            flowPath.setDataPath(reverseDataPath);
-
-            log.debug("Reversed ICMP FlowPath: {}", flowPath.toString());
-
-            // TODO: Add the flow by using the new Path Intent framework
-            /*
-            if (flowManagerService.addFlow(flowPath) == null) {
-
-                log.error("Failed to set up ICMP path BGP <- Peer {}",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            else {
-                log.debug("Successfully set up ICMP path BGP <- Peer {}",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            */
-
-            // match ICMP protocol BGP -> Peer
-            flowPath.setFlowId(new FlowId());
-            flowEntryMatch.enableDstIPv4Net(dstIPv4Net);
-            flowEntryMatch.enableSrcIPv4Net(srcIPv4Net);
-            flowPath.setFlowEntryMatch(flowEntryMatch);
-            flowPath.setDataPath(dataPath);
-            log.debug("ICMP flowPath: {}", flowPath.toString());
-
-            // TODO: Add the flow by using the new Path Intent framework
-            /*
-            if (flowManagerService.addFlow(flowPath) == null) {
-
-                log.error("Failed to set up ICMP path BGP -> Peer {}",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            else {
-                log.debug("Successfully set up ICMP path BGP -> Peer {}",
-                        bgpPeer.getIpAddress().getHostAddress());
-            }
-            */
-        }
-    }
-
     @Override
     public void arpResponse(InetAddress ipAddress, MACAddress macAddress) {
         log.debug("Received ARP response: {} => {}",
@@ -1251,7 +1036,7 @@
         /*setupArpFlows();
         setupDefaultDropFlows();*/
 
-        setupBgpPaths();
+        //setupBgpPaths();
         setupFullMesh();
 
         // Suppress link discovery on external-facing router ports
diff --git a/src/main/java/net/onrc/onos/core/datagrid/web/DatagridWebRoutable.java b/src/main/java/net/onrc/onos/core/datagrid/web/DatagridWebRoutable.java
index c59cd87..8637d3b 100644
--- a/src/main/java/net/onrc/onos/core/datagrid/web/DatagridWebRoutable.java
+++ b/src/main/java/net/onrc/onos/core/datagrid/web/DatagridWebRoutable.java
@@ -19,7 +19,6 @@
         router.attach("/add/intents/json", IntentResource.class);
         router.attach("/get/intent/{intent_id}/json", IntentResource.class);
         router.attach("/get/ng-events/json", GetNGEventsResource.class);
-        router.attach("/get/ng-flows/summary/json", GetNGFlowsSummaryResource.class);
         router.attach("/get/intents/{category}/json", IntentResource.class);
         router.attach("/get/intent/{category}/{intent_id}/json", IntentResource.class);
         router.attach("/delete/intents/json", IntentResource.class);
diff --git a/src/main/java/net/onrc/onos/core/datagrid/web/GetNGFlowsSummaryResource.java b/src/main/java/net/onrc/onos/core/datagrid/web/GetNGFlowsSummaryResource.java
deleted file mode 100644
index da30293..0000000
--- a/src/main/java/net/onrc/onos/core/datagrid/web/GetNGFlowsSummaryResource.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package net.onrc.onos.core.datagrid.web;
-
-import java.util.ArrayList;
-import java.util.SortedMap;
-import java.util.TreeMap;
-
-import net.onrc.onos.core.intent.Intent;
-import net.onrc.onos.core.intent.Intent.IntentState;
-import net.onrc.onos.core.intent.IntentMap;
-import net.onrc.onos.core.intent.Path;
-import net.onrc.onos.core.intent.PathIntent;
-import net.onrc.onos.core.intent.ShortestPathIntent;
-import net.onrc.onos.core.intent.runtime.IPathCalcRuntimeService;
-import net.onrc.onos.core.topology.LinkEvent;
-import net.onrc.onos.core.util.CallerId;
-import net.onrc.onos.core.util.Dpid;
-import net.onrc.onos.core.util.FlowEntry;
-import net.onrc.onos.core.util.FlowId;
-import net.onrc.onos.core.util.FlowPath;
-import net.onrc.onos.core.util.FlowPathType;
-import net.onrc.onos.core.util.FlowPathUserState;
-import net.onrc.onos.core.util.PortNumber;
-import net.onrc.onos.core.util.SwitchPort;
-
-import org.restlet.resource.Get;
-import org.restlet.resource.ServerResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * REST API call to get a summary of Flow Paths.
- * <p/>
- * NOTE: This REST API call is needed for the ONOS GUI.
- * <p/>
- * GET /wm/onos/datagrid/get/ng-flows/summary/json
- */
-public class GetNGFlowsSummaryResource extends ServerResource {
-    public static final Logger log = LoggerFactory.getLogger(GetNGFlowsSummaryResource.class);
-
-    @Get("json")
-    public ArrayList<FlowPath> retrieve() {
-        ArrayList<FlowPath> result = new ArrayList<>();
-        SortedMap<Long, FlowPath> sortedFlowPaths = new TreeMap<>();
-
-        IPathCalcRuntimeService pathRuntime =
-                (IPathCalcRuntimeService) getContext().
-                        getAttributes().get(IPathCalcRuntimeService.class.getCanonicalName());
-        log.debug("Get NG Flows Summary");
-
-
-        IntentMap parentIntentMap = pathRuntime.getHighLevelIntents();
-        IntentMap intentMap = pathRuntime.getPathIntents();
-        for (Intent parentIntent : parentIntentMap.getAllIntents()) {
-            // Get only installed Shortest Paths
-            if (parentIntent.getState() != IntentState.INST_ACK) {
-                continue;
-            }
-            if (!(parentIntent instanceof ShortestPathIntent)) {
-                continue;
-            }
-            ShortestPathIntent spIntent = (ShortestPathIntent) parentIntent;
-
-            // Get the Path Intent
-            Intent intent = intentMap.getIntent(spIntent.getPathIntentId());
-            if (!(intent instanceof PathIntent)) {
-                continue;
-            }
-            PathIntent pathIntent = (PathIntent) intent;
-
-            // Decode the Shortest Path ID
-            String applnIntentId = parentIntent.getId();
-            String intentId = applnIntentId.split(":")[1];
-
-            // Create the Flow Path
-            FlowId flowId = new FlowId(intentId);
-            FlowPath flowPath = new FlowPath();
-            flowPath.setFlowId(flowId);
-            sortedFlowPaths.put(flowPath.flowId().value(), flowPath);
-
-            flowPath.setInstallerId(new CallerId("E"));
-            flowPath.setFlowEntryActions(null);
-            flowPath.setFlowPathType(FlowPathType.FP_TYPE_SHORTEST_PATH);
-            flowPath.setFlowPathUserState(FlowPathUserState.FP_USER_ADD);
-
-            // Setup the Source and Destination DPID and Port
-            Dpid srcDpid = new Dpid(spIntent.getSrcSwitchDpid());
-            PortNumber srcPort = new PortNumber((short) spIntent.getSrcPortNumber());
-            Dpid dstDpid = new Dpid(spIntent.getDstSwitchDpid());
-            PortNumber dstPort = new PortNumber((short) spIntent.getDstPortNumber());
-            SwitchPort srcSwitchPort = new SwitchPort(srcDpid, srcPort);
-            SwitchPort dstSwitchPort = new SwitchPort(dstDpid, dstPort);
-            flowPath.dataPath().setSrcPort(srcSwitchPort);
-            flowPath.dataPath().setDstPort(dstSwitchPort);
-
-            // Extract the Flow Entries
-            Path path = pathIntent.getPath();
-            FlowEntry flowEntry;
-            ArrayList<FlowEntry> flowEntries = new ArrayList<>();
-            for (LinkEvent linkEvent : path) {
-                Dpid dpid = linkEvent.getSrc().getDpid();
-                flowEntry = new FlowEntry();
-                flowEntry.setDpid(dpid);
-                flowEntries.add(flowEntry);
-            }
-            // Add the final Flow Entry
-            flowEntry = new FlowEntry();
-            flowEntry.setDpid(new Dpid(spIntent.getDstSwitchDpid()));
-            flowEntries.add(flowEntry);
-            flowPath.dataPath().setFlowEntries(flowEntries);
-        }
-
-        // Prepare the return result
-        for (FlowPath flowPath : sortedFlowPaths.values()) {
-            result.add(flowPath);
-        }
-
-        return result;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/intent/Action.java b/src/main/java/net/onrc/onos/core/intent/Action.java
index 8f8c8b2..5d564d6 100644
--- a/src/main/java/net/onrc/onos/core/intent/Action.java
+++ b/src/main/java/net/onrc/onos/core/intent/Action.java
@@ -1,7 +1,5 @@
 package net.onrc.onos.core.intent;
 
-import net.onrc.onos.core.util.FlowEntryAction;
-
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.action.OFAction;
 
@@ -12,13 +10,6 @@
 public abstract class Action {
 
     /**
-     * This function converts the Action into a legacy FlowEntryAction.
-     *
-     * @return an equivalent FlowEntryAction object
-     */
-    public abstract FlowEntryAction getFlowEntryAction();
-
-    /**
      * Builds and returns an OFAction given an OFFactory.
      *
      * @param factory the OFFactory to use for building
diff --git a/src/main/java/net/onrc/onos/core/intent/ForwardAction.java b/src/main/java/net/onrc/onos/core/intent/ForwardAction.java
index a3792d1..9c0a249 100644
--- a/src/main/java/net/onrc/onos/core/intent/ForwardAction.java
+++ b/src/main/java/net/onrc/onos/core/intent/ForwardAction.java
@@ -1,8 +1,5 @@
 package net.onrc.onos.core.intent;
 
-import net.onrc.onos.core.util.FlowEntryAction;
-import net.onrc.onos.core.util.PortNumber;
-
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.action.OFAction;
 import org.projectfloodlight.openflow.types.OFPort;
@@ -33,18 +30,6 @@
         return Long.toString(dstPort);
     }
 
-    /**
-     * Converts the FowardAction into a legacy FlowEntryAction object.
-     *
-     * @return an equivalent FlowEntryAction object
-     */
-    @Override
-    public FlowEntryAction getFlowEntryAction() {
-        FlowEntryAction action = new FlowEntryAction();
-        action.setActionOutput(new PortNumber((short) dstPort));
-        return action;
-    }
-
     @Override
     public OFAction getOFAction(OFFactory factory) {
         return factory.actions().output(OFPort.of((int) dstPort), Short.MAX_VALUE);
diff --git a/src/main/java/net/onrc/onos/core/intent/Match.java b/src/main/java/net/onrc/onos/core/intent/Match.java
index 14d8b92..6397de8 100644
--- a/src/main/java/net/onrc/onos/core/intent/Match.java
+++ b/src/main/java/net/onrc/onos/core/intent/Match.java
@@ -3,11 +3,6 @@
 import java.util.Objects;
 
 import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.core.packet.Ethernet;
-import net.onrc.onos.core.util.FlowEntryMatch;
-import net.onrc.onos.core.util.IPv4;
-import net.onrc.onos.core.util.IPv4Net;
-import net.onrc.onos.core.util.PortNumber;
 
 import org.projectfloodlight.openflow.protocol.OFFactory;
 import org.projectfloodlight.openflow.protocol.match.Match.Builder;
@@ -110,35 +105,6 @@
         }
     }
 
-    /**
-     * Converts the Match into a legacy FlowEntryMatch object.
-     *
-     * @return an equivalent FlowEntryMatch object
-     */
-    public FlowEntryMatch getFlowEntryMatch() {
-        FlowEntryMatch match = new FlowEntryMatch();
-        if (srcMac != null) {
-            match.enableSrcMac(srcMac);
-        }
-        if (dstMac != null) {
-            match.enableDstMac(dstMac);
-        }
-        if (srcIp != ShortestPathIntent.EMPTYIPADDRESS) {
-            match.enableEthernetFrameType(Ethernet.TYPE_IPV4);
-            IPv4 srcIPv4 = new IPv4(srcIp);
-            IPv4Net srcIP = new IPv4Net(srcIPv4, IPV4_PREFIX_LEN);
-            match.enableSrcIPv4Net(srcIP);
-        }
-        if (dstIp != ShortestPathIntent.EMPTYIPADDRESS) {
-            match.enableEthernetFrameType(Ethernet.TYPE_IPV4);
-            IPv4 dstIPv4 = new IPv4(dstIp);
-            IPv4Net dstIP = new IPv4Net(dstIPv4, IPV4_PREFIX_LEN);
-            match.enableDstIPv4Net(dstIP);
-        }
-        match.enableInPort(new PortNumber((short) srcPort));
-        return match;
-    }
-
     public Builder getOFMatchBuilder(OFFactory factory) {
         Builder matchBuilder = factory.buildMatch();
 
diff --git a/src/main/java/net/onrc/onos/core/util/CallerId.java b/src/main/java/net/onrc/onos/core/util/CallerId.java
deleted file mode 100644
index da83241..0000000
--- a/src/main/java/net/onrc/onos/core/util/CallerId.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package net.onrc.onos.core.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing a Caller ID for an ONOS component.
- * This class is immutable.
- */
-public final class CallerId {
-    private final String value;
-
-    /**
-     * Default constructor.
-     */
-    public CallerId() {
-        this.value = null;
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param otherCallerId the caller ID copied from
-     */
-    public CallerId(CallerId otherCallerId) {
-        // Note: make a full copy if we change value to a mutable type
-        value = otherCallerId.value;
-    }
-
-    /**
-     * Constructor from a string value.
-     *
-     * @param value the value to use.
-     */
-    public CallerId(String value) {
-        this.value = value;
-    }
-
-    /**
-     * Get the value of the Caller ID.
-     *
-     * @return the value of the Caller ID.
-     */
-    @JsonProperty("value")
-    public String value() {
-        return value;
-    }
-
-    /**
-     * Convert the Caller ID value to a string.
-     *
-     * @return the Caller ID value to a string.
-     */
-    @Override
-    public String toString() {
-        return value;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof CallerId)) {
-            return false;
-        }
-
-        CallerId otherCallerId = (CallerId) other;
-
-        return value.equals(otherCallerId.value);
-    }
-
-    @Override
-    public int hashCode() {
-        return value.hashCode();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/DataPath.java b/src/main/java/net/onrc/onos/core/util/DataPath.java
deleted file mode 100644
index 3d89e96..0000000
--- a/src/main/java/net/onrc/onos/core/util/DataPath.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package net.onrc.onos.core.util;
-
-import java.util.ArrayList;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The data forwarding path state from a source to a destination.
- */
-public class DataPath {
-    private SwitchPort srcPort;        // The source port
-    private SwitchPort dstPort;        // The destination port
-    private ArrayList<FlowEntry> flowEntries;    // The Flow Entries
-
-    /**
-     * Default constructor.
-     */
-    public DataPath() {
-        srcPort = new SwitchPort();
-        dstPort = new SwitchPort();
-        flowEntries = new ArrayList<FlowEntry>();
-    }
-
-    /**
-     * Get the data path source port.
-     *
-     * @return the data path source port.
-     */
-    @JsonProperty("srcPort")
-    public SwitchPort srcPort() {
-        return srcPort;
-    }
-
-    /**
-     * Set the data path source port.
-     *
-     * @param srcPort the data path source port to set.
-     */
-    @JsonProperty("srcPort")
-    public void setSrcPort(SwitchPort srcPort) {
-        this.srcPort = srcPort;
-    }
-
-    /**
-     * Get the data path destination port.
-     *
-     * @return the data path destination port.
-     */
-    @JsonProperty("dstPort")
-    public SwitchPort dstPort() {
-        return dstPort;
-    }
-
-    /**
-     * Set the data path destination port.
-     *
-     * @param dstPort the data path destination port to set.
-     */
-    @JsonProperty("dstPort")
-    public void setDstPort(SwitchPort dstPort) {
-        this.dstPort = dstPort;
-    }
-
-    /**
-     * Get the data path flow entries.
-     *
-     * @return the data path flow entries.
-     */
-    @JsonProperty("flowEntries")
-    public ArrayList<FlowEntry> flowEntries() {
-        return flowEntries;
-    }
-
-    /**
-     * Set the data path flow entries.
-     *
-     * @param flowEntries the data path flow entries to set.
-     */
-    @JsonProperty("flowEntries")
-    public void setFlowEntries(ArrayList<FlowEntry> flowEntries) {
-        this.flowEntries = flowEntries;
-    }
-
-    /**
-     * Apply Flow Path Flags to the pre-computed Data Path.
-     *
-     * @param flowPathFlags the Flow Path Flags to apply.
-     */
-    public void applyFlowPathFlags(FlowPathFlags flowPathFlags) {
-        if (flowPathFlags == null) {
-            return;        // Nothing to do
-        }
-
-        // Discard the first Flow Entry
-        if (flowPathFlags.isDiscardFirstHopEntry()) {
-            if (flowEntries.size() > 0) {
-                flowEntries.remove(0);
-            }
-        }
-
-        // Keep only the first Flow Entry
-        if (flowPathFlags.isKeepOnlyFirstHopEntry()) {
-            if (flowEntries.size() > 1) {
-                FlowEntry flowEntry = flowEntries.get(0);
-                flowEntries.clear();
-                flowEntries.add(flowEntry);
-            }
-        }
-    }
-
-    /**
-     * Remove Flow Entries that were deleted.
-     */
-    public void removeDeletedFlowEntries() {
-        //
-        // NOTE: We create a new ArrayList, and add only the Flow Entries
-        // that are NOT FE_USER_DELETE.
-        // This is sub-optimal: if it adds notable processing cost,
-        // the Flow Entries container should be changed to LinkedList
-        // or some other container that has O(1) cost of removing an entry.
-        //
-
-        // Test first whether any Flow Entry was deleted
-        boolean foundDeletedFlowEntry = false;
-        for (FlowEntry flowEntry : this.flowEntries) {
-            if (flowEntry.flowEntryUserState() ==
-                    FlowEntryUserState.FE_USER_DELETE) {
-                foundDeletedFlowEntry = true;
-                break;
-            }
-        }
-        if (!foundDeletedFlowEntry) {
-            return;            // Nothing to do
-        }
-
-        // Create a new collection and exclude the deleted flow entries
-        ArrayList<FlowEntry> newFlowEntries = new ArrayList<FlowEntry>();
-        for (FlowEntry flowEntry : this.flowEntries()) {
-            if (flowEntry.flowEntryUserState() !=
-                    FlowEntryUserState.FE_USER_DELETE) {
-                newFlowEntries.add(flowEntry);
-            }
-        }
-        setFlowEntries(newFlowEntries);
-    }
-
-    /**
-     * Convert the data path to a string.
-     * <p/>
-     * The string has the following form:
-     * [src=01:01:01:01:01:01:01:01/1111 flowEntry=<entry1> flowEntry=<entry2>
-     * flowEntry=<entry3> dst=02:02:02:02:02:02:02:02/2222]
-     *
-     * @return the data path as a string.
-     */
-    @Override
-    public String toString() {
-        StringBuilder ret = new StringBuilder();
-
-        ret.append("[src=" + this.srcPort.toString());
-
-        for (FlowEntry fe : flowEntries) {
-            ret.append(" flowEntry=" + fe.toString());
-        }
-        ret.append(" dst=" + this.dstPort.toString() + "]");
-
-        return ret.toString();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/DataPathEndpoints.java b/src/main/java/net/onrc/onos/core/util/DataPathEndpoints.java
deleted file mode 100644
index 4e0d40c..0000000
--- a/src/main/java/net/onrc/onos/core/util/DataPathEndpoints.java
+++ /dev/null
@@ -1,67 +0,0 @@
-package net.onrc.onos.core.util;
-
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Data Path Endpoints.
- * This class is immutable.
- */
-public final class DataPathEndpoints {
-    private final SwitchPort srcPort;        // The source port
-    private final SwitchPort dstPort;        // The destination port
-
-    /**
-     * Default constructor.
-     */
-    public DataPathEndpoints() {
-        srcPort = null;
-        dstPort = null;
-    }
-
-    /**
-     * Constructor for given source and destination ports.
-     *
-     * @param srcPort the source port to use.
-     * @param dstPort the destination port to use.
-     */
-    public DataPathEndpoints(SwitchPort srcPort, SwitchPort dstPort) {
-        this.srcPort = srcPort;
-        this.dstPort = dstPort;
-    }
-
-    /**
-     * Get the data path source port.
-     *
-     * @return the data path source port.
-     */
-    @JsonProperty("srcPort")
-    public SwitchPort srcPort() {
-        return srcPort;
-    }
-
-    /**
-     * Get the data path destination port.
-     *
-     * @return the data path destination port.
-     */
-    @JsonProperty("dstPort")
-    public SwitchPort dstPort() {
-        return dstPort;
-    }
-
-    /**
-     * Convert the data path endpoints to a string.
-     * <p/>
-     * The string has the following form:
-     * [src=01:01:01:01:01:01:01:01/1111 dst=02:02:02:02:02:02:02:02/2222]
-     *
-     * @return the data path endpoints as a string.
-     */
-    @Override
-    public String toString() {
-        String ret = "[src=" + this.srcPort.toString() +
-                " dst=" + this.dstPort.toString() + "]";
-        return ret;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntry.java b/src/main/java/net/onrc/onos/core/util/FlowEntry.java
deleted file mode 100644
index 4d1eb45..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntry.java
+++ /dev/null
@@ -1,483 +0,0 @@
-package net.onrc.onos.core.util;
-
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Flow Entry.
- * <p/>
- * NOTE: The specification is incomplete. E.g., the entry needs to
- * support multiple in-ports and multiple out-ports.
- */
-public class FlowEntry {
-    private FlowId flowId;            // FlowID of the Flow Entry
-    private FlowEntryId flowEntryId;        // The Flow Entry ID
-    private int idleTimeout;        // The Flow idle timeout
-    private int hardTimeout;        // The Flow hard timeout
-    private int priority;        // The Flow priority
-    private FlowEntryMatch flowEntryMatch;    // The Flow Entry Match
-    private FlowEntryActions flowEntryActions;    // The Flow Entry Actions
-    private Dpid dpid;                // The Switch DPID
-    private PortNumber inPort;        // The Switch incoming port. Used only
-    // when the entry is used to return
-    // Shortest Path computation.
-    private PortNumber outPort;        // The Switch outgoing port. Used only
-    // when the entry is used to return
-    // Shortest Path computation.
-    private FlowEntryUserState flowEntryUserState; // The Flow Entry User state
-    private FlowEntrySwitchState flowEntrySwitchState; // The Flow Entry Switch state
-    // The Flow Entry Error state (if FlowEntrySwitchState is FE_SWITCH_FAILED)
-    private FlowEntryErrorState flowEntryErrorState;
-
-    /**
-     * Default constructor.
-     */
-    public FlowEntry() {
-        // TODO: Test code
-    /*
-    MACAddress mac = MACAddress.valueOf("01:02:03:04:05:06");
-    IPv4 ipv4 = new IPv4("1.2.3.4");
-    IPv4Net ipv4net = new IPv4Net("5.6.7.0/24");
-
-    flowEntryMatch = new FlowEntryMatch();
-    flowEntryMatch.enableInPort(new Port((short)10));
-    flowEntryMatch.enableSrcMac(mac);
-    flowEntryMatch.enableDstMac(mac);
-    flowEntryMatch.enableVlanId((short)20);
-    flowEntryMatch.enableVlanPriority((byte)30);
-    flowEntryMatch.enableEthernetFrameType((short)40);
-    flowEntryMatch.enableIpToS((byte)50);
-    flowEntryMatch.enableIpProto((byte)60);
-    flowEntryMatch.enableSrcIPv4Net(ipv4net);
-    flowEntryMatch.enableDstIPv4Net(ipv4net);
-    flowEntryMatch.enableSrcTcpUdpPort((short)70);
-    flowEntryMatch.enableDstTcpUdpPort((short)80);
-
-    FlowEntryAction action = null;
-    FlowEntryActions actions = new FlowEntryActions();
-
-    action = new FlowEntryAction();
-    action.setActionOutput(new Port((short)12));
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionOutputToController((short)13);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetVlanId((short)14);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetVlanPriority((byte)15);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionStripVlan(true);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetEthernetSrcAddr(mac);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetEthernetDstAddr(mac);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetIPv4SrcAddr(ipv4);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetIPv4DstAddr(ipv4);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetIpToS((byte)16);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetTcpUdpSrcPort((short)17);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionSetTcpUdpDstPort((short)18);
-    actions.addAction(action);
-
-    action = new FlowEntryAction();
-    action.setActionEnqueue(new Port((short)19), 20);
-    actions.addAction(action);
-
-    setFlowEntryActions(actions);
-    */
-
-        priority = FlowPath.PRIORITY_DEFAULT;
-        flowEntryActions = new FlowEntryActions();
-        flowEntryUserState = FlowEntryUserState.FE_USER_UNKNOWN;
-        flowEntrySwitchState = FlowEntrySwitchState.FE_SWITCH_UNKNOWN;
-    }
-
-    /**
-     * Get the Flow ID.
-     *
-     * @return the Flow ID.
-     */
-    @JsonIgnore
-    public FlowId flowId() {
-        return flowId;
-    }
-
-    /**
-     * Set the Flow ID.
-     *
-     * @param flowId the Flow ID to set.
-     */
-    public void setFlowId(FlowId flowId) {
-        this.flowId = flowId;
-    }
-
-    /**
-     * Test whether the Flow ID is valid.
-     *
-     * @return true if the Flow ID is valid, otherwise false.
-     */
-    @JsonIgnore
-    public boolean isValidFlowId() {
-        if (this.flowId == null) {
-            return false;
-        }
-        return (this.flowId.isValid());
-    }
-
-    /**
-     * Get the Flow Entry ID.
-     *
-     * @return the Flow Entry ID.
-     */
-    @JsonProperty("flowEntryId")
-    public FlowEntryId flowEntryId() {
-        return flowEntryId;
-    }
-
-    /**
-     * Set the Flow Entry ID.
-     *
-     * @param flowEntryId the Flow Entry ID to set.
-     */
-    @JsonProperty("flowEntryId")
-    public void setFlowEntryId(FlowEntryId flowEntryId) {
-        this.flowEntryId = flowEntryId;
-    }
-
-    /**
-     * Test whether the Flow Entry ID is valid.
-     *
-     * @return true if the Flow Entry ID is valid, otherwise false.
-     */
-    @JsonIgnore
-    public boolean isValidFlowEntryId() {
-        if (this.flowEntryId == null) {
-            return false;
-        }
-        return (this.flowEntryId.isValid());
-    }
-
-    /**
-     * Get the flow idle timeout in seconds.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @return the flow idle timeout.
-     */
-    @JsonProperty("idleTimeout")
-    public int idleTimeout() {
-        return idleTimeout;
-    }
-
-    /**
-     * Set the flow idle timeout in seconds.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @param idleTimeout the flow idle timeout to set.
-     */
-    @JsonProperty("idleTimeout")
-    public void setIdleTimeout(int idleTimeout) {
-        this.idleTimeout = 0xffff & idleTimeout;
-    }
-
-    /**
-     * Get the flow hard timeout in seconds.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @return the flow hard timeout.
-     */
-    @JsonProperty("hardTimeout")
-    public int hardTimeout() {
-        return hardTimeout;
-    }
-
-    /**
-     * Set the flow hard timeout in seconds.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @param hardTimeout the flow hard timeout to set.
-     */
-    @JsonProperty("hardTimeout")
-    public void setHardTimeout(int hardTimeout) {
-        this.hardTimeout = 0xffff & hardTimeout;
-    }
-
-    /**
-     * Get the flow priority.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     *
-     * @return the flow priority.
-     */
-    @JsonProperty("priority")
-    public int priority() {
-        return priority;
-    }
-
-    /**
-     * Set the flow priority.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     *
-     * @param priority the flow priority to set.
-     */
-    @JsonProperty("priority")
-    public void setPriority(int priority) {
-        this.priority = 0xffff & priority;
-    }
-
-    /**
-     * Get the Flow Entry Match.
-     *
-     * @return the Flow Entry Match.
-     */
-    @JsonProperty("flowEntryMatch")
-    public FlowEntryMatch flowEntryMatch() {
-        return flowEntryMatch;
-    }
-
-    /**
-     * Set the Flow Entry Match.
-     *
-     * @param flowEntryMatch the Flow Entry Match to set.
-     */
-    @JsonProperty("flowEntryMatch")
-    public void setFlowEntryMatch(FlowEntryMatch flowEntryMatch) {
-        this.flowEntryMatch = flowEntryMatch;
-    }
-
-    /**
-     * Get the Flow Entry Actions.
-     *
-     * @return the Flow Entry Actions.
-     */
-    @JsonProperty("flowEntryActions")
-    public FlowEntryActions flowEntryActions() {
-        return flowEntryActions;
-    }
-
-    /**
-     * Set the Flow Entry Actions.
-     *
-     * @param flowEntryActions the Flow Entry Actions to set.
-     */
-    @JsonProperty("flowEntryActions")
-    public void setFlowEntryActions(FlowEntryActions flowEntryActions) {
-        this.flowEntryActions = flowEntryActions;
-    }
-
-    /**
-     * Get the Switch DPID.
-     *
-     * @return the Switch DPID.
-     */
-    @JsonProperty("dpid")
-    public Dpid dpid() {
-        return dpid;
-    }
-
-    /**
-     * Set the Switch DPID.
-     *
-     * @param dpid the Switch DPID to set.
-     */
-    @JsonProperty("dpid")
-    public void setDpid(Dpid dpid) {
-        this.dpid = dpid;
-    }
-
-    /**
-     * Get the Switch incoming port.
-     * <p/>
-     * Used only when the entry is used to return Shortest Path computation.
-     *
-     * @return the Switch incoming port.
-     */
-    @JsonProperty("inPort")
-    public PortNumber inPort() {
-        return inPort;
-    }
-
-    /**
-     * Set the Switch incoming port.
-     * <p/>
-     * Used only when the entry is used to return Shortest Path computation.
-     *
-     * @param inPort the Switch incoming port to set.
-     */
-    @JsonProperty("inPort")
-    public void setInPort(PortNumber inPort) {
-        this.inPort = inPort;
-    }
-
-    /**
-     * Get the Switch outgoing port.
-     * <p/>
-     * Used only when the entry is used to return Shortest Path computation.
-     *
-     * @return the Switch outgoing port.
-     */
-    @JsonProperty("outPort")
-    public PortNumber outPort() {
-        return outPort;
-    }
-
-    /**
-     * Set the Switch outgoing port.
-     * <p/>
-     * Used only when the entry is used to return Shortest Path computation.
-     *
-     * @param outPort the Switch outgoing port to set.
-     */
-    @JsonProperty("outPort")
-    public void setOutPort(PortNumber outPort) {
-        this.outPort = outPort;
-    }
-
-    /**
-     * Get the Flow Entry User state.
-     *
-     * @return the Flow Entry User state.
-     */
-    @JsonProperty("flowEntryUserState")
-    public FlowEntryUserState flowEntryUserState() {
-        return flowEntryUserState;
-    }
-
-    /**
-     * Set the Flow Entry User state.
-     *
-     * @param flowEntryUserState the Flow Entry User state to set.
-     */
-    @JsonProperty("flowEntryUserState")
-    public void setFlowEntryUserState(FlowEntryUserState flowEntryUserState) {
-        this.flowEntryUserState = flowEntryUserState;
-    }
-
-    /**
-     * Get the Flow Entry Switch state.
-     * <p/>
-     * The Flow Entry Error state is used if FlowEntrySwitchState is
-     * FE_SWITCH_FAILED.
-     *
-     * @return the Flow Entry Switch state.
-     */
-    @JsonProperty("flowEntrySwitchState")
-    public FlowEntrySwitchState flowEntrySwitchState() {
-        return flowEntrySwitchState;
-    }
-
-    /**
-     * Set the Flow Entry Switch state.
-     * <p/>
-     * The Flow Entry Error state is used if FlowEntrySwitchState is
-     * FE_SWITCH_FAILED.
-     *
-     * @param flowEntrySwitchState the Flow Entry Switch state to set.
-     */
-    @JsonProperty("flowEntrySwitchState")
-    public void setFlowEntrySwitchState(FlowEntrySwitchState flowEntrySwitchState) {
-        this.flowEntrySwitchState = flowEntrySwitchState;
-    }
-
-    /**
-     * Get the Flow Entry Error state.
-     *
-     * @return the Flow Entry Error state.
-     */
-    @JsonProperty("flowEntryErrorState")
-    public FlowEntryErrorState flowEntryErrorState() {
-        return flowEntryErrorState;
-    }
-
-    /**
-     * Set the Flow Entry Error state.
-     *
-     * @param flowEntryErrorState the Flow Entry Error state to set.
-     */
-    @JsonProperty("flowEntryErrorState")
-    public void setFlowEntryErrorState(FlowEntryErrorState flowEntryErrorState) {
-        this.flowEntryErrorState = flowEntryErrorState;
-    }
-
-    /**
-     * Convert the flow entry to a string.
-     * <p/>
-     * The string has the following form:
-     * [flowEntryId=XXX idleTimeout=XXX hardTimeout=XXX priority=XXX
-     * flowEntryMatch=XXX flowEntryActions=XXX dpid=XXX
-     * inPort=XXX outPort=XXX flowEntryUserState=XXX flowEntrySwitchState=XXX
-     * flowEntryErrorState=XXX]
-     *
-     * @return the flow entry as a string.
-     */
-    @Override
-    public String toString() {
-        StringBuilder ret = new StringBuilder();
-        if (flowEntryId != null) {
-            ret.append("[flowEntryId=" + this.flowEntryId.toString());
-        } else {
-            ret.append("[");
-        }
-        if (flowId != null) {
-            ret.append(" flowId=" + this.flowId.toString());
-        }
-        ret.append(" idleTimeout=" + this.idleTimeout);
-        ret.append(" hardTimeout=" + this.hardTimeout);
-        ret.append(" priority=" + this.priority);
-        if (flowEntryMatch != null) {
-            ret.append(" flowEntryMatch=" + this.flowEntryMatch.toString());
-        }
-        ret.append(" flowEntryActions=" + this.flowEntryActions.toString());
-        if (dpid != null) {
-            ret.append(" dpid=" + this.dpid.toString());
-        }
-        if (inPort != null) {
-            ret.append(" inPort=" + this.inPort.toString());
-        }
-        if (outPort != null) {
-            ret.append(" outPort=" + this.outPort.toString());
-        }
-        ret.append(" flowEntryUserState=" + this.flowEntryUserState);
-        ret.append(" flowEntrySwitchState=" + this.flowEntrySwitchState);
-        if (flowEntryErrorState != null) {
-            ret.append(" flowEntryErrorState=" + this.flowEntryErrorState.toString());
-        }
-        ret.append("]");
-
-        return ret.toString();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntryAction.java b/src/main/java/net/onrc/onos/core/util/FlowEntryAction.java
deleted file mode 100644
index 0cc1d6d..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntryAction.java
+++ /dev/null
@@ -1,1724 +0,0 @@
-package net.onrc.onos.core.util;
-
-import net.floodlightcontroller.util.MACAddress;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.projectfloodlight.openflow.types.OFPort;
-
-/**
- * The class representing a single Flow Entry action.
- * <p/>
- * A Flow Entry action that needs to be applied to each packet.
- * Note that it contains only a single action. Multiple actions are
- * listed in a list inside @ref FlowEntryActions.
- */
-public class FlowEntryAction {
-    /**
-     * Special action values.
-     * <p/>
-     * Those values are taken as-is from the OpenFlow-v1.0.0 specification
-     * (pp 21-22).
-     */
-    public enum ActionValues {
-        ACTION_OUTPUT((short) 0x0),    // Output to switch port
-        ACTION_SET_VLAN_VID((short) 0x1),    // Set the 802.1q VLAN id
-        ACTION_SET_VLAN_PCP((short) 0x2),    // Set the 802.1q priority
-        ACTION_STRIP_VLAN((short) 0x3),    // Strip the 802.1q header
-        ACTION_SET_DL_SRC((short) 0x4),    // Ethernet source address
-        ACTION_SET_DL_DST((short) 0x5),    // Ethernet destination address
-        ACTION_SET_NW_SRC((short) 0x6),    // IP source address
-        ACTION_SET_NW_DST((short) 0x7),    // IP destination address
-        ACTION_SET_NW_TOS((short) 0x8),    // IP ToS (DSCP field, 6 bits)
-        ACTION_SET_TP_SRC((short) 0x9),    // TCP/UDP source port
-        ACTION_SET_TP_DST((short) 0xa),    // TCP/UDP destination port
-        ACTION_ENQUEUE((short) 0xb),    // Output to queue on port
-        ACTION_VENDOR((short) 0xffff); // Vendor-specific
-
-        private final short value;    // The value
-
-        /**
-         * Constructor for a given value.
-         *
-         * @param value the value to use for the initialization.
-         */
-        private ActionValues(short value) {
-            this.value = value;
-        }
-
-        /**
-         * Get the value.
-         *
-         * @return the value.
-         */
-        public short getValue() {
-            return value;
-        }
-    }
-
-    /**
-     * Action structure for ACTION_OUTPUT: Output to switch port.
-     */
-    public static class ActionOutput {
-        private PortNumber port;    // Output port
-        private short maxLen;    // Max. length (in bytes) to send to controller
-        // if the port is set to PORT_CONTROLLER
-
-        /**
-         * Default constructor.
-         */
-        public ActionOutput() {
-            this.port = null;
-            this.maxLen = 0;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionOutput(ActionOutput other) {
-            if (other.port != null) {
-                this.port = new PortNumber(other.port);
-            }
-            this.maxLen = other.maxLen;
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX maxLen=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionOutput(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given output port and maximum length.
-         *
-         * @param port   the output port to set.
-         * @param maxLen the maximum length (in bytes) to send to controller
-         *               if the port is set to PORT_CONTROLLER.
-         */
-        public ActionOutput(PortNumber port, short maxLen) {
-            this.port = port;
-            this.maxLen = maxLen;
-        }
-
-        /**
-         * Constructor for a given output port.
-         *
-         * @param port the output port to set.
-         */
-        public ActionOutput(PortNumber port) {
-            this.port = port;
-            this.maxLen = 0;
-        }
-
-        /**
-         * Get the output port.
-         *
-         * @return the output port.
-         */
-        @JsonProperty("port")
-        public PortNumber port() {
-            return this.port;
-        }
-
-        /**
-         * Get the maximum length (in bytes) to send to controller if the
-         * port is set to PORT_CONTROLLER.
-         *
-         * @return the maximum length (in bytes) to send to controller if the
-         * port is set to PORT_CONTROLLER.
-         */
-        @JsonProperty("maxLen")
-        public short maxLen() {
-            return this.maxLen;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX maxLen=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "port=" + port.toString();
-            ret += " maxLen=" + maxLen;
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX maxLen=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split(" ");
-            String decode = null;
-
-            // Decode the "port=XXX" part
-            if (parts.length > 0) {
-                decode = parts[0];
-            }
-            if (decode != null) {
-                String[] tokens = decode.split("port=");
-                if (tokens.length > 1 && tokens[1] != null) {
-                    try {
-                        port = new PortNumber(tokens[1]);
-                    } catch (NumberFormatException e) {
-                        throw new IllegalArgumentException("Invalid action string");
-                    }
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-
-            // Decode the "maxLen=XXX" part
-            decode = null;
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                String[] tokens = decode.split("maxLen=");
-                if (tokens.length > 1 && tokens[1] != null) {
-                    try {
-                        maxLen = Short.valueOf(tokens[1]);
-                    } catch (NumberFormatException e) {
-                        throw new IllegalArgumentException("Invalid action string");
-                    }
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_SET_VLAN_VID: Set the 802.1q VLAN id.
-     */
-    public static class ActionSetVlanId {
-        private short vlanId;        // The VLAN ID to set
-
-        /**
-         * Default constructor.
-         */
-        public ActionSetVlanId() {
-            this.vlanId = 0;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionSetVlanId(ActionSetVlanId other) {
-            this.vlanId = other.vlanId;
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [vlanId=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionSetVlanId(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given VLAN ID.
-         *
-         * @param vlanId the VLAN ID to set.
-         */
-        public ActionSetVlanId(short vlanId) {
-            this.vlanId = vlanId;
-        }
-
-        /**
-         * Get the VLAN ID.
-         *
-         * @return the VLAN ID.
-         */
-        @JsonProperty("vlanId")
-        public short vlanId() {
-            return this.vlanId;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [vlanId=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "vlanId=" + this.vlanId;
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [vlanId=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split("vlanId=");
-            String decode = null;
-
-            // Decode the value
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                try {
-                    vlanId = Short.valueOf(decode);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException("Invalid action string");
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_SET_VLAN_PCP: Set the 802.1q priority.
-     */
-    public static class ActionSetVlanPriority {
-        private byte vlanPriority;    // The VLAN priority to set
-
-        /**
-         * Default constructor.
-         */
-        public ActionSetVlanPriority() {
-            this.vlanPriority = 0;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionSetVlanPriority(ActionSetVlanPriority other) {
-            this.vlanPriority = other.vlanPriority;
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [vlanPriority=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionSetVlanPriority(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given VLAN priority.
-         *
-         * @param vlanPriority the VLAN priority to set.
-         */
-        public ActionSetVlanPriority(byte vlanPriority) {
-            this.vlanPriority = vlanPriority;
-        }
-
-        /**
-         * Get the VLAN priority.
-         *
-         * @return the VLAN priority.
-         */
-        @JsonProperty("vlanPriority")
-        public byte vlanPriority() {
-            return this.vlanPriority;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [vlanPriority=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "vlanPriority=" + this.vlanPriority;
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [vlanPriority=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split("vlanPriority=");
-            String decode = null;
-
-            // Decode the value
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                try {
-                    vlanPriority = Byte.valueOf(decode);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException("Invalid action string");
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_STRIP_VLAN: Strip the 802.1q header.
-     */
-    public static class ActionStripVlan {
-        private boolean stripVlan;    // If true, strip the VLAN header
-
-        /**
-         * Default constructor.
-         */
-        public ActionStripVlan() {
-            this.stripVlan = false;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionStripVlan(ActionStripVlan other) {
-            this.stripVlan = other.stripVlan;
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [stripVlan=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionStripVlan(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given boolean flag.
-         *
-         * @param stripVlan if true, strip the VLAN header.
-         */
-        public ActionStripVlan(boolean stripVlan) {
-            this.stripVlan = stripVlan;
-        }
-
-        /**
-         * Get the boolean flag whether the VLAN header should be stripped.
-         *
-         * @return the boolean flag whether the VLAN header should be stripped.
-         */
-        @JsonProperty("stripVlan")
-        public boolean stripVlan() {
-            return this.stripVlan;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [stripVlan=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "stripVlan=" + this.stripVlan;
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [stripVlan=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split("stripVlan=");
-            String decode = null;
-
-            // Decode the value
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                stripVlan = Boolean.valueOf(decode);
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_SET_DL_SRC and ACTION_SET_DL_DST:
-     * Set the Ethernet source/destination address.
-     */
-    public static class ActionSetEthernetAddr {
-        private MACAddress addr;    // The MAC address to set
-
-        /**
-         * Default constructor.
-         */
-        public ActionSetEthernetAddr() {
-            this.addr = null;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionSetEthernetAddr(ActionSetEthernetAddr other) {
-            if (other.addr != null) {
-                this.addr = MACAddress.valueOf(other.addr.toLong());
-            }
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [addr=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionSetEthernetAddr(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given MAC address.
-         *
-         * @param addr the MAC address to set.
-         */
-        public ActionSetEthernetAddr(MACAddress addr) {
-            this.addr = addr;
-        }
-
-        /**
-         * Get the MAC address.
-         *
-         * @return the MAC address.
-         */
-        @JsonProperty("addr")
-        public MACAddress addr() {
-            return this.addr;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [addr=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "addr=" + addr.toString();
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [addr=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split("addr=");
-            String decode = null;
-
-            // Decode the value
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                try {
-                    addr = MACAddress.valueOf(decode);
-                } catch (IllegalArgumentException e) {
-                    throw new IllegalArgumentException("Invalid action string");
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_SET_NW_SRC and ACTION_SET_NW_DST:
-     * Set the IPv4 source/destination address.
-     */
-    public static class ActionSetIPv4Addr {
-        private IPv4 addr;        // The IPv4 address to set
-
-        /**
-         * Default constructor.
-         */
-        public ActionSetIPv4Addr() {
-            this.addr = null;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionSetIPv4Addr(ActionSetIPv4Addr other) {
-            if (other.addr != null) {
-                this.addr = new IPv4(other.addr);
-            }
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [addr=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionSetIPv4Addr(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given IPv4 address.
-         *
-         * @param addr the IPv4 address to set.
-         */
-        public ActionSetIPv4Addr(IPv4 addr) {
-            this.addr = addr;
-        }
-
-        /**
-         * Get the IPv4 address.
-         *
-         * @return the IPv4 address.
-         */
-        @JsonProperty("addr")
-        public IPv4 addr() {
-            return this.addr;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [addr=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "addr=" + addr.toString();
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [addr=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split("addr=");
-            String decode = null;
-
-            // Decode the value
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                try {
-                    addr = new IPv4(decode);
-                } catch (IllegalArgumentException e) {
-                    throw new IllegalArgumentException("Invalid action string");
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_SET_NW_TOS:
-     * Set the IP ToS (DSCP field, 6 bits).
-     */
-    public static class ActionSetIpToS {
-        private byte ipToS;    // The IP ToS to set DSCP field, 6 bits)
-
-        /**
-         * Default constructor.
-         */
-        public ActionSetIpToS() {
-            this.ipToS = 0;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionSetIpToS(ActionSetIpToS other) {
-            this.ipToS = other.ipToS;
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [ipToS=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionSetIpToS(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given IP ToS (DSCP field, 6 bits).
-         *
-         * @param ipToS the IP ToS (DSCP field, 6 bits) to set.
-         */
-        public ActionSetIpToS(byte ipToS) {
-            this.ipToS = ipToS;
-        }
-
-        /**
-         * Get the IP ToS (DSCP field, 6 bits).
-         *
-         * @return the IP ToS (DSCP field, 6 bits).
-         */
-        @JsonProperty("ipToS")
-        public byte ipToS() {
-            return this.ipToS;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [ipToS=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "ipToS=" + ipToS;
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [ipToS=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split("ipToS=");
-            String decode = null;
-
-            // Decode the value
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                try {
-                    ipToS = Byte.valueOf(decode);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException("Invalid action string");
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_SET_TP_SRC and ACTION_SET_TP_DST:
-     * Set the TCP/UDP source/destination port.
-     */
-    public static class ActionSetTcpUdpPort {
-        private short port;        // The TCP/UDP port to set
-
-        /**
-         * Default constructor.
-         */
-        public ActionSetTcpUdpPort() {
-            this.port = 0;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionSetTcpUdpPort(ActionSetTcpUdpPort other) {
-            this.port = other.port;
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionSetTcpUdpPort(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given TCP/UDP port.
-         *
-         * @param port the TCP/UDP port to set.
-         */
-        public ActionSetTcpUdpPort(short port) {
-            this.port = port;
-        }
-
-        /**
-         * Get the TCP/UDP port.
-         *
-         * @return the TCP/UDP port.
-         */
-        @JsonProperty("port")
-        public short port() {
-            return this.port;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "port=" + port;
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split("port=");
-            String decode = null;
-
-            // Decode the value
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                try {
-                    port = Short.valueOf(decode);
-                } catch (NumberFormatException e) {
-                    throw new IllegalArgumentException("Invalid action string");
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    /**
-     * Action structure for ACTION_ENQUEUE: Output to queue on port.
-     */
-    public static class ActionEnqueue {
-        private PortNumber port;    // Port that queue belongs. Should
-        // refer to a valid physical port
-        // (i.e. < PORT_MAX) or PORT_IN_PORT
-        private int queueId;    // Where to enqueue the packets
-
-        /**
-         * Default constructor.
-         */
-        public ActionEnqueue() {
-            this.port = null;
-            this.queueId = 0;
-        }
-
-        /**
-         * Copy constructor.
-         *
-         * @param other the object to copy from.
-         */
-        public ActionEnqueue(ActionEnqueue other) {
-            if (other.port != null) {
-                this.port = new PortNumber(other.port);
-            }
-            this.queueId = other.queueId;
-        }
-
-        /**
-         * Constructor from a string.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX queueId=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public ActionEnqueue(String actionStr) {
-            this.fromString(actionStr);
-        }
-
-        /**
-         * Constructor for a given port and queue ID.
-         *
-         * @param port    the port to set.
-         * @param queueId the queue ID on the port.
-         */
-        public ActionEnqueue(PortNumber port, int queueId) {
-            this.port = port;
-            this.queueId = queueId;
-        }
-
-        /**
-         * Get the port.
-         *
-         * @return the port.
-         */
-        @JsonProperty("port")
-        public PortNumber port() {
-            return this.port;
-        }
-
-        /**
-         * Get the queue ID.
-         *
-         * @return the queue ID.
-         */
-        @JsonProperty("queueId")
-        public int queueId() {
-            return this.queueId;
-        }
-
-        /**
-         * Convert the action to a string.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX queueId=XXX]
-         *
-         * @return the action as a string.
-         */
-        @Override
-        public String toString() {
-            String ret = "[";
-            ret += "port=" + port.toString();
-            ret += " queueId=" + queueId;
-            ret += "]";
-
-            return ret;
-        }
-
-        /**
-         * Convert a string to an action.
-         * <p/>
-         * The string has the following form:
-         * [port=XXX queueId=XXX]
-         *
-         * @param actionStr the action as a string.
-         */
-        public void fromString(String actionStr) {
-            String[] parts = actionStr.split(" ");
-            String decode = null;
-
-            // Decode the "port=XXX" part
-            if (parts.length > 0) {
-                decode = parts[0];
-            }
-            if (decode != null) {
-                String[] tokens = decode.split("port=");
-                if (tokens.length > 1 && tokens[1] != null) {
-                    try {
-                        Short valueShort = Short.valueOf(tokens[1]);
-                        port = new PortNumber(valueShort);
-                    } catch (NumberFormatException e) {
-                        throw new IllegalArgumentException("Invalid action string");
-                    }
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-
-            // Decode the "queueId=XXX" part
-            decode = null;
-            if (parts.length > 1) {
-                decode = parts[1];
-            }
-            if (decode != null) {
-                decode = decode.replace("]", "");
-                String[] tokens = decode.split("queueId=");
-                if (tokens.length > 1 && tokens[1] != null) {
-                    try {
-                        queueId = Short.valueOf(tokens[1]);
-                    } catch (NumberFormatException e) {
-                        throw new IllegalArgumentException("Invalid action string");
-                    }
-                }
-            } else {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        }
-    }
-
-    private ActionValues actionType;    // The action type
-
-    //
-    // The actions.
-    // NOTE: Only one action should be set.
-    //
-    private ActionOutput actionOutput;
-    private ActionSetVlanId actionSetVlanId;
-    private ActionSetVlanPriority actionSetVlanPriority;
-    private ActionStripVlan actionStripVlan;
-    private ActionSetEthernetAddr actionSetEthernetSrcAddr;
-    private ActionSetEthernetAddr actionSetEthernetDstAddr;
-    private ActionSetIPv4Addr actionSetIPv4SrcAddr;
-    private ActionSetIPv4Addr actionSetIPv4DstAddr;
-    private ActionSetIpToS actionSetIpToS;
-    private ActionSetTcpUdpPort actionSetTcpUdpSrcPort;
-    private ActionSetTcpUdpPort actionSetTcpUdpDstPort;
-    private ActionEnqueue actionEnqueue;
-
-    /**
-     * Default constructor.
-     */
-    public FlowEntryAction() {
-        actionType = ActionValues.ACTION_VENDOR;    // XXX: Initial value
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public FlowEntryAction(FlowEntryAction other) {
-        this.actionType = other.actionType;
-
-        //
-        if (other.actionOutput != null) {
-            this.actionOutput = new ActionOutput(other.actionOutput);
-        } else {
-            this.actionOutput = null;
-        }
-        //
-        if (other.actionSetVlanId != null) {
-            this.actionSetVlanId = new ActionSetVlanId(other.actionSetVlanId);
-        } else {
-            this.actionSetVlanId = null;
-        }
-        //
-        if (other.actionSetVlanPriority != null) {
-            this.actionSetVlanPriority = new ActionSetVlanPriority(other.actionSetVlanPriority);
-        } else {
-            this.actionSetVlanPriority = null;
-        }
-        //
-        if (other.actionStripVlan != null) {
-            this.actionStripVlan = new ActionStripVlan(other.actionStripVlan);
-        } else {
-            this.actionStripVlan = null;
-        }
-        //
-        if (other.actionSetEthernetSrcAddr != null) {
-            this.actionSetEthernetSrcAddr = new ActionSetEthernetAddr(other.actionSetEthernetSrcAddr);
-        } else {
-            this.actionSetEthernetSrcAddr = null;
-        }
-        //
-        if (other.actionSetEthernetDstAddr != null) {
-            this.actionSetEthernetDstAddr = new ActionSetEthernetAddr(other.actionSetEthernetDstAddr);
-        } else {
-            this.actionSetEthernetDstAddr = null;
-        }
-        //
-        if (other.actionSetIPv4SrcAddr != null) {
-            this.actionSetIPv4SrcAddr = new ActionSetIPv4Addr(other.actionSetIPv4SrcAddr);
-        } else {
-            this.actionSetIPv4SrcAddr = null;
-        }
-        //
-        if (other.actionSetIPv4DstAddr != null) {
-            this.actionSetIPv4DstAddr = new ActionSetIPv4Addr(other.actionSetIPv4DstAddr);
-        } else {
-            this.actionSetIPv4DstAddr = null;
-        }
-        //
-        if (other.actionSetIpToS != null) {
-            this.actionSetIpToS = new ActionSetIpToS(other.actionSetIpToS);
-        } else {
-            this.actionSetIpToS = null;
-        }
-        //
-        if (other.actionSetTcpUdpSrcPort != null) {
-            this.actionSetTcpUdpSrcPort = new ActionSetTcpUdpPort(other.actionSetTcpUdpSrcPort);
-        } else {
-            this.actionSetTcpUdpSrcPort = null;
-        }
-        //
-        if (other.actionSetTcpUdpDstPort != null) {
-            this.actionSetTcpUdpDstPort = new ActionSetTcpUdpPort(other.actionSetTcpUdpDstPort);
-        } else {
-            this.actionSetTcpUdpDstPort = null;
-        }
-        //
-        if (other.actionEnqueue != null) {
-            this.actionEnqueue = new ActionEnqueue(other.actionEnqueue);
-        } else {
-            this.actionEnqueue = null;
-        }
-    }
-
-    /**
-     * Constructor from a string.
-     * <p/>
-     * The string has the following form:
-     * [type=XXX action=XXX]
-     *
-     * @param actionStr the action as a string.
-     */
-    public FlowEntryAction(String actionStr) {
-        this.fromString(actionStr);
-    }
-
-    /**
-     * Get the action type.
-     *
-     * @return the action type.
-     */
-    @JsonProperty("actionType")
-    public ActionValues actionType() {
-        return actionType;
-    }
-
-    /**
-     * Get the output action.
-     *
-     * @return the output action.
-     */
-    @JsonProperty("actionOutput")
-    public ActionOutput actionOutput() {
-        return actionOutput;
-    }
-
-    /**
-     * Set the output action on a port.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionOutput")
-    public void setActionOutput(ActionOutput action) {
-        actionOutput = action;
-        actionType = ActionValues.ACTION_OUTPUT;
-    }
-
-    /**
-     * Set the output action on a port.
-     *
-     * @param port the output port to set.
-     */
-    public void setActionOutput(PortNumber port) {
-        actionOutput = new ActionOutput(port);
-        actionType = ActionValues.ACTION_OUTPUT;
-    }
-
-    /**
-     * Set the output action to controller.
-     *
-     * @param maxLen the maximum length (in bytes) to send to controller.
-     */
-    public void setActionOutputToController(short maxLen) {
-        PortNumber port = new PortNumber(OFPort.CONTROLLER.getShortPortNumber());
-        actionOutput = new ActionOutput(port, maxLen);
-        actionType = ActionValues.ACTION_OUTPUT;
-    }
-
-    /**
-     * Get the action to set the VLAN ID.
-     *
-     * @return the action to set the VLAN ID.
-     */
-    @JsonProperty("actionSetVlanId")
-    public ActionSetVlanId actionSetVlanId() {
-        return actionSetVlanId;
-    }
-
-    /**
-     * Set the action to set the VLAN ID.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetVlanId")
-    public void setActionSetVlanId(ActionSetVlanId action) {
-        actionSetVlanId = action;
-        actionType = ActionValues.ACTION_SET_VLAN_VID;
-    }
-
-    /**
-     * Set the action to set the VLAN ID.
-     *
-     * @param vlanId the VLAN ID to set.
-     */
-    public void setActionSetVlanId(short vlanId) {
-        actionSetVlanId = new ActionSetVlanId(vlanId);
-        actionType = ActionValues.ACTION_SET_VLAN_VID;
-    }
-
-    /**
-     * Get the action to set the VLAN priority.
-     *
-     * @return the action to set the VLAN priority.
-     */
-    @JsonProperty("actionSetVlanPriority")
-    public ActionSetVlanPriority actionSetVlanPriority() {
-        return actionSetVlanPriority;
-    }
-
-    /**
-     * Set the action to set the VLAN priority.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetVlanPriority")
-    public void setActionSetVlanPriority(ActionSetVlanPriority action) {
-        actionSetVlanPriority = action;
-        actionType = ActionValues.ACTION_SET_VLAN_PCP;
-    }
-
-    /**
-     * Set the action to set the VLAN priority.
-     *
-     * @param vlanPriority the VLAN priority to set.
-     */
-    public void setActionSetVlanPriority(byte vlanPriority) {
-        actionSetVlanPriority = new ActionSetVlanPriority(vlanPriority);
-        actionType = ActionValues.ACTION_SET_VLAN_PCP;
-    }
-
-    /**
-     * Get the action to strip the VLAN header.
-     *
-     * @return the action to strip the VLAN header.
-     */
-    @JsonProperty("actionStripVlan")
-    public ActionStripVlan actionStripVlan() {
-        return actionStripVlan;
-    }
-
-    /**
-     * Set the action to strip the VLAN header.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionStripVlan")
-    public void setActionStripVlan(ActionStripVlan action) {
-        actionStripVlan = action;
-        actionType = ActionValues.ACTION_STRIP_VLAN;
-    }
-
-    /**
-     * Set the action to strip the VLAN header.
-     *
-     * @param stripVlan if true, strip the VLAN header.
-     */
-    public void setActionStripVlan(boolean stripVlan) {
-        actionStripVlan = new ActionStripVlan(stripVlan);
-        actionType = ActionValues.ACTION_STRIP_VLAN;
-    }
-
-    /**
-     * Get the action to set the Ethernet source address.
-     *
-     * @return the action to set the Ethernet source address.
-     */
-    @JsonProperty("actionSetEthernetSrcAddr")
-    public ActionSetEthernetAddr actionSetEthernetSrcAddr() {
-        return actionSetEthernetSrcAddr;
-    }
-
-    /**
-     * Set the action to set the Ethernet source address.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetEthernetSrcAddr")
-    public void setActionSetEthernetSrcAddr(ActionSetEthernetAddr action) {
-        actionSetEthernetSrcAddr = action;
-        actionType = ActionValues.ACTION_SET_DL_SRC;
-    }
-
-    /**
-     * Set the action to set the Ethernet source address.
-     *
-     * @param addr the MAC address to set as the Ethernet source address.
-     */
-    public void setActionSetEthernetSrcAddr(MACAddress addr) {
-        actionSetEthernetSrcAddr = new ActionSetEthernetAddr(addr);
-        actionType = ActionValues.ACTION_SET_DL_SRC;
-    }
-
-    /**
-     * Get the action to set the Ethernet destination address.
-     *
-     * @return the action to set the Ethernet destination address.
-     */
-    @JsonProperty("actionSetEthernetDstAddr")
-    public ActionSetEthernetAddr actionSetEthernetDstAddr() {
-        return actionSetEthernetDstAddr;
-    }
-
-    /**
-     * Set the action to set the Ethernet destination address.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetEthernetDstAddr")
-    public void setActionSetEthernetDstAddr(ActionSetEthernetAddr action) {
-        actionSetEthernetDstAddr = action;
-        actionType = ActionValues.ACTION_SET_DL_DST;
-    }
-
-    /**
-     * Set the action to set the Ethernet destination address.
-     *
-     * @param addr the MAC address to set as the Ethernet destination address.
-     */
-    public void setActionSetEthernetDstAddr(MACAddress addr) {
-        actionSetEthernetDstAddr = new ActionSetEthernetAddr(addr);
-        actionType = ActionValues.ACTION_SET_DL_DST;
-    }
-
-    /**
-     * Get the action to set the IPv4 source address.
-     *
-     * @return the action to set the IPv4 source address.
-     */
-    @JsonProperty("actionSetIPv4SrcAddr")
-    public ActionSetIPv4Addr actionSetIPv4SrcAddr() {
-        return actionSetIPv4SrcAddr;
-    }
-
-    /**
-     * Set the action to set the IPv4 source address.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetIPv4SrcAddr")
-    public void setActionSetIPv4SrcAddr(ActionSetIPv4Addr action) {
-        actionSetIPv4SrcAddr = action;
-        actionType = ActionValues.ACTION_SET_NW_SRC;
-    }
-
-    /**
-     * Set the action to set the IPv4 source address.
-     *
-     * @param addr the IPv4 address to set as the IPv4 source address.
-     */
-    public void setActionSetIPv4SrcAddr(IPv4 addr) {
-        actionSetIPv4SrcAddr = new ActionSetIPv4Addr(addr);
-        actionType = ActionValues.ACTION_SET_NW_SRC;
-    }
-
-    /**
-     * Get the action to set the IPv4 destination address.
-     *
-     * @return the action to set the IPv4 destination address.
-     */
-    @JsonProperty("actionSetIPv4DstAddr")
-    public ActionSetIPv4Addr actionSetIPv4DstAddr() {
-        return actionSetIPv4DstAddr;
-    }
-
-    /**
-     * Set the action to set the IPv4 destination address.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetIPv4DstAddr")
-    public void setActionSetIPv4DstAddr(ActionSetIPv4Addr action) {
-        actionSetIPv4DstAddr = action;
-        actionType = ActionValues.ACTION_SET_NW_DST;
-    }
-
-    /**
-     * Set the action to set the IPv4 destination address.
-     *
-     * @param addr the IPv4 address to set as the IPv4 destination address.
-     */
-    public void setActionSetIPv4DstAddr(IPv4 addr) {
-        actionSetIPv4DstAddr = new ActionSetIPv4Addr(addr);
-        actionType = ActionValues.ACTION_SET_NW_DST;
-    }
-
-    /**
-     * Get the action to set the IP ToS (DSCP field, 6 bits).
-     *
-     * @return the action to set the IP ToS (DSCP field, 6 bits).
-     */
-    @JsonProperty("actionSetIpToS")
-    public ActionSetIpToS actionSetIpToS() {
-        return actionSetIpToS;
-    }
-
-    /**
-     * Set the action to set the IP ToS (DSCP field, 6 bits).
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetIpToS")
-    public void setActionSetIpToS(ActionSetIpToS action) {
-        actionSetIpToS = action;
-        actionType = ActionValues.ACTION_SET_NW_TOS;
-    }
-
-    /**
-     * Set the action to set the IP ToS (DSCP field, 6 bits).
-     *
-     * @param ipToS the IP ToS (DSCP field, 6 bits) to set.
-     */
-    public void setActionSetIpToS(byte ipToS) {
-        actionSetIpToS = new ActionSetIpToS(ipToS);
-        actionType = ActionValues.ACTION_SET_NW_TOS;
-    }
-
-    /**
-     * Get the action to set the TCP/UDP source port.
-     *
-     * @return the action to set the TCP/UDP source port.
-     */
-    @JsonProperty("actionSetTcpUdpSrcPort")
-    public ActionSetTcpUdpPort actionSetTcpUdpSrcPort() {
-        return actionSetTcpUdpSrcPort;
-    }
-
-    /**
-     * Set the action to set the TCP/UDP source port.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetTcpUdpSrcPort")
-    public void setActionSetTcpUdpSrcPort(ActionSetTcpUdpPort action) {
-        actionSetTcpUdpSrcPort = action;
-        actionType = ActionValues.ACTION_SET_TP_SRC;
-    }
-
-    /**
-     * Set the action to set the TCP/UDP source port.
-     *
-     * @param port the TCP/UDP port to set as the TCP/UDP source port.
-     */
-    public void setActionSetTcpUdpSrcPort(short port) {
-        actionSetTcpUdpSrcPort = new ActionSetTcpUdpPort(port);
-        actionType = ActionValues.ACTION_SET_TP_SRC;
-    }
-
-    /**
-     * Get the action to set the TCP/UDP destination port.
-     *
-     * @return the action to set the TCP/UDP destination port.
-     */
-    @JsonProperty("actionSetTcpUdpDstPort")
-    public ActionSetTcpUdpPort actionSetTcpUdpDstPort() {
-        return actionSetTcpUdpDstPort;
-    }
-
-    /**
-     * Set the action to set the TCP/UDP destination port.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionSetTcpUdpDstPort")
-    public void setActionSetTcpUdpDstPort(ActionSetTcpUdpPort action) {
-        actionSetTcpUdpDstPort = action;
-        actionType = ActionValues.ACTION_SET_TP_DST;
-    }
-
-    /**
-     * Set the action to set the TCP/UDP destination port.
-     *
-     * @param port the TCP/UDP port to set as the TCP/UDP destination port.
-     */
-    public void setActionSetTcpUdpDstPort(short port) {
-        actionSetTcpUdpDstPort = new ActionSetTcpUdpPort(port);
-        actionType = ActionValues.ACTION_SET_TP_DST;
-    }
-
-    /**
-     * Get the action to output to queue on a port.
-     *
-     * @return the action to output to queue on a port.
-     */
-    @JsonProperty("actionEnqueue")
-    public ActionEnqueue actionEnqueue() {
-        return actionEnqueue;
-    }
-
-    /**
-     * Set the action to output to queue on a port.
-     *
-     * @param action the action to set.
-     */
-    @JsonProperty("actionEnqueue")
-    public void setActionEnqueue(ActionEnqueue action) {
-        actionEnqueue = action;
-        actionType = ActionValues.ACTION_ENQUEUE;
-    }
-
-    /**
-     * Set the action to output to queue on a port.
-     *
-     * @param port    the port to set.
-     * @param queueId the queue ID to set.
-     */
-    public void setActionEnqueue(PortNumber port, int queueId) {
-        actionEnqueue = new ActionEnqueue(port, queueId);
-        actionType = ActionValues.ACTION_ENQUEUE;
-    }
-
-    /**
-     * Convert the action to a string.
-     * <p/>
-     * The string has the following form:
-     * [type=XXX action=XXX]
-     *
-     * @return the action as a string.
-     */
-    @Override
-    public String toString() {
-        String ret = "[";
-        ret += "type=" + actionType;
-        switch (actionType) {
-            case ACTION_OUTPUT:
-                ret += " action=" + actionOutput.toString();
-                break;
-            case ACTION_SET_VLAN_VID:
-                ret += " action=" + actionSetVlanId.toString();
-                break;
-            case ACTION_SET_VLAN_PCP:
-                ret += " action=" + actionSetVlanPriority.toString();
-                break;
-            case ACTION_STRIP_VLAN:
-                ret += " action=" + actionStripVlan.toString();
-                break;
-            case ACTION_SET_DL_SRC:
-                ret += " action=" + actionSetEthernetSrcAddr.toString();
-                break;
-            case ACTION_SET_DL_DST:
-                ret += " action=" + actionSetEthernetDstAddr.toString();
-                break;
-            case ACTION_SET_NW_SRC:
-                ret += " action=" + actionSetIPv4SrcAddr.toString();
-                break;
-            case ACTION_SET_NW_DST:
-                ret += " action=" + actionSetIPv4DstAddr.toString();
-                break;
-            case ACTION_SET_NW_TOS:
-                ret += " action=" + actionSetIpToS.toString();
-                break;
-            case ACTION_SET_TP_SRC:
-                ret += " action=" + actionSetTcpUdpSrcPort.toString();
-                break;
-            case ACTION_SET_TP_DST:
-                ret += " action=" + actionSetTcpUdpDstPort.toString();
-                break;
-            case ACTION_ENQUEUE:
-                ret += " action=" + actionEnqueue.toString();
-                break;
-            case ACTION_VENDOR:
-                ret += " action=VENDOR";
-                break;
-            default:
-                ret += " action=unknown";
-                break;
-        }
-        ret += "]";
-
-        return ret;
-    }
-
-    /**
-     * Convert a string to an action.
-     * <p/>
-     * The string has the following form:
-     * [type=XXX action=XXX]
-     *
-     * @param actionStr the action as a string.
-     */
-    public void fromString(String actionStr) {
-        String[] parts = actionStr.split("type=");
-        String decode = null;
-
-        // Extract the string after the "type="
-        if (parts.length > 1) {
-            decode = parts[1];
-        }
-        if (decode == null) {
-            throw new IllegalArgumentException("Invalid action string");
-        }
-
-        // Remove the trailing ']'
-        if ((decode.length() > 0) && (decode.charAt(decode.length() - 1) == ']')) {
-            decode = decode.substring(0, decode.length() - 1);
-        } else {
-            throw new IllegalArgumentException("Invalid action string");
-        }
-
-        // Extract the type value and the action value
-        parts = decode.split(" action=");
-
-        // Decode the "type=XXX" payload
-        if (parts.length > 0) {
-            decode = parts[0];
-        }
-        if (decode != null) {
-            try {
-                actionType = Enum.valueOf(ActionValues.class, decode);
-            } catch (IllegalArgumentException e) {
-                throw new IllegalArgumentException("Invalid action string");
-            }
-        } else {
-            throw new IllegalArgumentException("Invalid action string");
-        }
-
-        // Decode the "action=XXX" payload
-        decode = null;
-        if (parts.length > 1) {
-            decode = parts[1];
-        }
-        if (decode == null) {
-            throw new IllegalArgumentException("Invalid action string");
-        }
-        //
-        try {
-            switch (actionType) {
-                case ACTION_OUTPUT:
-                    actionOutput = new ActionOutput(decode);
-                    break;
-                case ACTION_SET_VLAN_VID:
-                    actionSetVlanId = new ActionSetVlanId(decode);
-                    break;
-                case ACTION_SET_VLAN_PCP:
-                    actionSetVlanPriority = new ActionSetVlanPriority(decode);
-                    break;
-                case ACTION_STRIP_VLAN:
-                    actionStripVlan = new ActionStripVlan(decode);
-                    break;
-                case ACTION_SET_DL_SRC:
-                    actionSetEthernetSrcAddr = new ActionSetEthernetAddr(decode);
-                    break;
-                case ACTION_SET_DL_DST:
-                    actionSetEthernetDstAddr = new ActionSetEthernetAddr(decode);
-                    break;
-                case ACTION_SET_NW_SRC:
-                    actionSetIPv4SrcAddr = new ActionSetIPv4Addr(decode);
-                    break;
-                case ACTION_SET_NW_DST:
-                    actionSetIPv4DstAddr = new ActionSetIPv4Addr(decode);
-                    break;
-                case ACTION_SET_NW_TOS:
-                    actionSetIpToS = new ActionSetIpToS(decode);
-                    break;
-                case ACTION_SET_TP_SRC:
-                    actionSetTcpUdpSrcPort = new ActionSetTcpUdpPort(decode);
-                    break;
-                case ACTION_SET_TP_DST:
-                    actionSetTcpUdpDstPort = new ActionSetTcpUdpPort(decode);
-                    break;
-                case ACTION_ENQUEUE:
-                    actionEnqueue = new ActionEnqueue(decode);
-                    break;
-                case ACTION_VENDOR:
-                    // TODO: Handle it as appropriate
-                    break;
-                default:
-                    throw new IllegalArgumentException("Invalid action string");
-            }
-        } catch (IllegalArgumentException e) {
-            throw new IllegalArgumentException("Invalid action type", e);
-        }
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntryActions.java b/src/main/java/net/onrc/onos/core/util/FlowEntryActions.java
deleted file mode 100644
index 62d9a65..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntryActions.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package net.onrc.onos.core.util;
-
-import java.util.ArrayList;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing multiple Flow Entry actions.
- * <p/>
- * A set of Flow Entry actions need to be applied to each packet.
- */
-public class FlowEntryActions {
-    private ArrayList<FlowEntryAction> actions;    // The Flow Entry Actions
-
-    /**
-     * Default constructor.
-     */
-    public FlowEntryActions() {
-        actions = new ArrayList<FlowEntryAction>();
-    }
-
-    /**
-     * Constructor from a string.
-     * <p/>
-     * The string has the following form:
-     * [[type=XXX action=XXX];[type=XXX action=XXX];...;]
-     *
-     * @param actionsStr the set of actions as a string.
-     */
-    public FlowEntryActions(String actionsStr) {
-        this.fromString(actionsStr);
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public FlowEntryActions(FlowEntryActions other) {
-        actions = new ArrayList<FlowEntryAction>();
-
-        for (FlowEntryAction action : other.actions) {
-            FlowEntryAction newAction = new FlowEntryAction(action);
-            actions.add(newAction);
-        }
-    }
-
-    /**
-     * Get the Flow Entry Actions.
-     *
-     * @return the Flow Entry Actions.
-     */
-    @JsonProperty("actions")
-    public ArrayList<FlowEntryAction> actions() {
-        return actions;
-    }
-
-    /**
-     * Set the Flow Entry Actions.
-     *
-     * @param actions the Flow Entry Actions to set.
-     */
-    @JsonProperty("actions")
-    public void setActions(ArrayList<FlowEntryAction> actions) {
-        this.actions = actions;
-    }
-
-    /**
-     * Add a Flow Entry Action.
-     *
-     * @param flowEntryAction the Flow Entry Action to add.
-     */
-    public void addAction(FlowEntryAction flowEntryAction) {
-        actions.add(flowEntryAction);
-    }
-
-    /**
-     * Test whether the set of actions is empty.
-     *
-     * @return true if the set of actions is empty, otherwise false.
-     */
-    @JsonIgnore
-    public Boolean isEmpty() {
-        return actions.isEmpty();
-    }
-
-    /**
-     * Convert the set of actions to a string.
-     * <p/>
-     * The string has the following form:
-     * [[type=XXX action=XXX];[type=XXX action=XXX];...;]
-     *
-     * @return the set of actions as a string.
-     */
-    @Override
-    public String toString() {
-        StringBuilder ret = new StringBuilder();
-
-        ret.append("[");
-        for (FlowEntryAction action : actions) {
-            ret.append(action.toString() + ";");
-        }
-        ret.append("]");
-
-        return ret.toString();
-    }
-
-    /**
-     * Convert a string to a set of actions.
-     * <p/>
-     * The string has the following form:
-     * [[type=XXX action=XXX];[type=XXX action=XXX];...;]
-     *
-     * @param actionsStr the set of actions as a string.
-     */
-    public void fromString(String actionsStr) {
-        String decode = actionsStr;
-
-        actions = new ArrayList<FlowEntryAction>();
-
-        if (decode.isEmpty()) {
-            return;        // Nothing to do
-        }
-
-        // Remove the '[' and ']' in the beginning and the end of the string
-        if ((decode.length() > 1) && (decode.charAt(0) == '[') &&
-                (decode.charAt(decode.length() - 1) == ']')) {
-            decode = decode.substring(1, decode.length() - 1);
-        } else {
-            throw new IllegalArgumentException("Invalid action string");
-        }
-
-        // Split the string, and decode each action
-        String[] parts = decode.split(";");
-        for (int i = 0; i < parts.length; i++) {
-            decode = parts[i];
-            if ((decode == null) || decode.isEmpty()) {
-                continue;
-            }
-            FlowEntryAction flowEntryAction = null;
-            try {
-                flowEntryAction = new FlowEntryAction(decode);
-            } catch (IllegalArgumentException e) {
-                // TODO: Ignore invalid actions for now
-                continue;
-            }
-            if (flowEntryAction != null) {
-                actions.add(flowEntryAction);
-            }
-        }
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntryErrorState.java b/src/main/java/net/onrc/onos/core/util/FlowEntryErrorState.java
deleted file mode 100644
index 4744baa..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntryErrorState.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package net.onrc.onos.core.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Flow Entry error state.
- */
-public class FlowEntryErrorState {
-    private short type;    // The error type (e.g., see OF-1.3.1 spec, pp. 95)
-    private short code;    // The error code (e.g., see OF-1.3.1 spec, pp. 95)
-
-    /**
-     * Default constructor.
-     */
-    public FlowEntryErrorState() {
-        this.type = 0;
-        this.code = 0;
-    }
-
-    /**
-     * Constructor for a given error type and code.
-     *
-     * @param type the error type to use.
-     * @param code the error code to use.
-     */
-    public FlowEntryErrorState(short type, short code) {
-        this.type = type;
-        this.code = code;
-    }
-
-    /**
-     * Get the error type.
-     *
-     * @return the error type.
-     */
-    @JsonProperty("type")
-    public short type() {
-        return type;
-    }
-
-    /**
-     * Set the error type.
-     *
-     * @param type the error type to use.
-     */
-    @JsonProperty("type")
-    public void setType(short type) {
-        this.type = type;
-    }
-
-    /**
-     * Get the error code.
-     *
-     * @return the error code.
-     */
-    @JsonProperty("code")
-    public short code() {
-        return code;
-    }
-
-    /**
-     * Set the error code.
-     *
-     * @param code the error code to use.
-     */
-    @JsonProperty("code")
-    public void setCode(short code) {
-        this.code = code;
-    }
-
-    /**
-     * Set the values of the error type and code.
-     *
-     * @param newType the error type to use.
-     * @param newCode the error code to use.
-     */
-    public void setValue(short newType, short newCode) {
-        type = newType;
-        code = newCode;
-    }
-
-    /**
-     * Convert the error type and code to a string.
-     * <p/>
-     * The string has the following form:
-     * [type=1 code=2]
-     *
-     * @return the error type and code as a string.
-     */
-    @Override
-    public String toString() {
-        String ret = "[type=" + this.type + " code=" + code + "]";
-        return ret;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntryId.java b/src/main/java/net/onrc/onos/core/util/FlowEntryId.java
deleted file mode 100644
index 4900890..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntryId.java
+++ /dev/null
@@ -1,110 +0,0 @@
-package net.onrc.onos.core.util;
-
-import java.math.BigInteger;
-
-import net.onrc.onos.core.util.serializers.FlowEntryIdDeserializer;
-import net.onrc.onos.core.util.serializers.FlowEntryIdSerializer;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/**
- * The class representing a Flow Entry ID.
- * This class is immutable.
- */
-@JsonDeserialize(using = FlowEntryIdDeserializer.class)
-@JsonSerialize(using = FlowEntryIdSerializer.class)
-public final class FlowEntryId {
-    private static final long INVALID = -1;
-    private final long value;
-
-    /**
-     * Default constructor.
-     */
-    public FlowEntryId() {
-        this.value = FlowEntryId.INVALID;
-    }
-
-    /**
-     * Constructor from an integer value.
-     *
-     * @param value the value to use.
-     */
-    public FlowEntryId(long value) {
-        this.value = value;
-    }
-
-    /**
-     * Constructor from a string.
-     *
-     * @param value the value to use.
-     */
-    public FlowEntryId(String value) {
-        //
-        // Use the help of BigInteger to parse strings representing
-        // large unsigned hex long values.
-        //
-        char c = 0;
-        if (value.length() > 2) {
-            c = value.charAt(1);
-        }
-        if ((c == 'x') || (c == 'X')) {
-            this.value = new BigInteger(value.substring(2), 16).longValue();
-        } else {
-            this.value = Long.decode(value);
-        }
-    }
-
-    /**
-     * Get the value of the Flow Entry ID.
-     *
-     * @return the value of the Flow Entry ID.
-     */
-    public long value() {
-        return value;
-    }
-
-    /**
-     * Test whether the Flow Entry ID is valid.
-     *
-     * @return true if the Flow Entry ID is valid, otherwise false.
-     */
-    @JsonIgnore
-    public boolean isValid() {
-        return (this.value() != FlowEntryId.INVALID);
-    }
-
-    /**
-     * Returns true of the object is another Flow Entry ID with
-     * the same value; otherwise, returns false.
-     *
-     * @param obj to compare
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj != null && obj.getClass() == this.getClass()) {
-            FlowEntryId entry = (FlowEntryId) obj;
-            return this.value() == entry.value();
-        }
-        return false;
-    }
-
-    /**
-     * Return the hash code of the Flow Entry ID.
-     */
-    @Override
-    public int hashCode() {
-        return Long.valueOf(value).hashCode();
-    }
-
-    /**
-     * Convert the Flow Entry ID value to a hexadecimal string.
-     *
-     * @return the Flow Entry ID value to a hexadecimal string.
-     */
-    @Override
-    public String toString() {
-        return "0x" + Long.toHexString(this.value);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntryMatch.java b/src/main/java/net/onrc/onos/core/util/FlowEntryMatch.java
deleted file mode 100644
index d3f8d71..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntryMatch.java
+++ /dev/null
@@ -1,763 +0,0 @@
-package net.onrc.onos.core.util;
-
-import net.floodlightcontroller.util.MACAddress;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Flow Entry Matching filter.
- * <p/>
- * The Flow Entry matching filter that is used to specify
- * the network data that would be forwarded on the data path from
- * the source to the destination. Examples: source or destination MAC address,
- * IP prefix that includes the destination's IP address, etc.
- */
-public class FlowEntryMatch {
-    /**
-     * A class for storing a value to match.
-     */
-    public static class Field<T> {
-        /**
-         * Default constructor.
-         */
-        public Field() {
-            this.enabled = false;
-        }
-
-        /**
-         * Constructor for a given value to match.
-         *
-         * @param value the value to match.
-         */
-        public Field(T value) {
-            this.value = value;
-            this.enabled = true;
-        }
-
-        /**
-         * Get the value.
-         *
-         * @return the value.
-         */
-        public T value() {
-            return this.value;
-        }
-
-        /**
-         * Enable the matching for a given value.
-         *
-         * @param newValue the value to set.
-         */
-        public void enableMatch(T newValue) {
-            this.value = newValue;
-            this.enabled = true;
-        }
-
-        /**
-         * Disable the matching.
-         */
-        public void disableMatch() {
-            this.enabled = false;
-        }
-
-        /**
-         * Test whether matching is enabled.
-         *
-         * @return true if matching is enabled, otherwise false.
-         */
-        public boolean enabled() {
-            return this.enabled;
-        }
-
-        private T value;        // The value to match
-        private boolean enabled;    // Set to true, if matching is enabled
-    }
-
-    private Field<PortNumber> inPort;        // Matching input switch port
-    private Field<MACAddress> srcMac;    // Matching source MAC address
-    private Field<MACAddress> dstMac;    // Matching destination MAC address
-    private Field<Short> ethernetFrameType; // Matching Ethernet frame type
-    private Field<Short> vlanId;    // Matching VLAN ID
-    private Field<Byte> vlanPriority;    // Matching VLAN priority
-    private Field<IPv4Net> srcIPv4Net;    // Matching source IPv4 prefix
-    private Field<IPv4Net> dstIPv4Net;    // Matching destination IPv4 prefix
-    private Field<Byte> ipProto;    // Matching IP protocol
-    private Field<Byte> ipToS;        // Matching IP ToS (DSCP field, 6 bits)
-    private Field<Short> srcTcpUdpPort;    // Matching source TCP/UDP port
-    private Field<Short> dstTcpUdpPort;    // Matching destination TCP/UDP port
-
-    /**
-     * Default constructor.
-     */
-    public FlowEntryMatch() {
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public FlowEntryMatch(FlowEntryMatch other) {
-        if ((other.inPort != null) && other.inPort.enabled()) {
-            this.enableInPort(other.inPort.value());
-        }
-        if ((other.srcMac != null) && other.srcMac.enabled()) {
-            this.enableSrcMac(other.srcMac.value());
-        }
-        if ((other.dstMac != null) && other.dstMac.enabled()) {
-            this.enableDstMac(other.dstMac.value());
-        }
-        if ((other.ethernetFrameType != null) && other.ethernetFrameType.enabled()) {
-            this.enableEthernetFrameType(other.ethernetFrameType.value());
-        }
-        if ((other.vlanId != null) && other.vlanId.enabled()) {
-            this.enableVlanId(other.vlanId.value());
-        }
-        if ((other.vlanPriority != null) && other.vlanPriority.enabled()) {
-            this.enableVlanPriority(other.vlanPriority.value());
-        }
-        if ((other.srcIPv4Net != null) && other.srcIPv4Net.enabled()) {
-            this.enableSrcIPv4Net(other.srcIPv4Net.value());
-        }
-        if ((other.dstIPv4Net != null) && other.dstIPv4Net.enabled()) {
-            this.enableDstIPv4Net(other.dstIPv4Net.value());
-        }
-        if ((other.ipProto != null) && other.ipProto.enabled()) {
-            this.enableIpProto(other.ipProto.value());
-        }
-        if ((other.ipToS != null) && other.ipToS.enabled()) {
-            this.enableIpToS(other.ipToS.value());
-        }
-        if ((other.srcTcpUdpPort != null) && other.srcTcpUdpPort.enabled()) {
-            this.enableSrcTcpUdpPort(other.srcTcpUdpPort.value());
-        }
-        if ((other.dstTcpUdpPort != null) && other.dstTcpUdpPort.enabled()) {
-            this.enableDstTcpUdpPort(other.dstTcpUdpPort.value());
-        }
-    }
-
-    /**
-     * Get the matching input switch port.
-     *
-     * @return the matching input switch port.
-     */
-    @JsonProperty("inPort")
-    public PortNumber inPort() {
-        if (inPort != null) {
-            return inPort.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on input switch port.
-     *
-     * @param newInPort the input switch port value to enable for matching.
-     */
-    @JsonProperty("inPort")
-    public void enableInPort(PortNumber newInPort) {
-        this.inPort = new Field<PortNumber>(newInPort);
-    }
-
-    /**
-     * Disable the matching on input switch port.
-     */
-    public void disableInPort() {
-        this.inPort = null;
-    }
-
-    /**
-     * Test if matching on input switch port is enabled.
-     *
-     * @return true if matching on input switch port is enabled.
-     */
-    @JsonProperty("matchInPort")
-    public boolean matchInPort() {
-        if (inPort != null) {
-            return inPort.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching source MAC address.
-     *
-     * @return the matching source MAC address.
-     */
-    @JsonProperty("srcMac")
-    public MACAddress srcMac() {
-        if (srcMac != null) {
-            return srcMac.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on source MAC address.
-     *
-     * @param newSrcMac the source MAC address value to enable for matching.
-     */
-    @JsonProperty("srcMac")
-    public void enableSrcMac(MACAddress newSrcMac) {
-        this.srcMac = new Field<MACAddress>(newSrcMac);
-    }
-
-    /**
-     * Disable the matching on source MAC address.
-     */
-    public void disableSrcMac() {
-        this.srcMac = null;
-    }
-
-    /**
-     * Test if matching on source MAC address is enabled.
-     *
-     * @return true if matching on source MAC address is enabled.
-     */
-    @JsonProperty("matchSrcMac")
-    public boolean matchSrcMac() {
-        if (srcMac != null) {
-            return srcMac.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching destination MAC address.
-     *
-     * @return the matching destination MAC address.
-     */
-    @JsonProperty("dstMac")
-    public MACAddress dstMac() {
-        if (dstMac != null) {
-            return dstMac.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on destination MAC address.
-     *
-     * @param newDstMac the destination MAC address value to enable for matching.
-     */
-    @JsonProperty("dstMac")
-    public void enableDstMac(MACAddress newDstMac) {
-        this.dstMac = new Field<MACAddress>(newDstMac);
-    }
-
-    /**
-     * Disable the matching on destination MAC address.
-     */
-    public void disableDstMac() {
-        this.dstMac = null;
-    }
-
-    /**
-     * Test if matching on destination MAC address is enabled.
-     *
-     * @return true if matching on destination MAC address is enabled.
-     */
-    @JsonProperty("matchDstMac")
-    public boolean matchDstMac() {
-        if (dstMac != null) {
-            return dstMac.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching Ethernet frame type.
-     *
-     * @return the matching Ethernet frame type.
-     */
-    @JsonProperty("ethernetFrameType")
-    public Short ethernetFrameType() {
-        if (ethernetFrameType != null) {
-            return ethernetFrameType.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on Ethernet frame type.
-     *
-     * @param newEthernetFrameType the Ethernet frame type value to enable for
-     *                          matching.
-     */
-    @JsonProperty("ethernetFrameType")
-    public void enableEthernetFrameType(Short newEthernetFrameType) {
-        this.ethernetFrameType = new Field<Short>(newEthernetFrameType);
-    }
-
-    /**
-     * Disable the matching on Ethernet frame type.
-     */
-    public void disableEthernetFrameType() {
-        this.ethernetFrameType = null;
-    }
-
-    /**
-     * Test if matching on Ethernet frame type is enabled.
-     *
-     * @return true if matching on Ethernet frame type is enabled.
-     */
-    @JsonProperty("matchEthernetFrameType")
-    public boolean matchEthernetFrameType() {
-        if (ethernetFrameType != null) {
-            return ethernetFrameType.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching VLAN ID.
-     *
-     * @return the matching VLAN ID.
-     */
-    @JsonProperty("vlanId")
-    public Short vlanId() {
-        if (vlanId != null) {
-            return vlanId.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on VLAN ID.
-     *
-     * @param newVlanId the VLAN ID value to enable for matching.
-     */
-    @JsonProperty("vlanId")
-    public void enableVlanId(Short newVlanId) {
-        this.vlanId = new Field<Short>(newVlanId);
-    }
-
-    /**
-     * Disable the matching on VLAN ID.
-     */
-    public void disableVlanId() {
-        this.vlanId = null;
-    }
-
-    /**
-     * Test if matching on VLAN ID is enabled.
-     *
-     * @return true if matching on VLAN ID is enabled.
-     */
-    @JsonProperty("matchVlanId")
-    public boolean matchVlanId() {
-        if (vlanId != null) {
-            return vlanId.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching VLAN priority.
-     *
-     * @return the matching VLAN priority.
-     */
-    @JsonProperty("vlanPriority")
-    public Byte vlanPriority() {
-        if (vlanPriority != null) {
-            return vlanPriority.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on VLAN priority.
-     *
-     * @param newVlanPriority the VLAN priority value to enable for matching.
-     */
-    @JsonProperty("vlanPriority")
-    public void enableVlanPriority(Byte newVlanPriority) {
-        this.vlanPriority = new Field<Byte>(newVlanPriority);
-    }
-
-    /**
-     * Disable the matching on VLAN priority.
-     */
-    public void disableVlanPriority() {
-        this.vlanPriority = null;
-    }
-
-    /**
-     * Test if matching on VLAN priority is enabled.
-     *
-     * @return true if matching on VLAN priority is enabled.
-     */
-    @JsonProperty("matchVlanPriority")
-    public boolean matchVlanPriority() {
-        if (vlanPriority != null) {
-            return vlanPriority.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching source IPv4 prefix.
-     *
-     * @return the matching source IPv4 prefix.
-     */
-    @JsonProperty("srcIPv4Net")
-    public IPv4Net srcIPv4Net() {
-        if (srcIPv4Net != null) {
-            return srcIPv4Net.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on source IPv4 prefix.
-     *
-     * @param newSrcIPv4Net the source IPv4 prefix value to enable for matching.
-     */
-    @JsonProperty("srcIPv4Net")
-    public void enableSrcIPv4Net(IPv4Net newSrcIPv4Net) {
-        this.srcIPv4Net = new Field<IPv4Net>(newSrcIPv4Net);
-    }
-
-    /**
-     * Disable the matching on source IPv4 prefix.
-     */
-    public void disableSrcIPv4Net() {
-        this.srcIPv4Net = null;
-    }
-
-    /**
-     * Test if matching on source IPv4 prefix is enabled.
-     *
-     * @return true if matching on source IPv4 prefix is enabled.
-     */
-    @JsonProperty("matchSrcIPv4Net")
-    public boolean matchSrcIPv4Net() {
-        if (srcIPv4Net != null) {
-            return srcIPv4Net.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching destination IPv4 prefix.
-     *
-     * @return the matching destination IPv4 prefix.
-     */
-    @JsonProperty("dstIPv4Net")
-    public IPv4Net dstIPv4Net() {
-        if (dstIPv4Net != null) {
-            return dstIPv4Net.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on destination IPv4 prefix.
-     *
-     * @param newDstIPv4Net the destination IPv4 prefix value to enable for
-     *                   matching.
-     */
-    @JsonProperty("dstIPv4Net")
-    public void enableDstIPv4Net(IPv4Net newDstIPv4Net) {
-        this.dstIPv4Net = new Field<IPv4Net>(newDstIPv4Net);
-    }
-
-    /**
-     * Disable the matching on destination IPv4 prefix.
-     */
-    public void disableDstIPv4Net() {
-        this.dstIPv4Net = null;
-    }
-
-    /**
-     * Test if matching on destination IPv4 prefix is enabled.
-     *
-     * @return true if matching on destination IPv4 prefix is enabled.
-     */
-    @JsonProperty("matchDstIPv4Net")
-    public boolean matchDstIPv4Net() {
-        if (dstIPv4Net != null) {
-            return dstIPv4Net.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching IP protocol.
-     *
-     * @return the matching IP protocol.
-     */
-    @JsonProperty("ipProto")
-    public Byte ipProto() {
-        if (ipProto != null) {
-            return ipProto.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on IP protocol.
-     *
-     * @param newIpProto the IP protocol value to enable for matching.
-     */
-    @JsonProperty("ipProto")
-    public void enableIpProto(Byte newIpProto) {
-        this.ipProto = new Field<Byte>(newIpProto);
-    }
-
-    /**
-     * Disable the matching on IP protocol.
-     */
-    public void disableIpProto() {
-        this.ipProto = null;
-    }
-
-    /**
-     * Test if matching on IP protocol is enabled.
-     *
-     * @return true if matching on IP protocol is enabled.
-     */
-    @JsonProperty("matchIpProto")
-    public boolean matchIpProto() {
-        if (ipProto != null) {
-            return ipProto.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching IP ToS (DSCP field, 6 bits).
-     *
-     * @return the matching IP ToS.
-     */
-    @JsonProperty("ipToS")
-    public Byte ipToS() {
-        if (ipToS != null) {
-            return ipToS.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on IP ToS (DSCP field, 6 bits).
-     *
-     * @param newIpToS the IP ToS value to enable for matching.
-     */
-    @JsonProperty("ipToS")
-    public void enableIpToS(Byte newIpToS) {
-        this.ipToS = new Field<Byte>(newIpToS);
-    }
-
-    /**
-     * Disable the matching on IP ToS (DSCP field, 6 bits).
-     */
-    public void disableIpToS() {
-        this.ipToS = null;
-    }
-
-    /**
-     * Test if matching on IP ToS (DSCP field, 6 bits) is enabled.
-     *
-     * @return true if matching on IP ToS is enabled.
-     */
-    @JsonProperty("matchIpToS")
-    public boolean matchIpToS() {
-        if (ipToS != null) {
-            return ipToS.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching source TCP/UDP port.
-     *
-     * @return the matching source TCP/UDP port.
-     */
-    @JsonProperty("srcTcpUdpPort")
-    public Short srcTcpUdpPort() {
-        if (srcTcpUdpPort != null) {
-            return srcTcpUdpPort.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on source TCP/UDP port.
-     *
-     * @param newSrcTcpUdpPort the source TCP/UDP port to enable for matching.
-     */
-    @JsonProperty("srcTcpUdpPort")
-    public void enableSrcTcpUdpPort(Short newSrcTcpUdpPort) {
-        this.srcTcpUdpPort = new Field<Short>(newSrcTcpUdpPort);
-    }
-
-    /**
-     * Disable the matching on source TCP/UDP port.
-     */
-    public void disableSrcTcpUdpPort() {
-        this.srcTcpUdpPort = null;
-    }
-
-    /**
-     * Test if matching on source TCP/UDP port is enabled.
-     *
-     * @return true if matching on source TCP/UDP port is enabled.
-     */
-    @JsonProperty("matchSrcTcpUdpPort")
-    public boolean matchSrcTcpUdpPort() {
-        if (srcTcpUdpPort != null) {
-            return srcTcpUdpPort.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Get the matching destination TCP/UDP port.
-     *
-     * @return the matching destination TCP/UDP port.
-     */
-    @JsonProperty("dstTcpUdpPort")
-    public Short dstTcpUdpPort() {
-        if (dstTcpUdpPort != null) {
-            return dstTcpUdpPort.value();
-        }
-        return null;
-    }
-
-    /**
-     * Enable the matching on destination TCP/UDP port.
-     *
-     * @param newDstTcpUdpPort the destination TCP/UDP port to enable for
-     *                         matching.
-     */
-    @JsonProperty("dstTcpUdpPort")
-    public void enableDstTcpUdpPort(Short newDstTcpUdpPort) {
-        this.dstTcpUdpPort = new Field<Short>(newDstTcpUdpPort);
-    }
-
-    /**
-     * Disable the matching on destination TCP/UDP port.
-     */
-    public void disableDstTcpUdpPort() {
-        this.dstTcpUdpPort = null;
-    }
-
-    /**
-     * Test if matching on destination TCP/UDP port is enabled.
-     *
-     * @return true if matching on destination TCP/UDP port is enabled.
-     */
-    @JsonProperty("matchDstTcpUdpPort")
-    public boolean matchDstTcpUdpPort() {
-        if (dstTcpUdpPort != null) {
-            return dstTcpUdpPort.enabled();
-        }
-        return false;
-    }
-
-    /**
-     * Convert the matching filter to a string.
-     * <p/>
-     * The string has the following form:
-     * [srcMac=XXX dstMac=XXX srcIPv4Net=XXX dstIPv4Net=XXX]
-     *
-     * @return the matching filter as a string.
-     */
-    @Override
-    public String toString() {
-        String ret = "[";
-        boolean addSpace = false;
-
-        //
-        // Conditionally add only those matching fields that are enabled
-        //
-        if (matchInPort()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "inPort=" + this.inPort().toString();
-        }
-        if (matchSrcMac()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "srcMac=" + this.srcMac().toString();
-        }
-        if (matchDstMac()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "dstMac=" + this.dstMac().toString();
-        }
-        if (matchEthernetFrameType()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "ethernetFrameType=" + this.ethernetFrameType().toString();
-        }
-        if (matchVlanId()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "vlanId=" + this.vlanId().toString();
-        }
-        if (matchVlanPriority()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "vlanPriority=" + this.vlanPriority().toString();
-        }
-        if (matchSrcIPv4Net()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "srcIPv4Net=" + this.srcIPv4Net().toString();
-        }
-        if (matchDstIPv4Net()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "dstIPv4Net=" + this.dstIPv4Net().toString();
-        }
-        if (matchIpProto()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "ipProto=" + this.ipProto().toString();
-        }
-        if (matchIpToS()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "ipToS=" + this.ipToS().toString();
-        }
-        if (matchSrcTcpUdpPort()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "srcTcpUdpPort=" + this.srcTcpUdpPort().toString();
-        }
-        if (matchDstTcpUdpPort()) {
-            if (addSpace) {
-                ret += " ";
-            }
-            addSpace = true;
-            ret += "dstTcpUdpPort=" + this.dstTcpUdpPort().toString();
-        }
-
-        ret += "]";
-
-        return ret;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntrySwitchState.java b/src/main/java/net/onrc/onos/core/util/FlowEntrySwitchState.java
deleted file mode 100644
index 754755a..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntrySwitchState.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.onrc.onos.core.util;
-
-/**
- * The Flow Entry state as set by the controller.
- */
-public enum FlowEntrySwitchState {
-    FE_SWITCH_UNKNOWN,            // Initialization value: state unknown
-    FE_SWITCH_NOT_UPDATED,        // Switch not updated with this entry
-    FE_SWITCH_UPDATE_IN_PROGRESS,    // Switch update in progress
-    FE_SWITCH_UPDATED,            // Switch updated with this entry
-    FE_SWITCH_UPDATE_FAILED    // Error updating the switch with this entry
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowEntryUserState.java b/src/main/java/net/onrc/onos/core/util/FlowEntryUserState.java
deleted file mode 100644
index 8cad5d0..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowEntryUserState.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.onrc.onos.core.util;
-
-/**
- * The Flow Entry state as set by the user (via the ONOS API).
- */
-public enum FlowEntryUserState {
-    FE_USER_UNKNOWN,            // Initialization value: state unknown
-    FE_USER_ADD,            // Flow entry that is added
-    FE_USER_MODIFY,            // Flow entry that is modified
-    FE_USER_DELETE            // Flow entry that is deleted
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowId.java b/src/main/java/net/onrc/onos/core/util/FlowId.java
deleted file mode 100644
index a889fb3..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowId.java
+++ /dev/null
@@ -1,126 +0,0 @@
-package net.onrc.onos.core.util;
-
-import java.math.BigInteger;
-
-import net.onrc.onos.core.util.serializers.FlowIdDeserializer;
-import net.onrc.onos.core.util.serializers.FlowIdSerializer;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/**
- * The class representing a Flow ID.
- * This class is immutable.
- */
-@JsonDeserialize(using = FlowIdDeserializer.class)
-@JsonSerialize(using = FlowIdSerializer.class)
-public final class FlowId implements Comparable<FlowId> {
-    private static final long INVALID = -1;
-    private final long value;
-
-    /**
-     * Default constructor.
-     */
-    public FlowId() {
-        this.value = FlowId.INVALID;
-    }
-
-    /**
-     * Constructor from an integer value.
-     *
-     * @param value the value to use.
-     */
-    public FlowId(long value) {
-        this.value = value;
-    }
-
-    /**
-     * Constructor from a string.
-     *
-     * @param value the value to use.
-     */
-    public FlowId(String value) {
-        //
-        // Use the help of BigInteger to parse strings representing
-        // large unsigned hex long values.
-        //
-        char c = 0;
-        if (value.length() > 2) {
-            c = value.charAt(1);
-        }
-        if ((c == 'x') || (c == 'X')) {
-            this.value = new BigInteger(value.substring(2), 16).longValue();
-        } else {
-            this.value = Long.decode(value);
-        }
-    }
-
-    /**
-     * Get the value of the Flow ID.
-     *
-     * @return the value of the Flow ID.
-     */
-    public long value() {
-        return value;
-    }
-
-    /**
-     * Test whether the Flow ID is valid.
-     *
-     * @return true if the Flow ID is valid, otherwise false.
-     */
-    @JsonIgnore
-    public boolean isValid() {
-        return (this.value() != FlowId.INVALID);
-    }
-
-    /**
-     * Convert the Flow ID value to a hexadecimal string.
-     *
-     * @return the Flow ID value to a hexadecimal string.
-     */
-    @Override
-    public String toString() {
-        return "0x" + Long.toHexString(this.value);
-    }
-
-    /**
-     * Compare two FlowId objects numerically using their Flow IDs.
-     *
-     * @return the value 0 if the Flow ID is equal to the argument's Flow ID;
-     * a value less than 0 if the Flow ID is numerically less than the
-     * argument's Flow ID; and a value greater than 0 if the Flow ID is
-     * numerically greater than the argument's Flow ID.
-     */
-    @Override
-    public int compareTo(FlowId o) {
-        return Long.valueOf(this.value).compareTo(o.value());
-    }
-
-    /**
-     * Test whether some other object is "equal to" this one.
-     *
-     * @param obj the reference object with which to compare.
-     * @return true if this object is the same as the obj argument; false
-     * otherwise.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof FlowId) {
-            FlowId other = (FlowId) obj;
-            return (this.value == other.value);
-        }
-        return false;
-    }
-
-    /**
-     * Get the hash code for the object.
-     *
-     * @return a hash code value for this object.
-     */
-    @Override
-    public int hashCode() {
-        return Long.valueOf(this.value).hashCode();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowPath.java b/src/main/java/net/onrc/onos/core/util/FlowPath.java
deleted file mode 100644
index 5cee39c..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowPath.java
+++ /dev/null
@@ -1,373 +0,0 @@
-package net.onrc.onos.core.util;
-
-import java.util.ArrayList;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Flow Path.
- */
-public class FlowPath implements Comparable<FlowPath> {
-    public static final int PRIORITY_DEFAULT = 32768;    // Default Flow Priority
-
-    private FlowId flowId;        // The Flow ID
-    private CallerId installerId;    // The Caller ID of the path installer
-    private FlowPathType flowPathType;    // The Flow Path type
-    private FlowPathUserState flowPathUserState; // The Flow Path User state
-    private FlowPathFlags flowPathFlags; // The Flow Path flags
-    private int idleTimeout;    // The Flow idle timeout
-    private int hardTimeout;    // The Flow hard timeout
-    private int priority;    // The Flow priority
-    private DataPath dataPath;    // The data path
-    private FlowEntryMatch flowEntryMatch; // Common Flow Entry Match for all
-    // Flow Entries
-    private FlowEntryActions flowEntryActions; // The Flow Entry Actions for
-    // the first Flow Entry
-
-    /**
-     * Default constructor.
-     */
-    public FlowPath() {
-        flowPathType = FlowPathType.FP_TYPE_UNKNOWN;
-        flowPathUserState = FlowPathUserState.FP_USER_UNKNOWN;
-        flowPathFlags = new FlowPathFlags();
-        priority = FlowPath.PRIORITY_DEFAULT;
-        dataPath = new DataPath();
-        flowEntryActions = new FlowEntryActions();
-    }
-
-    /**
-     * Get the flow path Flow ID.
-     *
-     * @return the flow path Flow ID.
-     */
-    @JsonProperty("flowId")
-    public FlowId flowId() {
-        return flowId;
-    }
-
-    /**
-     * Set the flow path Flow ID.
-     *
-     * @param flowId the flow path Flow ID to set.
-     */
-    @JsonProperty("flowId")
-    public void setFlowId(FlowId flowId) {
-        this.flowId = flowId;
-    }
-
-    /**
-     * Test whether the Flow ID is valid.
-     *
-     * @return true if the Flow ID is valid, otherwise false.
-     */
-    @JsonIgnore
-    public boolean isValidFlowId() {
-        if (this.flowId == null) {
-            return false;
-        }
-        return (this.flowId.isValid());
-    }
-
-    /**
-     * Get the Caller ID of the flow path installer.
-     *
-     * @return the Caller ID of the flow path installer.
-     */
-    @JsonProperty("installerId")
-    public CallerId installerId() {
-        return installerId;
-    }
-
-    /**
-     * Set the Caller ID of the flow path installer.
-     *
-     * @param installerId the Caller ID of the flow path installer.
-     */
-    @JsonProperty("installerId")
-    public void setInstallerId(CallerId installerId) {
-        this.installerId = installerId;
-    }
-
-    /**
-     * Get the flow path type.
-     *
-     * @return the flow path type.
-     */
-    @JsonProperty("flowPathType")
-    public FlowPathType flowPathType() {
-        return flowPathType;
-    }
-
-    /**
-     * Set the flow path type.
-     *
-     * @param flowPathType the flow path type to set.
-     */
-    @JsonProperty("flowPathType")
-    public void setFlowPathType(FlowPathType flowPathType) {
-        this.flowPathType = flowPathType;
-    }
-
-    /**
-     * Get the flow path user state.
-     *
-     * @return the flow path user state.
-     */
-    @JsonProperty("flowPathUserState")
-    public FlowPathUserState flowPathUserState() {
-        return flowPathUserState;
-    }
-
-    /**
-     * Set the flow path user state.
-     *
-     * @param flowPathUserState the flow path user state to set.
-     */
-    @JsonProperty("flowPathUserState")
-    public void setFlowPathUserState(FlowPathUserState flowPathUserState) {
-        this.flowPathUserState = flowPathUserState;
-    }
-
-    /**
-     * Get the flow path flags.
-     *
-     * @return the flow path flags.
-     */
-    @JsonProperty("flowPathFlags")
-    public FlowPathFlags flowPathFlags() {
-        return flowPathFlags;
-    }
-
-    /**
-     * Set the flow path flags.
-     *
-     * @param flowPathFlags the flow path flags to set.
-     */
-    @JsonProperty("flowPathFlags")
-    public void setFlowPathFlags(FlowPathFlags flowPathFlags) {
-        this.flowPathFlags = flowPathFlags;
-    }
-
-    /**
-     * Get the flow idle timeout in seconds.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @return the flow idle timeout.
-     */
-    @JsonProperty("idleTimeout")
-    public int idleTimeout() {
-        return idleTimeout;
-    }
-
-    /**
-     * Set the flow idle timeout in seconds.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @param idleTimeout the flow idle timeout to set.
-     */
-    @JsonProperty("idleTimeout")
-    public void setIdleTimeout(int idleTimeout) {
-        this.idleTimeout = 0xffff & idleTimeout;
-    }
-
-    /**
-     * Get the flow hard timeout in seconds.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @return the flow hard timeout.
-     */
-    @JsonProperty("hardTimeout")
-    public int hardTimeout() {
-        return hardTimeout;
-    }
-
-    /**
-     * Set the flow hard timeout.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     * If zero, the timeout is not set.
-     *
-     * @param hardTimeout the flow hard timeout to set.
-     */
-    @JsonProperty("hardTimeout")
-    public void setHardTimeout(int hardTimeout) {
-        this.hardTimeout = 0xffff & hardTimeout;
-    }
-
-    /**
-     * Get the flow priority.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     *
-     * @return the flow priority.
-     */
-    @JsonProperty("priority")
-    public int priority() {
-        return priority;
-    }
-
-    /**
-     * Set the flow priority.
-     * <p/>
-     * It should be an unsigned integer in the interval [0, 65535].
-     *
-     * @param priority the flow priority to set.
-     */
-    @JsonProperty("priority")
-    public void setPriority(int priority) {
-        this.priority = 0xffff & priority;
-    }
-
-    /**
-     * Get the flow path's data path.
-     *
-     * @return the flow path's data path.
-     */
-    @JsonProperty("dataPath")
-    public DataPath dataPath() {
-        return dataPath;
-    }
-
-    /**
-     * Set the flow path's data path.
-     *
-     * @param dataPath the flow path's data path to set.
-     */
-    @JsonProperty("dataPath")
-    public void setDataPath(DataPath dataPath) {
-        this.dataPath = dataPath;
-    }
-
-    /**
-     * Get the data path flow entries.
-     *
-     * @return the data path flow entries.
-     */
-    public ArrayList<FlowEntry> flowEntries() {
-        return this.dataPath.flowEntries();
-    }
-
-    /**
-     * Get the flow path's match conditions common for all Flow Entries.
-     *
-     * @return the flow path's match conditions common for all Flow Entries.
-     */
-    @JsonProperty("flowEntryMatch")
-    public FlowEntryMatch flowEntryMatch() {
-        return flowEntryMatch;
-    }
-
-    /**
-     * Set the flow path's match conditions common for all Flow Entries.
-     *
-     * @param flowEntryMatch the flow path's match conditions common for all
-     *                       Flow Entries.
-     */
-    @JsonProperty("flowEntryMatch")
-    public void setFlowEntryMatch(FlowEntryMatch flowEntryMatch) {
-        this.flowEntryMatch = flowEntryMatch;
-    }
-
-    /**
-     * Get the flow path's flow entry actions for the first Flow Entry.
-     *
-     * @return the flow path's flow entry actions for the first Flow Entry.
-     */
-    @JsonProperty("flowEntryActions")
-    public FlowEntryActions flowEntryActions() {
-        return flowEntryActions;
-    }
-
-    /**
-     * Set the flow path's flow entry actions for the first Flow Entry.
-     *
-     * @param flowEntryActions the flow path's flow entry actions for the first
-     *                         Flow Entry.
-     */
-    @JsonProperty("flowEntryActions")
-    public void setFlowEntryActions(FlowEntryActions flowEntryActions) {
-        this.flowEntryActions = flowEntryActions;
-    }
-
-    /**
-     * Convert the flow path to a string.
-     * <p/>
-     * The string has the following form:
-     * [flowId=XXX installerId=XXX flowPathType = XXX flowPathUserState = XXX
-     * flowPathFlags=XXX idleTimeout=XXX hardTimeout=XXX priority=XXX
-     * dataPath=XXX flowEntryMatch=XXX flowEntryActions=XXX]
-     *
-     * @return the flow path as a string.
-     */
-    @Override
-    public String toString() {
-        String ret = "[flowId=" + this.flowId.toString();
-        ret += " installerId=" + this.installerId.toString();
-        ret += " flowPathType=" + this.flowPathType;
-        ret += " flowPathUserState=" + this.flowPathUserState;
-        ret += " flowPathFlags=" + this.flowPathFlags.toString();
-        ret += " idleTimeout=" + this.idleTimeout;
-        ret += " hardTimeout=" + this.hardTimeout;
-        ret += " priority=" + this.priority;
-        if (dataPath != null) {
-            ret += " dataPath=" + this.dataPath.toString();
-        }
-        if (flowEntryMatch != null) {
-            ret += " flowEntryMatch=" + this.flowEntryMatch.toString();
-        }
-        if (flowEntryActions != null) {
-            ret += " flowEntryActions=" + this.flowEntryActions.toString();
-        }
-        ret += "]";
-        return ret;
-    }
-
-    /**
-     * Compares this object with the specified object for order.
-     * NOTE: The test is based on the Flow ID.
-     *
-     * @param f the object to be compared.
-     * @return a negative integer, zero, or a positive integer as this object
-     * is less than, equal to, or greater than the specified object.
-     */
-    @Override
-    public int compareTo(FlowPath f) {
-        return (this.flowId.compareTo(f.flowId()));
-    }
-
-    /**
-     * Test whether some other object is "equal to" this one.
-     * NOTE: The test is based on the Flow ID.
-     *
-     * @param obj the reference object with which to compare.
-     * @return true if this object is the same as the obj argument; false
-     * otherwise.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (obj instanceof FlowPath) {
-            FlowPath other = (FlowPath) obj;
-            return (this.flowId.equals(other.flowId()));
-        }
-        return false;
-    }
-
-    /**
-     * Get the hash code for the object.
-     * NOTE: The computation is based on the Flow ID.
-     *
-     * @return a hash code value for this object.
-     */
-    @Override
-    public int hashCode() {
-        return this.flowId.hashCode();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowPathFlags.java b/src/main/java/net/onrc/onos/core/util/FlowPathFlags.java
deleted file mode 100644
index 138f961..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowPathFlags.java
+++ /dev/null
@@ -1,137 +0,0 @@
-package net.onrc.onos.core.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Flow Path flags.
- */
-public class FlowPathFlags {
-    private long flags;
-
-    // Discard the first-hop Flow Entry
-    public static final long DISCARD_FIRST_HOP_ENTRY = (1 << 0);
-
-    // Keep only the first-hop Flow Entry
-    public static final long KEEP_ONLY_FIRST_HOP_ENTRY = (1 << 1);
-
-    /**
-     * Default constructor.
-     */
-    public FlowPathFlags() {
-        this.flags = 0;
-    }
-
-    /**
-     * Constructor for given flags.
-     *
-     * @param flags the flags value to set.
-     */
-    public FlowPathFlags(long flags) {
-        this.flags = flags;
-    }
-
-    /**
-     * Constructor for given flags as a string.
-     * <p/>
-     * The string value should contain the name of each flags to set. E.g.:
-     * "DISCARD_FIRST_HOP_ENTRY,KEEP_ONLY_FIRST_HOP_ENTRY"
-     *
-     * @param flagsStr the string value of the flags to set.
-     */
-    public FlowPathFlags(String flagsStr) {
-        this.setFlagsStr(flagsStr);
-    }
-
-    /**
-     * Get the flags.
-     *
-     * @return the flags.
-     */
-    @JsonProperty("flags")
-    public long flags() {
-        return flags;
-    }
-
-    /**
-     * Set the flags.
-     *
-     * @param flags the flags value to set.
-     */
-    @JsonProperty("flags")
-    public void setFlags(long flags) {
-        this.flags = flags;
-    }
-
-    /**
-     * Set the flags as a string.
-     * <p/>
-     * The string value should contain the name of each flags to set. E.g.:
-     * "DISCARD_FIRST_HOP_ENTRY,KEEP_ONLY_FIRST_HOP_ENTRY"
-     *
-     * @param flagsStr the string value of the flags to set.
-     */
-    @JsonProperty("flagsStr")
-    public void setFlagsStr(String flagsStr) {
-        this.flags = 0L;
-
-        // Test all flags
-        if (flagsStr.contains("DISCARD_FIRST_HOP_ENTRY")) {
-            this.flags |= DISCARD_FIRST_HOP_ENTRY;
-        }
-        if (flagsStr.contains("KEEP_ONLY_FIRST_HOP_ENTRY")) {
-            this.flags |= KEEP_ONLY_FIRST_HOP_ENTRY;
-        }
-    }
-
-    /**
-     * Test whether the DISCARD_FIRST_HOP_ENTRY flag is set.
-     *
-     * @return true if the DISCARD_FIRST_HOP_ENTRY flag is set,
-     * otherwise false.
-     */
-    public boolean isDiscardFirstHopEntry() {
-        return ((flags & DISCARD_FIRST_HOP_ENTRY) != 0);
-    }
-
-    /**
-     * Test whether the KEEP_ONLY_FIRST_HOP_ENTRY flag is set.
-     *
-     * @return true if the KEEP_ONLY_FIRST_HOP_ENTRY flag is set,
-     * otherwise false.
-     */
-    public boolean isKeepOnlyFirstHopEntry() {
-        return ((flags & KEEP_ONLY_FIRST_HOP_ENTRY) != 0);
-    }
-
-    /**
-     * Convert the Flow Path Flags to a string.
-     * <p/>
-     * The string has the following form:
-     * [flags=DISCARD_FIRST_HOP_ENTRY,KEEP_ONLY_FIRST_HOP_ENTRY]
-     *
-     * @return the Flow Path flags as a string.
-     */
-    @Override
-    public String toString() {
-        String flagsStr = null;
-        String ret = "[flags=";
-
-        // Test all flags
-        if ((this.flags & DISCARD_FIRST_HOP_ENTRY) != 0) {
-            flagsStr += "DISCARD_FIRST_HOP_ENTRY";
-        }
-        if ((this.flags & KEEP_ONLY_FIRST_HOP_ENTRY) != 0) {
-            if (flagsStr != null) {
-                flagsStr += ",";
-            }
-            flagsStr += "KEEP_ONLY_FIRST_HOP_ENTRY";
-        }
-        if (flagsStr != null) {
-            ret += flagsStr;
-        }
-        ret += "]";
-
-        return ret;
-    }
-
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowPathType.java b/src/main/java/net/onrc/onos/core/util/FlowPathType.java
deleted file mode 100644
index f18938d..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowPathType.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.onrc.onos.core.util;
-
-/**
- * The Flow Path types.
- */
-public enum FlowPathType {
-    FP_TYPE_UNKNOWN,            // Initialization value: state unknown
-    FP_TYPE_SHORTEST_PATH,        // Shortest path flow
-    FP_TYPE_EXPLICIT_PATH        // Flow path with explicit flow entries
-}
diff --git a/src/main/java/net/onrc/onos/core/util/FlowPathUserState.java b/src/main/java/net/onrc/onos/core/util/FlowPathUserState.java
deleted file mode 100644
index 4b637d1..0000000
--- a/src/main/java/net/onrc/onos/core/util/FlowPathUserState.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.onrc.onos.core.util;
-
-/**
- * The Flow Path state as set by the user (via the ONOS API).
- */
-public enum FlowPathUserState {
-    FP_USER_UNKNOWN,            // Initialization value: state unknown
-    FP_USER_ADD,            // Flow path that is added
-    FP_USER_MODIFY,            // Flow path that is modified
-    FP_USER_DELETE            // Flow path that is deleted
-}
diff --git a/src/main/java/net/onrc/onos/core/util/Switch.java b/src/main/java/net/onrc/onos/core/util/Switch.java
deleted file mode 100644
index 8ea1184..0000000
--- a/src/main/java/net/onrc/onos/core/util/Switch.java
+++ /dev/null
@@ -1,111 +0,0 @@
-package net.onrc.onos.core.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing a Switch.
- * This class is almost immutable: the switch state is mutable.
- * NOTE: Currently this class is (almost) not used.
- */
-public final class Switch {
-    /**
-     * The Switch state.
-     */
-    public enum SwitchState {
-        INACTIVE,
-        ACTIVE,
-    }
-
-    private final Dpid dpid;            // The DPID of the switch
-    private SwitchState state;          // The state of the switch
-
-    /**
-     * Default constructor.
-     * <p/>
-     * NOTE: The default state for the switch is INACTIVE.
-     */
-    public Switch() {
-        this.dpid = new Dpid();
-        this.state = SwitchState.INACTIVE;
-    }
-
-    /**
-     * Constructor for a given DPID.
-     * <p/>
-     * NOTE: The state for the switch with a given DPID is ACTIVE.
-     *
-     * @param dpid the DPID to use.
-     */
-    public Switch(Dpid dpid) {
-        this.dpid = dpid;
-        this.state = SwitchState.ACTIVE;
-    }
-
-    /**
-     * Constructor for a given DPID and Switch State.
-     *
-     * @param dpid  the DPID to use.
-     * @param state the Switch State to use.
-     */
-    public Switch(Dpid dpid, SwitchState state) {
-        this.dpid = dpid;
-        this.state = state;
-    }
-
-    /**
-     * Get the DPID.
-     *
-     * @return the DPID.
-     */
-    @JsonProperty("dpid")
-    public Dpid dpid() {
-        return dpid;
-    }
-
-    /**
-     * Get the state.
-     *
-     * @return the state.
-     */
-    @JsonProperty("state")
-    public SwitchState state() {
-        return state;
-    }
-
-    /**
-     * Set the state.
-     *
-     * @param state the state to use.
-     */
-    @JsonProperty("state")
-    public void setState(SwitchState state) {
-        this.state = state;
-    }
-
-    /**
-     * Set the Switch State to ACTIVE.
-     */
-    public void setStateActive() {
-        this.state = SwitchState.ACTIVE;
-    }
-
-    /**
-     * Set the Switch State to INACTIVE.
-     */
-    public void setStateInactive() {
-        this.state = SwitchState.INACTIVE;
-    }
-
-    /**
-     * Convert the Switch value to a string.
-     * <p/>
-     * The string has the following form:
-     * dpid/state
-     *
-     * @return the Switch value as a string.
-     */
-    @Override
-    public String toString() {
-        return this.dpid.toString() + "/" + this.state.toString();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdDeserializer.java
deleted file mode 100644
index eadb2ce..0000000
--- a/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.core.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.core.util.FlowEntryId;
-
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.JsonToken;
-import org.codehaus.jackson.map.DeserializationContext;
-import org.codehaus.jackson.map.JsonDeserializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Deserialize a Flow Entry ID from a string.
- */
-public class FlowEntryIdDeserializer extends JsonDeserializer<FlowEntryId> {
-
-    private static final Logger log = LoggerFactory.getLogger(FlowEntryIdDeserializer.class);
-
-    @Override
-    public FlowEntryId deserialize(JsonParser jp,
-                                   DeserializationContext ctxt)
-            throws IOException, JsonProcessingException {
-
-        FlowEntryId flowEntryId = null;
-
-        jp.nextToken();        // Move to JsonToken.START_OBJECT
-        while (jp.nextToken() != JsonToken.END_OBJECT) {
-            String fieldname = jp.getCurrentName();
-            if ("value".equals(fieldname)) {
-                String value = jp.getText();
-                log.debug("Fieldname: " + fieldname + " Value: " + value);
-                flowEntryId = new FlowEntryId(value);
-            }
-        }
-        return flowEntryId;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdSerializer.java
deleted file mode 100644
index bc91f46..0000000
--- a/src/main/java/net/onrc/onos/core/util/serializers/FlowEntryIdSerializer.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package net.onrc.onos.core.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.core.util.FlowEntryId;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize a Flow Entry ID as a hexadecimal string.
- */
-public class FlowEntryIdSerializer extends JsonSerializer<FlowEntryId> {
-
-    @Override
-    public void serialize(FlowEntryId flowEntryId, JsonGenerator jGen,
-                          SerializerProvider serializer)
-            throws IOException, JsonProcessingException {
-        jGen.writeString(flowEntryId.toString());
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowIdDeserializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowIdDeserializer.java
deleted file mode 100644
index ecdf41a..0000000
--- a/src/main/java/net/onrc/onos/core/util/serializers/FlowIdDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.core.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.core.util.FlowId;
-
-import org.codehaus.jackson.JsonParser;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.JsonToken;
-import org.codehaus.jackson.map.DeserializationContext;
-import org.codehaus.jackson.map.JsonDeserializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Deserialize a Flow ID from a string.
- */
-public class FlowIdDeserializer extends JsonDeserializer<FlowId> {
-
-    private static final Logger log = LoggerFactory.getLogger(FlowIdDeserializer.class);
-
-    @Override
-    public FlowId deserialize(JsonParser jp,
-                              DeserializationContext ctxt)
-            throws IOException, JsonProcessingException {
-
-        FlowId flowId = null;
-
-        jp.nextToken();        // Move to JsonToken.START_OBJECT
-        while (jp.nextToken() != JsonToken.END_OBJECT) {
-            String fieldname = jp.getCurrentName();
-            if ("value".equals(fieldname)) {
-                String value = jp.getText();
-                log.debug("Fieldname: {} Value: {}", fieldname, value);
-                flowId = new FlowId(value);
-            }
-        }
-        return flowId;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/FlowIdSerializer.java b/src/main/java/net/onrc/onos/core/util/serializers/FlowIdSerializer.java
deleted file mode 100644
index 37a3e45..0000000
--- a/src/main/java/net/onrc/onos/core/util/serializers/FlowIdSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.core.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.core.util.FlowId;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize a Flow ID as a hexadecimal string.
- */
-public class FlowIdSerializer extends JsonSerializer<FlowId> {
-
-    @Override
-    public void serialize(FlowId flowId, JsonGenerator jGen,
-                          SerializerProvider serializer)
-            throws IOException, JsonProcessingException {
-        jGen.writeStartObject();
-        jGen.writeStringField("value", flowId.toString());
-        jGen.writeEndObject();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
index 679e7f9..e48b01b 100644
--- a/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
+++ b/src/main/java/net/onrc/onos/core/util/serializers/KryoFactory.java
@@ -37,22 +37,7 @@
 import net.onrc.onos.core.topology.TopologyBatchOperation;
 import net.onrc.onos.core.topology.TopologyElement;
 import net.onrc.onos.core.topology.TopologyEvent;
-import net.onrc.onos.core.util.CallerId;
-import net.onrc.onos.core.util.DataPath;
 import net.onrc.onos.core.util.Dpid;
-import net.onrc.onos.core.util.FlowEntry;
-import net.onrc.onos.core.util.FlowEntryAction;
-import net.onrc.onos.core.util.FlowEntryActions;
-import net.onrc.onos.core.util.FlowEntryErrorState;
-import net.onrc.onos.core.util.FlowEntryId;
-import net.onrc.onos.core.util.FlowEntryMatch;
-import net.onrc.onos.core.util.FlowEntrySwitchState;
-import net.onrc.onos.core.util.FlowEntryUserState;
-import net.onrc.onos.core.util.FlowId;
-import net.onrc.onos.core.util.FlowPath;
-import net.onrc.onos.core.util.FlowPathFlags;
-import net.onrc.onos.core.util.FlowPathType;
-import net.onrc.onos.core.util.FlowPathUserState;
 import net.onrc.onos.core.util.IPv4;
 import net.onrc.onos.core.util.IPv4Net;
 import net.onrc.onos.core.util.IPv6;
@@ -60,7 +45,6 @@
 import net.onrc.onos.core.util.LinkTuple;
 import net.onrc.onos.core.util.OnosInstanceId;
 import net.onrc.onos.core.util.PortNumber;
-import net.onrc.onos.core.util.Switch;
 import net.onrc.onos.core.util.SwitchPort;
 
 import com.esotericsoftware.kryo.Kryo;
@@ -165,33 +149,7 @@
         kryo.register(ArrayList.class);
 
         // FlowPath and related classes
-        kryo.register(CallerId.class);
-        kryo.register(DataPath.class);
         kryo.register(Dpid.class);
-        kryo.register(FlowEntryAction.class);
-        kryo.register(FlowEntryAction.ActionEnqueue.class);
-        kryo.register(FlowEntryAction.ActionOutput.class);
-        kryo.register(FlowEntryAction.ActionSetEthernetAddr.class);
-        kryo.register(FlowEntryAction.ActionSetIpToS.class);
-        kryo.register(FlowEntryAction.ActionSetIPv4Addr.class);
-        kryo.register(FlowEntryAction.ActionSetTcpUdpPort.class);
-        kryo.register(FlowEntryAction.ActionSetVlanId.class);
-        kryo.register(FlowEntryAction.ActionSetVlanPriority.class);
-        kryo.register(FlowEntryAction.ActionStripVlan.class);
-        kryo.register(FlowEntryAction.ActionValues.class);
-        kryo.register(FlowEntryActions.class);
-        kryo.register(FlowEntryErrorState.class);
-        kryo.register(FlowEntryId.class);
-        kryo.register(FlowEntry.class);
-        kryo.register(FlowEntryMatch.class);
-        kryo.register(FlowEntryMatch.Field.class);
-        kryo.register(FlowEntrySwitchState.class);
-        kryo.register(FlowEntryUserState.class);
-        kryo.register(FlowId.class);
-        kryo.register(FlowPath.class);
-        kryo.register(FlowPathFlags.class);
-        kryo.register(FlowPathType.class);
-        kryo.register(FlowPathUserState.class);
         kryo.register(IPv4.class);
         kryo.register(IPv4Net.class);
         kryo.register(IPv6.class);
@@ -199,7 +157,6 @@
         kryo.register(byte[].class);
         kryo.register(MACAddress.class);
         kryo.register(PortNumber.class);
-        kryo.register(Switch.class);
         kryo.register(SwitchPort.class);
         kryo.register(LinkTuple.class);
 
diff --git a/src/test/java/net/onrc/onos/core/util/FlowEntryActionTest.java b/src/test/java/net/onrc/onos/core/util/FlowEntryActionTest.java
deleted file mode 100644
index fbba92c..0000000
--- a/src/test/java/net/onrc/onos/core/util/FlowEntryActionTest.java
+++ /dev/null
@@ -1,429 +0,0 @@
-package net.onrc.onos.core.util;
-
-import static org.junit.Assert.assertEquals;
-import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.core.util.FlowEntryAction.ActionEnqueue;
-import net.onrc.onos.core.util.FlowEntryAction.ActionOutput;
-import net.onrc.onos.core.util.FlowEntryAction.ActionSetEthernetAddr;
-import net.onrc.onos.core.util.FlowEntryAction.ActionSetIPv4Addr;
-import net.onrc.onos.core.util.FlowEntryAction.ActionSetIpToS;
-import net.onrc.onos.core.util.FlowEntryAction.ActionSetTcpUdpPort;
-import net.onrc.onos.core.util.FlowEntryAction.ActionSetVlanId;
-import net.onrc.onos.core.util.FlowEntryAction.ActionSetVlanPriority;
-import net.onrc.onos.core.util.FlowEntryAction.ActionStripVlan;
-
-import org.junit.Test;
-import org.projectfloodlight.openflow.types.OFPort;
-
-public class FlowEntryActionTest {
-
-    @Test
-    public void testSetActionOutputActionOutput() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionOutput actout = new FlowEntryAction.ActionOutput(new PortNumber((short) 42));
-        act.setActionOutput(actout);
-
-        assertEquals("action output", FlowEntryAction.ActionValues.ACTION_OUTPUT, act.actionType());
-        assertEquals("actionOutput port should be the same", actout.port(), act.actionOutput().port());
-        assertEquals("actionOutput maxlen should be the same", actout.maxLen(), act.actionOutput().maxLen());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionOutputPort() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionOutput(new PortNumber((short) 42));
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionOutputToController() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionOutputToController((short) 0);
-
-        FlowEntryAction actCopy = new FlowEntryAction();
-        actCopy.setActionOutput(new PortNumber(OFPort.CONTROLLER.getShortPortNumber()));
-
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetVlanIdActionSetVlanId() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionSetVlanId actVlan = new FlowEntryAction.ActionSetVlanId((short) 42);
-        act.setActionSetVlanId(actVlan);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_VLAN_VID, act.actionType());
-        assertEquals("vlanid should be the same", actVlan.vlanId(), act.actionSetVlanId().vlanId());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetVlanIdShort() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionSetVlanId((short) 42);
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetVlanPriorityActionSetVlanPriority() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionSetVlanPriority actVlan = new FlowEntryAction.ActionSetVlanPriority((byte) 42);
-        act.setActionSetVlanPriority(actVlan);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_VLAN_PCP, act.actionType());
-        assertEquals("vlan priority should be the same", actVlan.vlanPriority(),
-                act.actionSetVlanPriority().vlanPriority());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetVlanPriorityByte() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionSetVlanPriority((byte) 42);
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionStripVlanActionStripVlan() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionStripVlan actVlan = new FlowEntryAction.ActionStripVlan();
-        act.setActionStripVlan(actVlan);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_STRIP_VLAN, act.actionType());
-        assertEquals("vlanid should be the same", actVlan.stripVlan(), act.actionStripVlan().stripVlan());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionStripVlanBoolean() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionStripVlan(true);
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetEthernetSrcAddrActionSetEthernetAddr() {
-        FlowEntryAction act = new FlowEntryAction();
-        byte[] mac = {1, 2, 3, 4, 5, 6};
-        ActionSetEthernetAddr setEth = new FlowEntryAction.ActionSetEthernetAddr(new MACAddress(mac));
-        act.setActionSetEthernetSrcAddr(setEth);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_DL_SRC, act.actionType());
-        assertEquals("addr should be the same", setEth.addr(), act.actionSetEthernetSrcAddr().addr());
-
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetEthernetSrcAddrMACAddress() {
-        FlowEntryAction act = new FlowEntryAction();
-        byte[] mac = {1, 2, 3, 4, 5, 6};
-        act.setActionSetEthernetSrcAddr(new MACAddress(mac));
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetEthernetDstAddrActionSetEthernetAddr() {
-        FlowEntryAction act = new FlowEntryAction();
-        byte[] mac = {1, 2, 3, 4, 5, 6};
-        ActionSetEthernetAddr setEth = new FlowEntryAction.ActionSetEthernetAddr(new MACAddress(mac));
-        act.setActionSetEthernetDstAddr(setEth);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_DL_DST, act.actionType());
-        assertEquals("addr should be the same", setEth.addr(), act.actionSetEthernetDstAddr().addr());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetEthernetDstAddrMACAddress() {
-        FlowEntryAction act = new FlowEntryAction();
-        byte[] mac = {1, 2, 3, 4, 5, 6};
-        act.setActionSetEthernetDstAddr(new MACAddress(mac));
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetIPv4SrcAddrActionSetIPv4Addr() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionSetIPv4Addr setIp = new FlowEntryAction.ActionSetIPv4Addr(new IPv4("127.0.0.1"));
-        act.setActionSetIPv4SrcAddr(setIp);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_NW_SRC, act.actionType());
-        assertEquals("addr should be the same", setIp.addr(), act.actionSetIPv4SrcAddr().addr());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetIPv4SrcAddrIPv4() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionSetIPv4SrcAddr(new IPv4("127.0.0.1"));
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetIPv4DstAddrActionSetIPv4Addr() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionSetIPv4Addr setIp = new FlowEntryAction.ActionSetIPv4Addr(new IPv4("127.0.0.1"));
-        act.setActionSetIPv4DstAddr(setIp);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_NW_DST, act.actionType());
-        assertEquals("addr should be the same", setIp.addr(), act.actionSetIPv4DstAddr().addr());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetIPv4DstAddrIPv4() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionSetIPv4DstAddr(new IPv4("127.0.0.1"));
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetIpToSActionSetIpToS() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionSetIpToS setIpTos = new FlowEntryAction.ActionSetIpToS((byte) 42);
-        act.setActionSetIpToS(setIpTos);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_NW_TOS, act.actionType());
-        assertEquals("tos should be the same", setIpTos.ipToS(), act.actionSetIpToS().ipToS());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetIpToSByte() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionSetIpToS((byte) 1);
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetTcpUdpSrcPortActionSetTcpUdpPort() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionSetTcpUdpPort setPorts = new FlowEntryAction.ActionSetTcpUdpPort((short) 42);
-        act.setActionSetTcpUdpSrcPort(setPorts);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_TP_SRC, act.actionType());
-        assertEquals("port should be the same", setPorts.port(), act.actionSetTcpUdpSrcPort().port());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetTcpUdpSrcPortShort() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionSetTcpUdpSrcPort((short) 1);
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetTcpUdpDstPortActionSetTcpUdpPort() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionSetTcpUdpPort setPorts = new FlowEntryAction.ActionSetTcpUdpPort((short) 42);
-        act.setActionSetTcpUdpDstPort(setPorts);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_SET_TP_DST, act.actionType());
-        assertEquals("port should be the same", setPorts.port(), act.actionSetTcpUdpDstPort().port());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionSetTcpUdpDstPortShort() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionSetTcpUdpDstPort((short) 1);
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionEnqueueActionEnqueue() {
-        FlowEntryAction act = new FlowEntryAction();
-        ActionEnqueue enq = new FlowEntryAction.ActionEnqueue(new PortNumber((short) 42), 1);
-        act.setActionEnqueue(enq);
-
-        assertEquals("action type", FlowEntryAction.ActionValues.ACTION_ENQUEUE, act.actionType());
-        assertEquals("port should be the same", enq.port(), act.actionEnqueue().port());
-        assertEquals("queue id should be the same", enq.queueId(), act.actionEnqueue().queueId());
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-    @Test
-    public void testSetActionEnqueuePortInt() {
-        FlowEntryAction act = new FlowEntryAction();
-        act.setActionEnqueue(new PortNumber((short) 42), 1);
-
-        FlowEntryAction actCopy = new FlowEntryAction(act);
-        FlowEntryAction actCopy2 = new FlowEntryAction(act.toString());
-
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy.toString());
-        assertEquals("toString must match between copies", act.toString(),
-                actCopy2.toString());
-    }
-
-}
diff --git a/src/test/java/net/onrc/onos/core/util/FlowEntryMatchTest.java b/src/test/java/net/onrc/onos/core/util/FlowEntryMatchTest.java
deleted file mode 100644
index 3f84c09..0000000
--- a/src/test/java/net/onrc/onos/core/util/FlowEntryMatchTest.java
+++ /dev/null
@@ -1,320 +0,0 @@
-package net.onrc.onos.core.util;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import net.floodlightcontroller.util.MACAddress;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class FlowEntryMatchTest {
-
-    FlowEntryMatch match;
-
-    PortNumber inport = new PortNumber((short) 1);
-    byte[] byte1 = {1, 2, 3, 4, 5, 6};
-    byte[] byte2 = {6, 5, 4, 3, 2, 1};
-    MACAddress mac1 = new MACAddress(byte1);
-    MACAddress mac2 = new MACAddress(byte2);
-    Short ether = Short.valueOf((short) 2);
-    Short vlanid = Short.valueOf((short) 3);
-    Byte vlanprio = Byte.valueOf((byte) 4);
-    IPv4Net ip1 = new IPv4Net("127.0.0.1/32");
-    IPv4Net ip2 = new IPv4Net("127.0.0.2/32");
-    Byte ipproto = Byte.valueOf((byte) 5);
-    Byte ipToS = Byte.valueOf((byte) 6);
-    Short tport1 = Short.valueOf((short) 7);
-    Short tport2 = Short.valueOf((short) 8);
-
-    @Before
-    public void setUp() throws Exception {
-        match = new FlowEntryMatch();
-        match.enableInPort(inport);
-        match.enableSrcMac(mac1);
-        match.enableDstMac(mac2);
-        match.enableEthernetFrameType(ether);
-        match.enableVlanId(vlanid);
-        match.enableVlanPriority(vlanprio);
-        match.enableSrcIPv4Net(ip1);
-        match.enableDstIPv4Net(ip2);
-        match.enableIpProto(ipproto);
-        match.enableIpToS(ipToS);
-        match.enableSrcTcpUdpPort(tport1);
-        match.enableDstTcpUdpPort(tport2);
-    }
-
-    @Test
-    public void testFlowEntryMatch() {
-        FlowEntryMatch def = new FlowEntryMatch();
-
-        assertEquals("default null", null, def.inPort());
-        assertEquals("default null", null, def.srcMac());
-        assertEquals("default null", null, def.dstMac());
-        assertEquals("default null", null, def.ethernetFrameType());
-        assertEquals("default null", null, def.vlanId());
-        assertEquals("default null", null, def.vlanPriority());
-        assertEquals("default null", null, def.srcIPv4Net());
-        assertEquals("default null", null, def.dstIPv4Net());
-        assertEquals("default null", null, def.ipProto());
-        assertEquals("default null", null, def.ipToS());
-        assertEquals("default null", null, def.srcTcpUdpPort());
-        assertEquals("default null", null, def.dstTcpUdpPort());
-    }
-
-    @Test
-    public void testFlowEntryMatchFlowEntryMatch() {
-        FlowEntryMatch defBase = new FlowEntryMatch();
-        FlowEntryMatch def = new FlowEntryMatch(defBase);
-
-        assertEquals("default null", null, def.inPort());
-        assertEquals("default null", null, def.srcMac());
-        assertEquals("default null", null, def.dstMac());
-        assertEquals("default null", null, def.ethernetFrameType());
-        assertEquals("default null", null, def.vlanId());
-        assertEquals("default null", null, def.vlanPriority());
-        assertEquals("default null", null, def.srcIPv4Net());
-        assertEquals("default null", null, def.dstIPv4Net());
-        assertEquals("default null", null, def.ipProto());
-        assertEquals("default null", null, def.ipToS());
-        assertEquals("default null", null, def.srcTcpUdpPort());
-        assertEquals("default null", null, def.dstTcpUdpPort());
-
-        FlowEntryMatch copy = new FlowEntryMatch(match);
-
-        assertEquals("inport", inport, copy.inPort());
-        assertEquals("mac1", mac1, copy.srcMac());
-        assertEquals("mac2", mac2, copy.dstMac());
-        assertEquals("ether", ether, copy.ethernetFrameType());
-        assertEquals("vlan id", vlanid, copy.vlanId());
-        assertEquals("vlan prio", vlanprio, copy.vlanPriority());
-        assertEquals("ip1", ip1, copy.srcIPv4Net());
-        assertEquals("ip2", ip2, copy.dstIPv4Net());
-        assertEquals("ip proto", ipproto, copy.ipProto());
-        assertEquals("tos", ipToS, copy.ipToS());
-        assertEquals("src port", tport1, copy.srcTcpUdpPort());
-        assertEquals("dst port", tport2, copy.dstTcpUdpPort());
-
-    }
-
-    @Test
-    public void testInPort() {
-        assertEquals("inport", inport, match.inPort());
-    }
-
-    @Test
-    public void testDisableInPort() {
-        match.disableInPort();
-        assertEquals("inport", null, match.inPort());
-        assertFalse(match.matchInPort());
-    }
-
-    @Test
-    public void testMatchInPort() {
-        assertTrue(match.matchInPort());
-    }
-
-    @Test
-    public void testSrcMac() {
-        assertEquals("mac1", mac1, match.srcMac());
-    }
-
-    @Test
-    public void testDisableSrcMac() {
-        match.disableSrcMac();
-        assertEquals("srcMac", null, match.srcMac());
-        assertFalse(match.matchSrcMac());
-    }
-
-    @Test
-    public void testMatchSrcMac() {
-        assertTrue(match.matchSrcMac());
-    }
-
-    @Test
-    public void testDstMac() {
-        assertEquals("mac2", mac2, match.dstMac());
-    }
-
-    @Test
-    public void testDisableDstMac() {
-        match.disableDstMac();
-        assertEquals("dstMac", null, match.dstMac());
-        assertFalse(match.matchDstMac());
-    }
-
-    @Test
-    public void testMatchDstMac() {
-        assertTrue(match.matchDstMac());
-    }
-
-    @Test
-    public void testEthernetFrameType() {
-        assertEquals("ether", ether, match.ethernetFrameType());
-    }
-
-    @Test
-    public void testDisableEthernetFrameType() {
-        match.disableEthernetFrameType();
-        assertEquals("ethernetFrameType", null, match.ethernetFrameType());
-        assertFalse(match.matchEthernetFrameType());
-    }
-
-    @Test
-    public void testMatchEthernetFrameType() {
-        assertTrue(match.matchEthernetFrameType());
-    }
-
-    @Test
-    public void testVlanId() {
-        assertEquals("vlan id", vlanid, match.vlanId());
-    }
-
-    @Test
-    public void testDisableVlanId() {
-        match.disableVlanId();
-        assertEquals("vlanId", null, match.vlanId());
-        assertFalse(match.matchVlanId());
-    }
-
-    @Test
-    public void testMatchVlanId() {
-        assertTrue(match.matchVlanId());
-    }
-
-    @Test
-    public void testVlanPriority() {
-        assertEquals("vlan prio", vlanprio, match.vlanPriority());
-    }
-
-    @Test
-    public void testDisableVlanPriority() {
-        match.disableVlanPriority();
-        assertEquals("vlanPriority", null, match.vlanPriority());
-        assertFalse(match.matchVlanPriority());
-    }
-
-    @Test
-    public void testMatchVlanPriority() {
-        assertTrue(match.matchVlanPriority());
-    }
-
-    @Test
-    public void testSrcIPv4Net() {
-        assertEquals("ip1", ip1, match.srcIPv4Net());
-    }
-
-    @Test
-    public void testDisableSrcIPv4Net() {
-        match.disableSrcIPv4Net();
-        assertEquals("srcIPv4Net", null, match.srcIPv4Net());
-        assertFalse(match.matchSrcIPv4Net());
-    }
-
-    @Test
-    public void testMatchSrcIPv4Net() {
-        assertTrue(match.matchSrcIPv4Net());
-    }
-
-    @Test
-    public void testDstIPv4Net() {
-        assertEquals("ip2", ip2, match.dstIPv4Net());
-    }
-
-    @Test
-    public void testDisableDstIPv4Net() {
-        match.disableDstIPv4Net();
-        assertEquals("dstIPv4Net", null, match.dstIPv4Net());
-        assertFalse(match.matchDstIPv4Net());
-    }
-
-    @Test
-    public void testMatchDstIPv4Net() {
-        assertTrue(match.matchDstIPv4Net());
-    }
-
-    @Test
-    public void testIpProto() {
-        assertEquals("ip proto", ipproto, match.ipProto());
-    }
-
-    @Test
-    public void testDisableIpProto() {
-        match.disableIpProto();
-        assertEquals("ipProto", null, match.ipProto());
-        assertFalse(match.matchIpProto());
-    }
-
-    @Test
-    public void testMatchIpProto() {
-        assertTrue(match.matchIpProto());
-    }
-
-    @Test
-    public void testIpToS() {
-        assertEquals("tos", ipToS, match.ipToS());
-    }
-
-    @Test
-    public void testDisableIpToS() {
-        match.disableIpToS();
-        assertEquals("ipToS", null, match.ipToS());
-        assertFalse(match.matchIpToS());
-    }
-
-    @Test
-    public void testMatchIpToS() {
-        assertTrue(match.matchIpToS());
-    }
-
-    @Test
-    public void testSrcTcpUdpPort() {
-        assertEquals("src port", tport1, match.srcTcpUdpPort());
-    }
-
-    @Test
-    public void testDisableSrcTcpUdpPort() {
-        match.disableSrcTcpUdpPort();
-        assertEquals("srcTcpUdpPort", null, match.srcTcpUdpPort());
-        assertFalse(match.matchSrcTcpUdpPort());
-    }
-
-    @Test
-    public void testMatchSrcTcpUdpPort() {
-        assertTrue(match.matchSrcTcpUdpPort());
-    }
-
-    @Test
-    public void testDstTcpUdpPort() {
-        assertEquals("dst port", tport2, match.dstTcpUdpPort());
-    }
-
-    @Test
-    public void testDisableDstTcpUdpPort() {
-        match.disableDstTcpUdpPort();
-        assertEquals("dstTcpUdpPort", null, match.dstTcpUdpPort());
-        assertFalse(match.matchDstTcpUdpPort());
-    }
-
-    @Test
-    public void testMatchDstTcpUdpPort() {
-        assertTrue(match.matchDstTcpUdpPort());
-    }
-
-    @Test
-    public void testToString() {
-        FlowEntryMatch def = new FlowEntryMatch();
-        assertEquals("match default", def.toString(), "[]");
-
-        assertEquals(
-                "match set",
-                match.toString(),
-                "[inPort=1 srcMac=01:02:03:04:05:06 dstMac=06:05:04:03:02:01"
-                + " ethernetFrameType=2 vlanId=3 vlanPriority=4"
-                + " srcIPv4Net=127.0.0.1/32"
-                + " dstIPv4Net=127.0.0.2/32 ipProto=5 ipToS=6"
-                + " srcTcpUdpPort=7 dstTcpUdpPort=8]");
-    }
-
-}
diff --git a/src/test/java/net/onrc/onos/core/util/FlowEntryTest.java b/src/test/java/net/onrc/onos/core/util/FlowEntryTest.java
deleted file mode 100644
index 769198a..0000000
--- a/src/test/java/net/onrc/onos/core/util/FlowEntryTest.java
+++ /dev/null
@@ -1,300 +0,0 @@
-package net.onrc.onos.core.util;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import net.floodlightcontroller.util.MACAddress;
-
-import org.junit.Before;
-import org.junit.Test;
-
-public class FlowEntryTest {
-
-    FlowEntry entry;
-
-    FlowId flowId = new FlowId(0x1234);
-    FlowEntryId flowEntryId = new FlowEntryId(0x5678);
-    int idleTimeout = 5;
-    int hardTimeout = 10;
-    int priority = 15;
-    FlowEntryMatch match;
-    FlowEntryActions actions;
-
-    Dpid dpid = new Dpid(0xCAFE);
-
-    PortNumber inport = new PortNumber((short) 1);
-    byte[] byte1 = {1, 2, 3, 4, 5, 6};
-    byte[] byte2 = {6, 5, 4, 3, 2, 1};
-    MACAddress mac1 = new MACAddress(byte1);
-    MACAddress mac2 = new MACAddress(byte2);
-    Short ether = Short.valueOf((short) 2);
-    Short vlanid = Short.valueOf((short) 3);
-    Byte vlanprio = Byte.valueOf((byte) 4);
-    IPv4Net ip1 = new IPv4Net("127.0.0.1/32");
-    IPv4Net ip2 = new IPv4Net(new IPv4("127.0.0.2"), (short) 32);
-    IPv4 ipaddr1 = new IPv4("127.0.0.3");
-    IPv4 ipaddr2 = new IPv4("127.0.0.4");
-    Byte ipproto = Byte.valueOf((byte) 5);
-    Byte ipToS = Byte.valueOf((byte) 6);
-    Short tport1 = Short.valueOf((short) 7);
-    Short tport2 = Short.valueOf((short) 8);
-    PortNumber outport = new PortNumber((short) 9);
-    PortNumber queueport = new PortNumber((short) 10);
-    int queueId = 11;
-
-    FlowEntryErrorState errorState = new FlowEntryErrorState((short) 12, (short) 13);
-
-
-    @Before
-    public void setUp() throws Exception {
-        entry = new FlowEntry();
-
-        flowId = new FlowId("0x1234");
-        entry.setFlowId(flowId);
-
-        flowEntryId = new FlowEntryId("0x5678");
-        entry.setFlowEntryId(flowEntryId);
-
-        entry.setIdleTimeout(5);
-        entry.setHardTimeout(10);
-        entry.setPriority(15);
-
-        dpid = new Dpid("CA:FE");
-        entry.setDpid(dpid);
-
-        entry.setInPort(inport);
-        entry.setOutPort(outport);
-
-        match = new FlowEntryMatch();
-        match.enableInPort(inport);
-        match.enableSrcMac(mac1);
-        match.enableDstMac(mac2);
-        match.enableEthernetFrameType(ether);
-        match.enableVlanId(vlanid);
-        match.enableVlanPriority(vlanprio);
-        match.enableSrcIPv4Net(ip1);
-        match.enableDstIPv4Net(ip2);
-        match.enableIpProto(ipproto);
-        match.enableIpToS(ipToS);
-        match.enableSrcTcpUdpPort(tport1);
-        match.enableDstTcpUdpPort(tport2);
-
-        entry.setFlowEntryMatch(match);
-
-        FlowEntryAction action = null;
-        actions = entry.flowEntryActions();
-
-        action = new FlowEntryAction();
-        action.setActionOutput(outport);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionOutputToController((short) 0);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetVlanId(vlanid);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetVlanPriority(vlanprio);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionStripVlan(true);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetEthernetSrcAddr(mac1);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetEthernetDstAddr(mac2);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetIPv4SrcAddr(ipaddr1);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetIPv4DstAddr(ipaddr2);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetIpToS(ipToS);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetTcpUdpSrcPort(tport1);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionSetTcpUdpDstPort(tport2);
-        actions.addAction(action);
-
-        action = new FlowEntryAction();
-        action.setActionEnqueue(queueport, queueId);
-        actions.addAction(action);
-
-        entry.setFlowEntryUserState(FlowEntryUserState.FE_USER_ADD);
-        entry.setFlowEntrySwitchState(FlowEntrySwitchState.FE_SWITCH_UPDATED);
-        entry.setFlowEntryErrorState(errorState);
-
-    }
-
-    @Test
-    public void testFlowEntry() {
-        FlowEntry e = new FlowEntry();
-
-        assertTrue(e.flowEntryActions().isEmpty());
-        assertEquals("flowEntryUserState", FlowEntryUserState.FE_USER_UNKNOWN, e.flowEntryUserState());
-        assertEquals("flowEntrySwitchState", FlowEntrySwitchState.FE_SWITCH_UNKNOWN, e.flowEntrySwitchState());
-    }
-
-    @Test
-    public void testFlowId() {
-        assertEquals("flowId", flowId, entry.flowId());
-    }
-
-    @Test
-    public void testIsValidFlowId() {
-        FlowEntry e = new FlowEntry();
-
-        // Test a Flow Entry with empty Flow ID
-        assertEquals("isValidFlowId", false, e.isValidFlowId());
-
-        // Test a Flow Entry with invalid Flow ID
-        e.setFlowId(new FlowId());
-        assertEquals("isValidFlowId", false, e.isValidFlowId());
-
-        // Test a Flow Entry with valid Flow ID
-        e.setFlowId(new FlowId(0x1));
-        assertEquals("isValidFlowId", true, e.isValidFlowId());
-        assertEquals("isValidFlowId", true, entry.isValidFlowId());
-    }
-
-    @Test
-    public void testFlowEntryId() {
-        assertEquals("flowEntryId", flowEntryId, entry.flowEntryId());
-    }
-
-    @Test
-    public void testIsValidFlowEntryId() {
-        FlowEntry e = new FlowEntry();
-
-        // Test a Flow Entry with empty Flow Entry ID
-        assertEquals("isValidFlowEntryId", false, e.isValidFlowEntryId());
-
-        // Test a Flow Entry with invalid Flow Entry ID
-        e.setFlowEntryId(new FlowEntryId());
-        assertEquals("isValidFlowEntryId", false, e.isValidFlowEntryId());
-
-        // Test a Flow Entry with valid Flow Entry ID
-        e.setFlowEntryId(new FlowEntryId(0x1));
-        assertEquals("isValidFlowEntryId", true, e.isValidFlowEntryId());
-        assertEquals("isValidFlowEntryId", true, entry.isValidFlowEntryId());
-    }
-
-    @Test
-    public void testIdleTimeout() {
-        assertEquals("idleTimeout", idleTimeout, entry.idleTimeout());
-    }
-
-    @Test
-    public void testHardTimeout() {
-        assertEquals("hardTimeout", hardTimeout, entry.hardTimeout());
-    }
-
-    @Test
-    public void testPriority() {
-        assertEquals("priority", priority, entry.priority());
-    }
-
-    @Test
-    public void testFlowEntryMatch() {
-        assertEquals("flowEntryMatch", match, entry.flowEntryMatch());
-    }
-
-    @Test
-    public void testFlowEntryActions() {
-        assertEquals("flowEntryActions", actions, entry.flowEntryActions());
-    }
-
-    @Test
-    public void testSetFlowEntryActions() {
-        FlowEntryActions acts = new FlowEntryActions();
-        entry.setFlowEntryActions(acts);
-        assertEquals("flowEntryActions", acts, entry.flowEntryActions());
-    }
-
-    @Test
-    public void testDpid() {
-        assertEquals("dpid", dpid, entry.dpid());
-    }
-
-    @Test
-    public void testInPort() {
-        assertEquals("inPort", inport, entry.inPort());
-    }
-
-    @Test
-    public void testOutPort() {
-        assertEquals("outPort", outport, entry.outPort());
-    }
-
-    @Test
-    public void testFlowEntryUserState() {
-        assertEquals("flowEntryUserState", FlowEntryUserState.FE_USER_ADD, entry.flowEntryUserState());
-    }
-
-    @Test
-    public void testFlowEntrySwitchState() {
-        assertEquals("flowEntrySwitchState", FlowEntrySwitchState.FE_SWITCH_UPDATED, entry.flowEntrySwitchState());
-    }
-
-    @Test
-    public void testFlowEntryErrorState() {
-        assertEquals("flowEntryErrorState", errorState, entry.flowEntryErrorState());
-    }
-
-    @Test
-    public void testToString() {
-        FlowEntry def = new FlowEntry();
-        assertEquals("toString",
-                "[ idleTimeout=0 hardTimeout=0 priority=32768"
-                + " flowEntryActions=[] flowEntryUserState=FE_USER_UNKNOWN"
-                + " flowEntrySwitchState=FE_SWITCH_UNKNOWN]",
-                def.toString());
-
-        assertEquals("toString",
-                "[flowEntryId=0x5678 flowId=0x1234 idleTimeout=5 hardTimeout=10"
-                + " priority=15"
-                + " flowEntryMatch="
-                + "[inPort=1 srcMac=01:02:03:04:05:06 dstMac=06:05:04:03:02:01"
-                + " ethernetFrameType=2 vlanId=3 vlanPriority=4"
-                + " srcIPv4Net=127.0.0.1/32 dstIPv4Net=127.0.0.2/32"
-                + " ipProto=5 ipToS=6 srcTcpUdpPort=7 dstTcpUdpPort=8"
-                + "]"
-                + " flowEntryActions=["
-                + "[type=ACTION_OUTPUT action=[port=9 maxLen=0]];"
-                // PORT_CONTROLLER((short) 0xfffd) = 65533 (-3)
-                + "[type=ACTION_OUTPUT action=[port=65533 maxLen=0]];"
-                + "[type=ACTION_SET_VLAN_VID action=[vlanId=3]];"
-                + "[type=ACTION_SET_VLAN_PCP action=[vlanPriority=4]];"
-                + "[type=ACTION_STRIP_VLAN action=[stripVlan=true]];"
-                + "[type=ACTION_SET_DL_SRC action=[addr=01:02:03:04:05:06]];"
-                + "[type=ACTION_SET_DL_DST action=[addr=06:05:04:03:02:01]];"
-                + "[type=ACTION_SET_NW_SRC action=[addr=127.0.0.3]];"
-                + "[type=ACTION_SET_NW_DST action=[addr=127.0.0.4]];"
-                + "[type=ACTION_SET_NW_TOS action=[ipToS=6]];"
-                + "[type=ACTION_SET_TP_SRC action=[port=7]];"
-                + "[type=ACTION_SET_TP_DST action=[port=8]];"
-                + "[type=ACTION_ENQUEUE action=[port=10 queueId=11]];]"
-                + " dpid=00:00:00:00:00:00:ca:fe inPort=1 outPort=9"
-                + " flowEntryUserState=FE_USER_ADD"
-                + " flowEntrySwitchState=FE_SWITCH_UPDATED"
-                + " flowEntryErrorState=[type=12 code=13]]",
-                entry.toString());
-    }
-
-}
