diff --git a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/IOnosDeviceListener.java b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/IOnosDeviceListener.java
deleted file mode 100644
index da50d83..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/IOnosDeviceListener.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package net.onrc.onos.ofcontroller.devicemanager;
-
-public interface IOnosDeviceListener {
-
-    public void onosDeviceAdded(OnosDevice device);
-    public void onosDeviceRemoved(OnosDevice device);
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/IOnosDeviceService.java b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/IOnosDeviceService.java
deleted file mode 100644
index e860de7..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/IOnosDeviceService.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package net.onrc.onos.ofcontroller.devicemanager;
-
-import net.floodlightcontroller.core.module.IFloodlightService;
-import net.floodlightcontroller.util.MACAddress;
-
-/**
- * {@link OnosDeviceManager} doesn't yet provide any API to fellow modules,
- * however making it export a dummy service means we can specify it as 
- * a dependency of Forwarding
- * @author jono
- *
- */
-public interface IOnosDeviceService extends IFloodlightService {
-
-	public void addOnosDeviceListener(IOnosDeviceListener listener);
-	
-	public void deleteOnosDeviceListener(IOnosDeviceListener listener);	
-	
-	public void deleteOnosDevice(OnosDevice dev);
-
-	public void deleteOnosDeviceByMac(MACAddress mac);
-	
-	public void addOnosDevice(Long mac, OnosDevice dev);
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDevice.java b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDevice.java
deleted file mode 100644
index d94eb1f..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDevice.java
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
-l*    Copyright 2011,2012, Big Switch Networks, Inc. 
-*    Originally created by David Erickson, Stanford University
-* 
-*    Licensed under the Apache License, Version 2.0 (the "License"); you may
-*    not use this file except in compliance with the License. You may obtain
-*    a copy of the License at
-*
-*         http://www.apache.org/licenses/LICENSE-2.0
-*
-*    Unless required by applicable law or agreed to in writing, software
-*    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-*    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-*    License for the specific language governing permissions and limitations
-*    under the License.
-**/
-
-package net.onrc.onos.ofcontroller.devicemanager;
-
-import java.io.Serializable;
-import java.util.Date;
-
-import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.packet.IPv4;
-
-/**
- * An entity on the network is a visible trace of a device that corresponds
- * to a packet received from a particular interface on the edge of a network,
- * with a particular VLAN tag, and a particular MAC address, along with any
- * other packet characteristics we might want to consider as helpful for
- * disambiguating devices.
- * 
- * Entities are the most basic element of devices; devices consist of one or
- * more entities.  Entities are immutable once created, except for the last
- * seen timestamp.
- *  
- * @author readams
- *
- */
-public class OnosDevice implements Serializable { //implements Comparable<OnosDevice> {
-
-    private static int ACTIVITY_TIMEOUT = 30000;
-    
-    /**
-     * The MAC address associated with this entity
-     */
-    private MACAddress macAddress;
-    
-    /**
-     * The IP address associated with this entity, or null if no IP learned
-     * from the network observation associated with this entity
-     */
-    private Integer ipv4Address;
-    
-    /**
-     * The VLAN tag on this entity, or null if untagged
-     */
-    private Short vlan;
-    
-    /**
-     * The DPID of the switch for the ingress point for this entity,
-     * or null if not present
-     */
-    private long switchDPID;
-    
-    /**
-     * The port number of the switch for the ingress point for this entity,
-     * or null if not present
-     */
-    private short switchPort;
-    
-    /**
-     * The last time we observed this entity on the network
-     */
-    private Date lastSeenTimestamp;
-
-    private Date activeSince;
-    
-    private int hashCode = 0;
-
-    // ************
-    // Constructors
-    // ************
-     protected OnosDevice() {}
-     
-    /**
-     * Create a new entity
-     * 
-     * @param macAddress
-     * @param vlan
-     * @param ipv4Address
-     * @param switchDPID
-     * @param switchPort
-     * @param lastSeenTimestamp
-     */
-    public OnosDevice(MACAddress macAddress, Short vlan, 
-                  Integer ipv4Address, Long switchDPID, short switchPort, 
-                  Date lastSeenTimestamp) {
-        this.macAddress = macAddress;
-        this.ipv4Address = ipv4Address;
-        this.vlan = vlan;
-        this.switchDPID = switchDPID;
-        this.switchPort = switchPort;
-        this.lastSeenTimestamp = lastSeenTimestamp;
-        this.activeSince = lastSeenTimestamp;
-    }
-
-    // ***************
-    // Getters/Setters
-    // ***************
-
-    public MACAddress getMacAddress() {
-        return macAddress;
-    }
-
-    public Integer getIpv4Address() {
-        return ipv4Address;
-    }
-    
-    public void setIpv4Address(Integer ipv4Address) {
-    	this.ipv4Address = ipv4Address;
-    }
-
-    public Short getVlan() {
-        return vlan;
-    }
-
-    public Long getSwitchDPID() {
-        return switchDPID;
-    }
-    
-    public void setSwitchDPID(long dpid) {
-    	this.switchDPID = dpid;
-    }
-
-    public short getSwitchPort() {
-        return switchPort;
-    }
-    
-    public void setSwitchPort(short port) {
-    	this.switchPort = port;
-    }
-
-    public Date getLastSeenTimestamp() {
-        return lastSeenTimestamp;
-    }
-
-    
-    public void setLastSeenTimestamp(Date lastSeenTimestamp) {
-        if (activeSince == null ||
-            (activeSince.getTime() +  ACTIVITY_TIMEOUT) <
-                lastSeenTimestamp.getTime())
-            this.activeSince = lastSeenTimestamp;
-        this.lastSeenTimestamp = lastSeenTimestamp;
-    }
-
-    public Date getActiveSince() {
-        return activeSince;
-    }
-
-    public void setActiveSince(Date activeSince) {
-        this.activeSince = activeSince;
-    }
-    
-    @Override
-    public int hashCode() {
-        if (hashCode != 0) return hashCode;
-        final int prime = 31;
-        hashCode = 1;
-        hashCode = prime * hashCode
-                 + ((ipv4Address == null) ? 0 : ipv4Address.hashCode());
-        hashCode = prime * hashCode + (int) (macAddress.toLong() ^ (macAddress.toLong() >>> 32));
-        hashCode = prime * hashCode + (int)switchDPID;
-        hashCode = prime * hashCode + (int)switchPort;
-        hashCode = prime * hashCode + ((vlan == null) ? 0 : vlan.hashCode());
-        return hashCode;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj) return true;
-        if (obj == null) return false;
-        if (getClass() != obj.getClass()) return false;
-        OnosDevice other = (OnosDevice) obj;
-        if (hashCode() != other.hashCode()) return false;
-        if (ipv4Address == null) {
-            if (other.ipv4Address != null) return false;
-        } else if (!ipv4Address.equals(other.ipv4Address)) return false; 
-        if (macAddress == null) {
-            if (other.macAddress != null) return false;
-        } else if (!macAddress.equals(other.macAddress)) return false;
-        if(switchDPID != other.switchDPID) return false;
-        if (switchPort != other.switchPort) return false;
-        if (vlan == null) {
-            if (other.vlan != null) return false;
-        } else if (!vlan.equals(other.vlan)) return false;
-        return true;
-    }
-    
-    @Override
-    public String toString() {
-        StringBuilder builder = new StringBuilder();
-        builder.append("Entity [macAddress=");
-        builder.append(macAddress.toString());
-        builder.append(", ipv4Address=");
-        builder.append(IPv4.fromIPv4Address(ipv4Address==null ?
-                       0 : ipv4Address.intValue()));
-        builder.append(", vlan=");
-        builder.append(vlan);
-        builder.append(", switchDPID=");
-        builder.append(switchDPID);
-        builder.append(", switchPort=");
-        builder.append(switchPort);
-        builder.append(", lastSeenTimestamp=");
-        builder.append(lastSeenTimestamp == null? "null" : lastSeenTimestamp.getTime());
-        builder.append(", activeSince=");
-        builder.append(activeSince == null? "null" : activeSince.getTime());
-        builder.append("]");
-        return builder.toString();
-    }
-
-    /*
-    @Override
-    public int compareTo(OnosDevice o) {
-        if (macAddress < o.macAddress) return -1;
-        if (macAddress > o.macAddress) return 1;
-
-        int r;
-        if (switchDPID == null)
-            r = o.switchDPID == null ? 0 : -1;
-        else if (o.switchDPID == null)
-            r = 1;
-        else
-            r = switchDPID.compareTo(o.switchDPID);
-        if (r != 0) return r;
-
-        if (switchPort == null)
-            r = o.switchPort == null ? 0 : -1;
-        else if (o.switchPort == null)
-            r = 1;
-        else
-            r = switchPort.compareTo(o.switchPort);
-        if (r != 0) return r;
-
-        if (ipv4Address == null)
-            r = o.ipv4Address == null ? 0 : -1;
-        else if (o.ipv4Address == null)
-            r = 1;
-        else
-            r = ipv4Address.compareTo(o.ipv4Address);
-        if (r != 0) return r;
-
-        if (vlan == null)
-            r = o.vlan == null ? 0 : -1;
-        else if (o.vlan == null)
-            r = 1;
-        else
-            r = vlan.compareTo(o.vlan);
-        if (r != 0) return r;
-
-        return 0;
-    }*/
-    
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDeviceManager.java b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDeviceManager.java
deleted file mode 100644
index 90eb78c..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDeviceManager.java
+++ /dev/null
@@ -1,360 +0,0 @@
-package net.onrc.onos.ofcontroller.devicemanager;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.concurrent.Executors;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-
-import net.floodlightcontroller.core.FloodlightContext;
-import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IOFMessageListener;
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.core.IUpdate;
-import net.floodlightcontroller.core.module.FloodlightModuleContext;
-import net.floodlightcontroller.core.module.FloodlightModuleException;
-import net.floodlightcontroller.core.module.IFloodlightModule;
-import net.floodlightcontroller.core.module.IFloodlightService;
-import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.core.datagrid.IDatagridService;
-import net.onrc.onos.core.datagrid.IEventChannel;
-import net.onrc.onos.core.datagrid.IEventChannelListener;
-import net.onrc.onos.packet.ARP;
-import net.onrc.onos.packet.DHCP;
-import net.onrc.onos.packet.Ethernet;
-import net.onrc.onos.packet.IPv4;
-import net.onrc.onos.packet.UDP;
-import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
-import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
-
-import org.openflow.protocol.OFMessage;
-import org.openflow.protocol.OFPacketIn;
-import org.openflow.protocol.OFType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class OnosDeviceManager implements IFloodlightModule,
-					  IOFMessageListener,
-					  IOnosDeviceService,
-					  IEventChannelListener<Long, OnosDevice> {
-	protected final static Logger log = LoggerFactory.getLogger(OnosDeviceManager.class);
-	private static final int CLEANUP_SECOND = 60*60;
-	private static final int AGEING_MILLSEC = 60*60*1000;
-
-	private CopyOnWriteArrayList<IOnosDeviceListener> deviceListeners;
-	private IFloodlightProviderService floodlightProvider;
-	private final static ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
-
-	private IDatagridService datagrid;
-	private IEventChannel<Long, OnosDevice> eventChannel;
-	private static final String DEVICE_CHANNEL_NAME = "onos.device";
-	private Map<Long, OnosDevice> mapDevice = new ConcurrentHashMap<Long, OnosDevice>();
-	private INetworkGraphService networkGraphService;
-	private NetworkGraph networkGraph;
-
-    public enum OnosDeviceUpdateType {
-        ADD, DELETE, UPDATE;
-    }
-
-	private class OnosDeviceUpdate implements IUpdate {
-		private OnosDevice device;
-		private OnosDeviceUpdateType type;
-
-		public OnosDeviceUpdate(OnosDevice device, OnosDeviceUpdateType type) {
-			this.device = device;
-			this.type = type;
-		}
-
-		@Override
-		public void dispatch() {
-			if(type == OnosDeviceUpdateType.ADD) {
-				for(IOnosDeviceListener listener: deviceListeners) {
-					listener.onosDeviceAdded(device);
-				}
-			} else if (type == OnosDeviceUpdateType.DELETE){
-				for(IOnosDeviceListener listener: deviceListeners) {
-					listener.onosDeviceRemoved(device);
-				}
-			}
-		}
-	}
-
-	@Override
-	public String getName() {
-		return "onosdevicemanager";
-	}
-
-	@Override
-	public boolean isCallbackOrderingPrereq(OFType type, String name) {
-		// We want link discovery to consume LLDP first otherwise we'll
-		// end up reading bad device info from LLDP packets
-		return type == OFType.PACKET_IN && "linkdiscovery".equals(name);
-	}
-
-	@Override
-	public boolean isCallbackOrderingPostreq(OFType type, String name) {
-		return type == OFType.PACKET_IN &&
-				("proxyarpmanager".equals(name) || "onosforwarding".equals(name));
-	}
-
-	@Override
-	public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
-		if (msg.getType().equals(OFType.PACKET_IN)) {
-			OFPacketIn pi = (OFPacketIn) msg;
-
-			Ethernet eth = IFloodlightProviderService.bcStore.
-					get(cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
-
-			return processPacketIn(sw, pi, eth);
-		}
-
-		return Command.CONTINUE;
-	}
-
-	private Command processPacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth) {
-        long dpid =sw.getId();
-        short portId = pi.getInPort();
-        Long mac = eth.getSourceMAC().toLong();
-
-        OnosDevice srcDevice =
-                getSourceDeviceFromPacket(eth, dpid, portId);
-
-        if (srcDevice == null){
-        	return Command.STOP;
-        }
-
-        //We check if it is the same device in datagrid to suppress the device update
-        OnosDevice exDev = null;
-        if((exDev = mapDevice.get(mac)) != null ){
-	    	if(exDev.equals(srcDevice)) {
-	    		//There is the same existing device. Update only ActiveSince time.
-	        	exDev.setLastSeenTimestamp(new Date());
-	        	if(log.isTraceEnabled()) {
-			        log.debug("In the datagrid, there is the same device."
-							+ "Only update last seen time. dpid {}, port {}, mac {}, ip {}, lastSeenTime {}",
-			        		dpid, portId, srcDevice.getMacAddress(), srcDevice.getIpv4Address(), srcDevice.getLastSeenTimestamp().getTime());
-	        	}
-		        return Command.CONTINUE;
-	    	} else if (srcDevice.getIpv4Address() == null &&
-	    			exDev.getSwitchDPID().equals(srcDevice.getSwitchDPID()) &&
-	    			exDev.getSwitchPort() == srcDevice.getSwitchPort()) {
-	    			//Vlan should be handled based on the Onos spec. Until then, don't handle it.
-		    		//Device attachment point and mac address are the same
-		    		//but the packet does not have an ip address.
-		        	exDev.setLastSeenTimestamp(new Date());
-		        	if(log.isTraceEnabled()) {
-			        	log.debug("In the datagrid, there is the same device with no ip."
-								+ "Keep ip and update last seen time. dpid {}, port {}, mac {}, ip {} lastSeenTime {}",
-								dpid, portId, srcDevice.getMacAddress(), exDev.getIpv4Address(), srcDevice.getLastSeenTimestamp().getTime());
-		        	}
-		        	return Command.CONTINUE;
-	    		}
-	    	}
-
-        //If the switch port we try to attach a new device already has a link, then stop adding device
-        if(networkGraph.getLink(dpid, (long)portId) != null) {
-			if(log.isTraceEnabled()) {
-    			log.debug("Stop adding OnosDevice {} due to there is a link to: dpid {} port {}",
-						srcDevice.getMacAddress(), dpid, portId);
-			}
-			return Command.CONTINUE;
-        }
-
-        addOnosDevice(mac, srcDevice);
-
-        if(log.isTraceEnabled()) {
-	        log.debug("Add device info in the set. dpid {}, port {}, mac {}, ip {}, lastSeenTime {}",
-	       		dpid, portId, srcDevice.getMacAddress(), srcDevice.getIpv4Address(), srcDevice.getLastSeenTimestamp().getTime());
-        }
-        return Command.CONTINUE;
-	}
-
-     //Thread to delete devices periodically.
-	 //Remove all devices from the map first and then finally delete devices from the DB.
-	private class CleanDevice implements Runnable {
-		@Override
-		public void run() {
-			log.debug("called CleanDevice");
-			try{
-		        	Set<OnosDevice> deleteSet = new HashSet<OnosDevice>();
-			        for (OnosDevice dev : mapDevice.values() ) {
-			        	long now = new Date().getTime();
-			        	if((now - dev.getLastSeenTimestamp().getTime() > AGEING_MILLSEC)) {
-			        		if(log.isTraceEnabled()) {
-			        			log.debug("Remove device info in the datagrid. dpid {}, port {}, mac {}, ip {}, lastSeenTime {}, diff {}",
-				        				dev.getSwitchDPID(), dev.getSwitchPort(), dev.getMacAddress(), dev.getIpv4Address(),
-				        				dev.getLastSeenTimestamp().getTime(), now - dev.getLastSeenTimestamp().getTime());
-			        		}
-			        		deleteSet.add(dev);
-			        	}
-			        }
-
-			        for(OnosDevice dev : deleteSet) {
-			        	deleteOnosDevice(dev);
-			        }
-			 } catch(Exception e) {
-		    	 log.error("Error:", e);
-		     }
-		}
-	}
-
-    /**
-     * Get IP address from packet if the packet is either an ARP
-     * or a DHCP packet
-     * @param eth
-     * @param dlAddr
-     * @return
-     */
-    private int getSrcNwAddr(Ethernet eth, long dlAddr) {
-        if (eth.getPayload() instanceof ARP) {
-            ARP arp = (ARP) eth.getPayload();
-            if ((arp.getProtocolType() == ARP.PROTO_TYPE_IP) &&
-                    (Ethernet.toLong(arp.getSenderHardwareAddress()) == dlAddr)) {
-                return IPv4.toIPv4Address(arp.getSenderProtocolAddress());
-            }
-        } else if (eth.getPayload() instanceof IPv4) {
-            IPv4 ipv4 = (IPv4) eth.getPayload();
-            if (ipv4.getPayload() instanceof UDP) {
-                UDP udp = (UDP)ipv4.getPayload();
-                if (udp.getPayload() instanceof DHCP) {
-                    DHCP dhcp = (DHCP)udp.getPayload();
-                    if (dhcp.getOpCode() == DHCP.OPCODE_REPLY) {
-                        return ipv4.getSourceAddress();
-                    }
-                }
-            }
-        }
-        return 0;
-    }
-
-    /**
-     * Parse an entity from an {@link Ethernet} packet.
-     * @param eth the packet to parse
-     * @param sw the switch on which the packet arrived
-     * @param pi the original packetin
-     * @return the entity from the packet
-     */
-    private OnosDevice getSourceDeviceFromPacket(Ethernet eth,
-                                             long swdpid,
-                                             short port) {
-        byte[] dlAddrArr = eth.getSourceMACAddress();
-        long dlAddr = Ethernet.toLong(dlAddrArr);
-
-        // Ignore broadcast/multicast source
-        if ((dlAddrArr[0] & 0x1) != 0)
-            return null;
-
-        short vlan = eth.getVlanID();
-        int nwSrc = getSrcNwAddr(eth, dlAddr);
-        return new OnosDevice(MACAddress.valueOf(dlAddr),
-                          ((vlan >= 0) ? vlan : null),
-                          ((nwSrc != 0) ? nwSrc : null),
-                          swdpid,
-                          port,
-                          new Date());
-    }
-
-	@Override
-	public Collection<Class<? extends IFloodlightService>> getModuleServices() {
-		List<Class<? extends IFloodlightService>> services =
-				new ArrayList<Class<? extends IFloodlightService>>();
-		services.add(IOnosDeviceService.class);
-		return services;
-	}
-
-	@Override
-	public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
-		Map<Class<? extends IFloodlightService>, IFloodlightService> impls =
-				new HashMap<Class<? extends IFloodlightService>, IFloodlightService>();
-		impls.put(IOnosDeviceService.class, this);
-		return impls;
-	}
-
-	@Override
-	public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
-		List<Class<? extends IFloodlightService>> dependencies =
-				new ArrayList<Class<? extends IFloodlightService>>();
-		dependencies.add(IFloodlightProviderService.class);
-		dependencies.add(INetworkGraphService.class);
-		dependencies.add(IDatagridService.class);
-		return dependencies;
-	}
-
-	@Override
-	public void init(FloodlightModuleContext context)
-			throws FloodlightModuleException {
-		floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
-		executor.scheduleAtFixedRate(new CleanDevice(), 30 ,CLEANUP_SECOND, TimeUnit.SECONDS);
-
-		deviceListeners = new CopyOnWriteArrayList<IOnosDeviceListener>();
-		datagrid = context.getServiceImpl(IDatagridService.class);
-		networkGraphService = context.getServiceImpl(INetworkGraphService.class);
-		networkGraph = networkGraphService.getNetworkGraph();
-	}
-
-	@Override
-	public void startUp(FloodlightModuleContext context) {
-		floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
-		eventChannel = datagrid.addListener(DEVICE_CHANNEL_NAME, this,
-						    Long.class,
-						    OnosDevice.class);
-	}
-
-    @Override
-	public void deleteOnosDevice(OnosDevice dev) {
-	    Long mac = dev.getMacAddress().toLong();
-	    eventChannel.removeEntry(mac);
-	    floodlightProvider.publishUpdate(new OnosDeviceUpdate(dev, OnosDeviceUpdateType.DELETE));
-	}
-    
-    @Override
-	public void deleteOnosDeviceByMac(MACAddress mac) {
-    	OnosDevice deleteDevice = mapDevice.get(mac);
-    	deleteOnosDevice(deleteDevice);
-	}
-	
-	@Override
-	public void addOnosDevice(Long mac, OnosDevice dev) {
-	    eventChannel.addEntry(mac, dev);
-	    floodlightProvider.publishUpdate(new OnosDeviceUpdate(dev, OnosDeviceUpdateType.ADD));
-	}
-
-	@Override
-	public void entryAdded(OnosDevice dev) {
-	    Long mac = dev.getMacAddress().toLong();
-	    mapDevice.put(mac, dev);
-	    log.debug("Device added: device mac {}", mac);
-	}
-
-	@Override
-	public void entryRemoved(OnosDevice dev) {
-	    Long mac = dev.getMacAddress().toLong();
-	    mapDevice.remove(mac);
-	    log.debug("Device removed: device mac {}", mac);
-	}
-
-	@Override
-	public void entryUpdated(OnosDevice dev) {
-	    Long mac = dev.getMacAddress().toLong();
-	    mapDevice.put(mac, dev);
-	    log.debug("Device updated: device mac {}", mac);
-	}
-
-	@Override
-	public void addOnosDeviceListener(IOnosDeviceListener listener) {
-		deviceListeners.add(listener);
-	}
-
-	@Override
-	public void deleteOnosDeviceListener(IOnosDeviceListener listener) {
-		deviceListeners.remove(listener);
-	}
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
index 4134101..62f4f16 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -15,12 +15,12 @@
 import net.floodlightcontroller.core.module.IFloodlightService;
 import net.floodlightcontroller.core.util.SingletonTask;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
+import net.onrc.onos.core.devicemanager.IOnosDeviceListener;
+import net.onrc.onos.core.devicemanager.IOnosDeviceService;
+import net.onrc.onos.core.devicemanager.OnosDevice;
+import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryListener;
+import net.onrc.onos.core.linkdiscovery.ILinkDiscoveryService;
 import net.onrc.onos.core.main.IOFSwitchPortListener;
-import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceListener;
-import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceService;
-import net.onrc.onos.ofcontroller.devicemanager.OnosDevice;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryListener;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
 import net.onrc.onos.ofcontroller.networkgraph.DeviceEvent;
 import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
 import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowProgrammer.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowProgrammer.java
deleted file mode 100644
index 8e5619d..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowProgrammer.java
+++ /dev/null
@@ -1,175 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.openflow.protocol.OFFlowRemoved;
-import org.openflow.protocol.OFMessage;
-import org.openflow.protocol.OFType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import net.floodlightcontroller.core.FloodlightContext;
-import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IOFMessageListener;
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.core.IOFSwitchListener;
-import net.floodlightcontroller.core.module.FloodlightModuleContext;
-import net.floodlightcontroller.core.module.FloodlightModuleException;
-import net.floodlightcontroller.core.module.IFloodlightModule;
-import net.floodlightcontroller.core.module.IFloodlightService;
-import net.floodlightcontroller.restserver.IRestApiService;
-import net.onrc.onos.ofcontroller.flowprogrammer.web.FlowProgrammerWebRoutable;
-import net.onrc.onos.ofcontroller.util.FlowEntryId;
-import net.onrc.onos.registry.controller.IControllerRegistryService;
-
-/**
- * FlowProgrammer is a module responsible to maintain flows installed to switches.
- * FlowProgrammer consists of FlowPusher and FlowSynchronizer.
- * FlowPusher manages the rate of installation, and FlowSynchronizer synchronizes
- * flows between GraphDB and switches.
- * FlowProgrammer also watch the event of addition/deletion of switches to
- * start/stop synchronization. When a switch is added to network, FlowProgrammer
- * immediately kicks synchronization to keep switch's flow table latest state.
- * Adversely, when a switch is removed from network, FlowProgrammer immediately
- * stops synchronization.
- *
- * @author Brian
- */
-public class FlowProgrammer implements IFloodlightModule,
-        IOFMessageListener,
-        IOFSwitchListener {
-    // flag to enable FlowSynchronizer
-    private static final boolean enableFlowSync = false;
-    protected static final Logger log = LoggerFactory.getLogger(FlowProgrammer.class);
-    protected volatile IFloodlightProviderService floodlightProvider;
-    protected volatile IControllerRegistryService registryService;
-    protected volatile IRestApiService restApi;
-
-    protected FlowPusher pusher;
-    private static final int NUM_PUSHER_THREAD = 1;
-
-    protected FlowSynchronizer synchronizer;
-
-    public FlowProgrammer() {
-        pusher = new FlowPusher(NUM_PUSHER_THREAD);
-        if (enableFlowSync) {
-            synchronizer = new FlowSynchronizer();
-        }
-    }
-
-    @Override
-    public void init(FloodlightModuleContext context)
-            throws FloodlightModuleException {
-        floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
-        registryService = context.getServiceImpl(IControllerRegistryService.class);
-        restApi = context.getServiceImpl(IRestApiService.class);
-        pusher.init(null, context, floodlightProvider.getOFMessageFactory(), null);
-        if (enableFlowSync) {
-            synchronizer.init(pusher);
-        }
-    }
-
-    @Override
-    public void startUp(FloodlightModuleContext context) {
-        restApi.addRestletRoutable(new FlowProgrammerWebRoutable());
-        pusher.start();
-        floodlightProvider.addOFMessageListener(OFType.FLOW_REMOVED, this);
-        floodlightProvider.addOFSwitchListener(this);
-    }
-
-    @Override
-    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
-        Collection<Class<? extends IFloodlightService>> l =
-                new ArrayList<Class<? extends IFloodlightService>>();
-        l.add(IFlowPusherService.class);
-        if (enableFlowSync) {
-            l.add(IFlowSyncService.class);
-        }
-        return l;
-    }
-
-    @Override
-    public Map<Class<? extends IFloodlightService>, IFloodlightService> getServiceImpls() {
-        Map<Class<? extends IFloodlightService>,
-                IFloodlightService> m =
-                new HashMap<Class<? extends IFloodlightService>,
-                        IFloodlightService>();
-        m.put(IFlowPusherService.class, pusher);
-        if (enableFlowSync) {
-            m.put(IFlowSyncService.class, synchronizer);
-        }
-        return m;
-    }
-
-    @Override
-    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
-        Collection<Class<? extends IFloodlightService>> l =
-                new ArrayList<Class<? extends IFloodlightService>>();
-        l.add(IFloodlightProviderService.class);
-        l.add(IRestApiService.class);
-        return l;
-    }
-
-    @Override
-    public String getName() {
-        // TODO Auto-generated method stub
-        return "FlowProgrammer";
-    }
-
-    @Override
-    public boolean isCallbackOrderingPrereq(OFType type, String name) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public boolean isCallbackOrderingPostreq(OFType type, String name) {
-        // TODO Auto-generated method stub
-        return false;
-    }
-
-    @Override
-    public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
-        switch (msg.getType()) {
-            case FLOW_REMOVED:
-                OFFlowRemoved flowMsg = (OFFlowRemoved) msg;
-                FlowEntryId id = new FlowEntryId(flowMsg.getCookie());
-                log.debug("Got flow entry removed from {}: {}", sw.getId(), id);
-                // TODO: Inform the Forwarding module that a flow has expired
-                break;
-            default:
-                break;
-        }
-
-        return Command.CONTINUE;
-    }
-
-    @Override
-    public void addedSwitch(IOFSwitch sw) {
-        log.debug("Switch added: {}", sw.getId());
-
-        if (enableFlowSync) {
-            if (registryService.hasControl(sw.getId())) {
-                synchronizer.synchronize(sw);
-            }
-        }
-    }
-
-    @Override
-    public void removedSwitch(IOFSwitch sw) {
-        log.debug("Switch removed: {}", sw.getId());
-
-        if (enableFlowSync) {
-            synchronizer.interrupt(sw);
-        }
-    }
-
-    @Override
-    public void switchPortChanged(Long switchId) {
-        // TODO Auto-generated method stub
-    }
-
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowPusher.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowPusher.java
deleted file mode 100644
index 1c0802a..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowPusher.java
+++ /dev/null
@@ -1,1068 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer;
-
-import java.io.IOException;
-import java.util.ArrayDeque;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.openflow.protocol.*;
-import org.openflow.protocol.action.*;
-import org.openflow.protocol.factory.BasicFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import net.floodlightcontroller.core.FloodlightContext;
-import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IOFMessageListener;
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.core.internal.OFMessageFuture;
-import net.floodlightcontroller.core.module.FloodlightModuleContext;
-import net.floodlightcontroller.threadpool.IThreadPoolService;
-import net.floodlightcontroller.util.MACAddress;
-import net.floodlightcontroller.util.OFMessageDamper;
-import net.onrc.onos.ofcontroller.util.FlowEntryAction;
-import net.onrc.onos.ofcontroller.util.FlowEntryAction.*;
-import net.onrc.onos.ofcontroller.util.FlowEntry;
-import net.onrc.onos.ofcontroller.util.FlowEntryActions;
-import net.onrc.onos.ofcontroller.util.FlowEntryMatch;
-import net.onrc.onos.ofcontroller.util.FlowEntryUserState;
-import net.onrc.onos.ofcontroller.util.IPv4Net;
-import net.onrc.onos.ofcontroller.util.Pair;
-import net.onrc.onos.ofcontroller.util.Port;
-
-/**
- * FlowPusher is a implementation of FlowPusherService.
- * FlowPusher assigns one message queue instance for each one switch.
- * Number of message processing threads is configurable by constructor, and
- * one thread can handle multiple message queues. Each queue will be assigned to
- * a thread according to hash function defined by getHash().
- * Each processing thread reads messages from queues and sends it to switches
- * in round-robin. Processing thread also calculates rate of sending to suppress
- * excessive message sending.
- *
- * @author Naoki Shiota
- */
-public class FlowPusher implements IFlowPusherService, IOFMessageListener {
-    private final static Logger log = LoggerFactory.getLogger(FlowPusher.class);
-    protected static final int DEFAULT_NUMBER_THREAD = 1;
-
-    // TODO: Values copied from elsewhere (class LearningSwitch).
-    // The local copy should go away!
-    //
-    protected static final int OFMESSAGE_DAMPER_CAPACITY = 50000; // TODO: find sweet spot
-    protected static final int OFMESSAGE_DAMPER_TIMEOUT = 250;    // ms
-
-    // Number of messages sent to switch at once
-    protected static final int MAX_MESSAGE_SEND = 100;
-
-    private static class SwitchQueueEntry {
-        OFMessage msg;
-
-        public SwitchQueueEntry(OFMessage msg) {
-            this.msg = msg;
-        }
-
-        public OFMessage getOFMessage() {
-            return msg;
-        }
-    }
-
-    /**
-     * SwitchQueue represents message queue attached to a switch.
-     * This consists of queue itself and variables used for limiting sending rate.
-     *
-     * @author Naoki Shiota
-     */
-    private class SwitchQueue {
-        List<Queue<SwitchQueueEntry>> raw_queues;
-        QueueState state;
-
-        // Max rate of sending message (bytes/ms). 0 implies no limitation.
-        long max_rate = 0;    // 0 indicates no limitation
-        long last_sent_time = 0;
-        long last_sent_size = 0;
-
-        // "To be deleted" flag
-        boolean toBeDeleted = false;
-
-        SwitchQueue() {
-            raw_queues = new ArrayList<Queue<SwitchQueueEntry>>(
-                    MsgPriority.values().length);
-            for (int i = 0; i < MsgPriority.values().length; ++i) {
-                raw_queues.add(i, new ArrayDeque<SwitchQueueEntry>());
-            }
-
-            state = QueueState.READY;
-        }
-
-        /**
-         * Check if sending rate is within the rate
-         *
-         * @param current Current time
-         * @return true if within the rate
-         */
-        boolean isSendable(long current) {
-            if (max_rate == 0) {
-                // no limitation
-                return true;
-            }
-
-            if (current == last_sent_time) {
-                return false;
-            }
-
-            // Check if sufficient time (from aspect of rate) elapsed or not.
-            long rate = last_sent_size / (current - last_sent_time);
-            return (rate < max_rate);
-        }
-
-        /**
-         * Log time and size of last sent data.
-         *
-         * @param current Time to be sent.
-         * @param size    Size of sent data (in bytes).
-         */
-        void logSentData(long current, long size) {
-            last_sent_time = current;
-            last_sent_size = size;
-        }
-
-        boolean add(SwitchQueueEntry entry, MsgPriority priority) {
-            Queue<SwitchQueueEntry> queue = getQueue(priority);
-            if (queue == null) {
-                log.error("Unexpected priority : ", priority);
-                return false;
-            }
-            return queue.add(entry);
-        }
-
-        /**
-         * Poll single appropriate entry object according to QueueState.
-         *
-         * @return Entry object.
-         */
-        SwitchQueueEntry poll() {
-            switch (state) {
-                case READY: {
-                    for (int i = 0; i < raw_queues.size(); ++i) {
-                        SwitchQueueEntry entry = raw_queues.get(i).poll();
-                        if (entry != null) {
-                            return entry;
-                        }
-                    }
-
-                    return null;
-                }
-                case SUSPENDED: {
-                    // Only polling from high priority queue
-                    SwitchQueueEntry entry = getQueue(MsgPriority.HIGH).poll();
-                    return entry;
-                }
-                default:
-                    log.error("Unexpected QueueState : ", state);
-                    return null;
-            }
-        }
-
-        /**
-         * Check if this object has any messages in the queues to be sent
-         *
-         * @return True if there are some messages to be sent.
-         */
-        boolean hasMessageToSend() {
-            switch (state) {
-                case READY:
-                    for (Queue<SwitchQueueEntry> queue : raw_queues) {
-                        if (!queue.isEmpty()) {
-                            return true;
-                        }
-                    }
-                    break;
-                case SUSPENDED:
-                    // Only checking high priority queue
-                    return (!getQueue(MsgPriority.HIGH).isEmpty());
-                default:
-                    log.error("Unexpected QueueState : ", state);
-                    return false;
-            }
-
-            return false;
-        }
-
-        Queue<SwitchQueueEntry> getQueue(MsgPriority priority) {
-            return raw_queues.get(priority.ordinal());
-        }
-    }
-
-    /**
-     * BarrierInfo holds information to specify barrier message sent to switch.
-     *
-     * @author Naoki
-     */
-    private static class BarrierInfo {
-        final long dpid;
-        final int xid;
-
-        static BarrierInfo create(IOFSwitch sw, OFBarrierRequest req) {
-            return new BarrierInfo(sw.getId(), req.getXid());
-        }
-
-        static BarrierInfo create(IOFSwitch sw, OFBarrierReply rpy) {
-            return new BarrierInfo(sw.getId(), rpy.getXid());
-        }
-
-        private BarrierInfo(long dpid, int xid) {
-            this.dpid = dpid;
-            this.xid = xid;
-        }
-
-        // Auto generated code by Eclipse
-        @Override
-        public int hashCode() {
-            final int prime = 31;
-            int result = 1;
-            result = prime * result + (int) (dpid ^ (dpid >>> 32));
-            result = prime * result + xid;
-            return result;
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj)
-                return true;
-            if (obj == null)
-                return false;
-            if (getClass() != obj.getClass())
-                return false;
-
-            BarrierInfo other = (BarrierInfo) obj;
-            return (this.dpid == other.dpid) && (this.xid == other.xid);
-        }
-
-
-    }
-
-    private OFMessageDamper messageDamper = null;
-    private IThreadPoolService threadPool = null;
-
-    private FloodlightContext context = null;
-    private BasicFactory factory = null;
-
-    // Map of threads versus dpid
-    private Map<Long, FlowPusherThread> threadMap = null;
-    // Map from (DPID and transaction ID) to Future objects.
-    private Map<BarrierInfo, OFBarrierReplyFuture> barrierFutures
-            = new ConcurrentHashMap<BarrierInfo, OFBarrierReplyFuture>();
-
-    private int number_thread;
-
-    /**
-     * Main thread that reads messages from queues and sends them to switches.
-     *
-     * @author Naoki Shiota
-     */
-    private class FlowPusherThread extends Thread {
-        private Map<IOFSwitch, SwitchQueue> assignedQueues
-                = new ConcurrentHashMap<IOFSwitch, SwitchQueue>();
-
-        final Lock queuingLock = new ReentrantLock();
-        final Condition messagePushed = queuingLock.newCondition();
-
-        @Override
-        public void run() {
-            this.setName("FlowPusherThread " + this.getId());
-            while (true) {
-                while (!queuesHasMessageToSend()) {
-                    queuingLock.lock();
-
-                    try {
-                        // wait for message pushed to queue
-                        messagePushed.await();
-                    } catch (InterruptedException e) {
-                        // Interrupted to be shut down (not an error)
-                        log.debug("FlowPusherThread is interrupted");
-                        return;
-                    } finally {
-                        queuingLock.unlock();
-                    }
-                }
-
-                // for safety of concurrent access, copy set of key objects
-                Set<IOFSwitch> keys = new HashSet<IOFSwitch>(assignedQueues.size());
-                for (IOFSwitch sw : assignedQueues.keySet()) {
-                    keys.add(sw);
-                }
-
-                for (IOFSwitch sw : keys) {
-                    SwitchQueue queue = assignedQueues.get(sw);
-
-                    if (sw == null || queue == null) {
-                        continue;
-                    }
-
-                    synchronized (queue) {
-                        processQueue(sw, queue, MAX_MESSAGE_SEND);
-                        if (queue.toBeDeleted && !queue.hasMessageToSend()) {
-                            // remove queue if flagged to be.
-                            assignedQueues.remove(sw);
-                        }
-                    }
-                }
-            }
-        }
-
-        /**
-         * Read messages from queue and send them to the switch.
-         * If number of messages excess the limit, stop sending messages.
-         *
-         * @param sw      Switch to which messages will be sent.
-         * @param queue   Queue of messages.
-         * @param max_msg Limitation of number of messages to be sent. If set to 0,
-         *                all messages in queue will be sent.
-         */
-        private void processQueue(IOFSwitch sw, SwitchQueue queue, int max_msg) {
-            // check sending rate and determine it to be sent or not
-            long current_time = System.currentTimeMillis();
-            long size = 0;
-
-            if (queue.isSendable(current_time)) {
-                int i = 0;
-                while (queue.hasMessageToSend()) {
-                    // Number of messages excess the limit
-                    if (0 < max_msg && max_msg <= i) {
-                        break;
-                    }
-                    ++i;
-
-                    SwitchQueueEntry queueEntry;
-                    synchronized (queue) {
-                        queueEntry = queue.poll();
-                    }
-
-                    OFMessage msg = queueEntry.getOFMessage();
-                    try {
-                        messageDamper.write(sw, msg, context);
-                        if (log.isTraceEnabled()) {
-                            log.trace("Pusher sends message : {}", msg);
-                        }
-                        size += msg.getLength();
-                    } catch (IOException e) {
-                        e.printStackTrace();
-                        log.error("Exception in sending message ({}) : {}", msg, e);
-                    }
-                }
-
-                sw.flush();
-                queue.logSentData(current_time, size);
-            }
-        }
-
-        private boolean queuesHasMessageToSend() {
-            for (SwitchQueue queue : assignedQueues.values()) {
-                if (queue.hasMessageToSend()) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        private void notifyMessagePushed() {
-            queuingLock.lock();
-            try {
-                messagePushed.signal();
-            } finally {
-                queuingLock.unlock();
-            }
-        }
-    }
-
-    /**
-     * Initialize object with one thread.
-     */
-    public FlowPusher() {
-        number_thread = DEFAULT_NUMBER_THREAD;
-    }
-
-    /**
-     * Initialize object with threads of given number.
-     *
-     * @param number_thread Number of threads to handle messages.
-     */
-    public FlowPusher(int number_thread) {
-        if (number_thread > 0) {
-            this.number_thread = number_thread;
-        } else {
-            this.number_thread = DEFAULT_NUMBER_THREAD;
-        }
-    }
-
-    /**
-     * Set parameters needed for sending messages.
-     *
-     * @param context    FloodlightContext used for sending messages.
-     *                   If null, FlowPusher uses default context.
-     * @param modContext FloodlightModuleContext used for acquiring
-     *                   ThreadPoolService and registering MessageListener.
-     * @param factory    Factory object to create OFMessage objects.
-     * @param damper     Message damper used for sending messages.
-     *                   If null, FlowPusher creates its own damper object.
-     */
-    public void init(FloodlightContext context,
-                     FloodlightModuleContext modContext,
-                     BasicFactory factory,
-                     OFMessageDamper damper) {
-        this.context = context;
-        this.factory = factory;
-        this.threadPool = modContext.getServiceImpl(IThreadPoolService.class);
-        IFloodlightProviderService flservice
-                = modContext.getServiceImpl(IFloodlightProviderService.class);
-        flservice.addOFMessageListener(OFType.BARRIER_REPLY, this);
-
-        if (damper != null) {
-            messageDamper = damper;
-        } else {
-            // use default values
-            messageDamper = new OFMessageDamper(OFMESSAGE_DAMPER_CAPACITY,
-                    EnumSet.of(OFType.FLOW_MOD),
-                    OFMESSAGE_DAMPER_TIMEOUT);
-        }
-    }
-
-    /**
-     * Begin processing queue.
-     */
-    public void start() {
-        if (factory == null) {
-            log.error("FlowPusher not yet initialized.");
-            return;
-        }
-
-        threadMap = new HashMap<Long, FlowPusherThread>();
-        for (long i = 0; i < number_thread; ++i) {
-            FlowPusherThread thread = new FlowPusherThread();
-
-            threadMap.put(i, thread);
-            thread.start();
-        }
-    }
-
-    @Override
-    public boolean suspend(IOFSwitch sw) {
-        SwitchQueue queue = getQueue(sw);
-
-        if (queue == null) {
-            // create queue in case suspend is called before first message addition
-            queue = createQueueImpl(sw);
-        }
-
-        synchronized (queue) {
-            if (queue.state == QueueState.READY) {
-                queue.state = QueueState.SUSPENDED;
-                return true;
-            }
-            return false;
-        }
-    }
-
-    @Override
-    public boolean resume(IOFSwitch sw) {
-        SwitchQueue queue = getQueue(sw);
-
-        if (queue == null) {
-            log.error("No queue is attached to DPID : {}", sw.getId());
-            return false;
-        }
-
-        synchronized (queue) {
-            if (queue.state == QueueState.SUSPENDED) {
-                queue.state = QueueState.READY;
-
-                // Free the latch if queue has any messages
-                FlowPusherThread thread = getProcessingThread(sw);
-                if (queue.hasMessageToSend()) {
-                    thread.notifyMessagePushed();
-                }
-                return true;
-            }
-            return false;
-        }
-    }
-
-    @Override
-    public QueueState getState(IOFSwitch sw) {
-        SwitchQueue queue = getQueue(sw);
-
-        if (queue == null) {
-            return QueueState.UNKNOWN;
-        }
-
-        return queue.state;
-    }
-
-    /**
-     * Stop processing queue and exit thread.
-     */
-    public void stop() {
-        if (threadMap == null) {
-            return;
-        }
-
-        for (FlowPusherThread t : threadMap.values()) {
-            t.interrupt();
-        }
-    }
-
-    @Override
-    public void setRate(IOFSwitch sw, long rate) {
-        SwitchQueue queue = getQueue(sw);
-        if (queue == null) {
-            queue = createQueueImpl(sw);
-        }
-
-        if (rate > 0) {
-            log.debug("rate for {} is set to {}", sw.getId(), rate);
-            synchronized (queue) {
-                queue.max_rate = rate;
-            }
-        }
-    }
-
-    @Override
-    public boolean createQueue(IOFSwitch sw) {
-        SwitchQueue queue = createQueueImpl(sw);
-
-        return (queue != null);
-    }
-
-    protected SwitchQueue createQueueImpl(IOFSwitch sw) {
-        SwitchQueue queue = getQueue(sw);
-        if (queue != null) {
-            return queue;
-        }
-
-        FlowPusherThread proc = getProcessingThread(sw);
-        queue = new SwitchQueue();
-        queue.state = QueueState.READY;
-        proc.assignedQueues.put(sw, queue);
-
-        return queue;
-    }
-
-    @Override
-    public boolean deleteQueue(IOFSwitch sw) {
-        return deleteQueue(sw, false);
-    }
-
-    @Override
-    public boolean deleteQueue(IOFSwitch sw, boolean forceStop) {
-        FlowPusherThread proc = getProcessingThread(sw);
-
-        if (forceStop) {
-            SwitchQueue queue = proc.assignedQueues.remove(sw);
-            if (queue == null) {
-                return false;
-            }
-            return true;
-        } else {
-            SwitchQueue queue = getQueue(sw);
-            if (queue == null) {
-                return false;
-            }
-            synchronized (queue) {
-                queue.toBeDeleted = true;
-            }
-            return true;
-        }
-    }
-
-    @Override
-    public boolean add(IOFSwitch sw, OFMessage msg) {
-        return add(sw, msg, MsgPriority.NORMAL);
-    }
-
-    @Override
-    public boolean add(IOFSwitch sw, OFMessage msg, MsgPriority priority) {
-        return addMessageImpl(sw, msg, priority);
-    }
-
-    @Override
-    public void pushFlowEntries(
-            Collection<Pair<IOFSwitch, FlowEntry>> entries) {
-        pushFlowEntries(entries, MsgPriority.NORMAL);
-    }
-
-    @Override
-    public void pushFlowEntries(
-            Collection<Pair<IOFSwitch, FlowEntry>> entries, MsgPriority priority) {
-
-        for (Pair<IOFSwitch, FlowEntry> entry : entries) {
-            add(entry.first, entry.second, priority);
-        }
-    }
-
-    @Override
-    public void pushFlowEntry(IOFSwitch sw, FlowEntry flowEntry) {
-        pushFlowEntry(sw, flowEntry, MsgPriority.NORMAL);
-    }
-
-    @Override
-    public void pushFlowEntry(IOFSwitch sw, FlowEntry flowEntry, MsgPriority priority) {
-        Collection<Pair<IOFSwitch, FlowEntry>> entries =
-                new LinkedList<Pair<IOFSwitch, FlowEntry>>();
-
-        entries.add(new Pair<IOFSwitch, FlowEntry>(sw, flowEntry));
-        pushFlowEntries(entries, priority);
-    }
-
-    /**
-     * Create a message from FlowEntry and add it to the queue of the switch.
-     *
-     * @param sw        Switch to which message is pushed.
-     * @param flowEntry FlowEntry object used for creating message.
-     * @return true if message is successfully added to a queue.
-     */
-    private boolean add(IOFSwitch sw, FlowEntry flowEntry, MsgPriority priority) {
-        //
-        // Create the OpenFlow Flow Modification Entry to push
-        //
-        OFFlowMod fm = (OFFlowMod) factory.getMessage(OFType.FLOW_MOD);
-        long cookie = flowEntry.flowEntryId().value();
-
-        short flowModCommand = OFFlowMod.OFPFC_ADD;
-        if (flowEntry.flowEntryUserState() == FlowEntryUserState.FE_USER_ADD) {
-            flowModCommand = OFFlowMod.OFPFC_ADD;
-        } else if (flowEntry.flowEntryUserState() == FlowEntryUserState.FE_USER_MODIFY) {
-            flowModCommand = OFFlowMod.OFPFC_MODIFY_STRICT;
-        } else if (flowEntry.flowEntryUserState() == FlowEntryUserState.FE_USER_DELETE) {
-            flowModCommand = OFFlowMod.OFPFC_DELETE_STRICT;
-        } else {
-            // Unknown user state. Ignore the entry
-            log.debug(
-                    "Flow Entry ignored (FlowEntryId = {}): unknown user state {}",
-                    flowEntry.flowEntryId(),
-                    flowEntry.flowEntryUserState());
-            return false;
-        }
-
-        //
-        // Fetch the match conditions.
-        //
-        // NOTE: The Flow matching conditions common for all Flow Entries are
-        // used ONLY if a Flow Entry does NOT have the corresponding matching
-        // condition set.
-        //
-        OFMatch match = new OFMatch();
-        match.setWildcards(OFMatch.OFPFW_ALL);
-        FlowEntryMatch flowEntryMatch = flowEntry.flowEntryMatch();
-
-        // Match the Incoming Port
-        Port matchInPort = flowEntryMatch.inPort();
-        if (matchInPort != null) {
-            match.setInputPort(matchInPort.value());
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_IN_PORT);
-        }
-
-        // Match the Source MAC address
-        MACAddress matchSrcMac = flowEntryMatch.srcMac();
-        if (matchSrcMac != null) {
-            match.setDataLayerSource(matchSrcMac.toString());
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_SRC);
-        }
-
-        // Match the Destination MAC address
-        MACAddress matchDstMac = flowEntryMatch.dstMac();
-        if (matchDstMac != null) {
-            match.setDataLayerDestination(matchDstMac.toString());
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_DST);
-        }
-
-        // Match the Ethernet Frame Type
-        Short matchEthernetFrameType = flowEntryMatch.ethernetFrameType();
-        if (matchEthernetFrameType != null) {
-            match.setDataLayerType(matchEthernetFrameType);
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_TYPE);
-        }
-
-        // Match the VLAN ID
-        Short matchVlanId = flowEntryMatch.vlanId();
-        if (matchVlanId != null) {
-            match.setDataLayerVirtualLan(matchVlanId);
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_VLAN);
-        }
-
-        // Match the VLAN priority
-        Byte matchVlanPriority = flowEntryMatch.vlanPriority();
-        if (matchVlanPriority != null) {
-            match.setDataLayerVirtualLanPriorityCodePoint(matchVlanPriority);
-            match.setWildcards(match.getWildcards()
-                    & ~OFMatch.OFPFW_DL_VLAN_PCP);
-        }
-
-        // Match the Source IPv4 Network prefix
-        IPv4Net matchSrcIPv4Net = flowEntryMatch.srcIPv4Net();
-        if (matchSrcIPv4Net != null) {
-            match.setFromCIDR(matchSrcIPv4Net.toString(), OFMatch.STR_NW_SRC);
-        }
-
-        // Natch the Destination IPv4 Network prefix
-        IPv4Net matchDstIPv4Net = flowEntryMatch.dstIPv4Net();
-        if (matchDstIPv4Net != null) {
-            match.setFromCIDR(matchDstIPv4Net.toString(), OFMatch.STR_NW_DST);
-        }
-
-        // Match the IP protocol
-        Byte matchIpProto = flowEntryMatch.ipProto();
-        if (matchIpProto != null) {
-            match.setNetworkProtocol(matchIpProto);
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_NW_PROTO);
-        }
-
-        // Match the IP ToS (DSCP field, 6 bits)
-        Byte matchIpToS = flowEntryMatch.ipToS();
-        if (matchIpToS != null) {
-            match.setNetworkTypeOfService(matchIpToS);
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_NW_TOS);
-        }
-
-        // Match the Source TCP/UDP port
-        Short matchSrcTcpUdpPort = flowEntryMatch.srcTcpUdpPort();
-        if (matchSrcTcpUdpPort != null) {
-            match.setTransportSource(matchSrcTcpUdpPort);
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_TP_SRC);
-        }
-
-        // Match the Destination TCP/UDP port
-        Short matchDstTcpUdpPort = flowEntryMatch.dstTcpUdpPort();
-        if (matchDstTcpUdpPort != null) {
-            match.setTransportDestination(matchDstTcpUdpPort);
-            match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_TP_DST);
-        }
-
-        //
-        // Fetch the actions
-        //
-        Short actionOutputPort = null;
-        List<OFAction> openFlowActions = new ArrayList<OFAction>();
-        int actionsLen = 0;
-        FlowEntryActions flowEntryActions = flowEntry.flowEntryActions();
-        //
-        for (FlowEntryAction action : flowEntryActions.actions()) {
-            ActionOutput actionOutput = action.actionOutput();
-            ActionSetVlanId actionSetVlanId = action.actionSetVlanId();
-            ActionSetVlanPriority actionSetVlanPriority = action
-                    .actionSetVlanPriority();
-            ActionStripVlan actionStripVlan = action.actionStripVlan();
-            ActionSetEthernetAddr actionSetEthernetSrcAddr = action
-                    .actionSetEthernetSrcAddr();
-            ActionSetEthernetAddr actionSetEthernetDstAddr = action
-                    .actionSetEthernetDstAddr();
-            ActionSetIPv4Addr actionSetIPv4SrcAddr = action
-                    .actionSetIPv4SrcAddr();
-            ActionSetIPv4Addr actionSetIPv4DstAddr = action
-                    .actionSetIPv4DstAddr();
-            ActionSetIpToS actionSetIpToS = action.actionSetIpToS();
-            ActionSetTcpUdpPort actionSetTcpUdpSrcPort = action
-                    .actionSetTcpUdpSrcPort();
-            ActionSetTcpUdpPort actionSetTcpUdpDstPort = action
-                    .actionSetTcpUdpDstPort();
-            ActionEnqueue actionEnqueue = action.actionEnqueue();
-
-            if (actionOutput != null) {
-                actionOutputPort = actionOutput.port().value();
-                // XXX: The max length is hard-coded for now
-                OFActionOutput ofa = new OFActionOutput(actionOutput.port()
-                        .value(), (short) 0xffff);
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetVlanId != null) {
-                OFActionVirtualLanIdentifier ofa = new OFActionVirtualLanIdentifier(
-                        actionSetVlanId.vlanId());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetVlanPriority != null) {
-                OFActionVirtualLanPriorityCodePoint ofa = new OFActionVirtualLanPriorityCodePoint(
-                        actionSetVlanPriority.vlanPriority());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionStripVlan != null) {
-                if (actionStripVlan.stripVlan() == true) {
-                    OFActionStripVirtualLan ofa = new OFActionStripVirtualLan();
-                    openFlowActions.add(ofa);
-                    actionsLen += ofa.getLength();
-                }
-            }
-
-            if (actionSetEthernetSrcAddr != null) {
-                OFActionDataLayerSource ofa = new OFActionDataLayerSource(
-                        actionSetEthernetSrcAddr.addr().toBytes());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetEthernetDstAddr != null) {
-                OFActionDataLayerDestination ofa = new OFActionDataLayerDestination(
-                        actionSetEthernetDstAddr.addr().toBytes());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetIPv4SrcAddr != null) {
-                OFActionNetworkLayerSource ofa = new OFActionNetworkLayerSource(
-                        actionSetIPv4SrcAddr.addr().value());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetIPv4DstAddr != null) {
-                OFActionNetworkLayerDestination ofa = new OFActionNetworkLayerDestination(
-                        actionSetIPv4DstAddr.addr().value());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetIpToS != null) {
-                OFActionNetworkTypeOfService ofa = new OFActionNetworkTypeOfService(
-                        actionSetIpToS.ipToS());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetTcpUdpSrcPort != null) {
-                OFActionTransportLayerSource ofa = new OFActionTransportLayerSource(
-                        actionSetTcpUdpSrcPort.port());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionSetTcpUdpDstPort != null) {
-                OFActionTransportLayerDestination ofa = new OFActionTransportLayerDestination(
-                        actionSetTcpUdpDstPort.port());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-
-            if (actionEnqueue != null) {
-                OFActionEnqueue ofa = new OFActionEnqueue(actionEnqueue.port()
-                        .value(), actionEnqueue.queueId());
-                openFlowActions.add(ofa);
-                actionsLen += ofa.getLength();
-            }
-        }
-
-        fm.setIdleTimeout((short) flowEntry.idleTimeout())
-                .setHardTimeout((short) flowEntry.hardTimeout())
-                .setPriority((short) flowEntry.priority())
-                .setBufferId(OFPacketOut.BUFFER_ID_NONE).setCookie(cookie)
-                .setCommand(flowModCommand).setMatch(match)
-                .setActions(openFlowActions)
-                .setLengthU(OFFlowMod.MINIMUM_LENGTH + actionsLen);
-        fm.setOutPort(OFPort.OFPP_NONE.getValue());
-        if ((flowModCommand == OFFlowMod.OFPFC_DELETE)
-                || (flowModCommand == OFFlowMod.OFPFC_DELETE_STRICT)) {
-            if (actionOutputPort != null)
-                fm.setOutPort(actionOutputPort);
-        }
-
-        //
-        // Set the OFPFF_SEND_FLOW_REM flag if the Flow Entry is not
-        // permanent.
-        //
-        if ((flowEntry.idleTimeout() != 0) ||
-                (flowEntry.hardTimeout() != 0)) {
-            fm.setFlags(OFFlowMod.OFPFF_SEND_FLOW_REM);
-        }
-
-        if (log.isTraceEnabled()) {
-            log.trace("Installing flow entry {} into switch DPID: {} flowEntryId: {} srcMac: {} dstMac: {} inPort: {} outPort: {}"
-                    , flowEntry.flowEntryUserState()
-                    , sw.getStringId()
-                    , flowEntry.flowEntryId()
-                    , matchSrcMac
-                    , matchDstMac
-                    , matchInPort
-                    , actionOutputPort
-            );
-        }
-
-        return addMessageImpl(sw, fm, priority);
-    }
-
-    /**
-     * Add message to queue
-     *
-     * @param sw
-     * @param msg
-     * @param flowEntryId
-     * @return
-     */
-    protected boolean addMessageImpl(IOFSwitch sw, OFMessage msg, MsgPriority priority) {
-        FlowPusherThread thread = getProcessingThread(sw);
-
-        SwitchQueue queue = getQueue(sw);
-
-        // create queue at first addition of message
-        if (queue == null) {
-            queue = createQueueImpl(sw);
-        }
-
-        SwitchQueueEntry entry = new SwitchQueueEntry(msg);
-
-        synchronized (queue) {
-            queue.add(entry, priority);
-            if (log.isTraceEnabled()) {
-                log.trace("Message is pushed : {}", entry.getOFMessage());
-            }
-        }
-
-        thread.notifyMessagePushed();
-
-        return true;
-    }
-
-    @Override
-    public OFBarrierReply barrier(IOFSwitch sw) {
-        OFMessageFuture<OFBarrierReply> future = barrierAsync(sw);
-        if (future == null) {
-            return null;
-        }
-
-        try {
-            return future.get();
-        } catch (InterruptedException e) {
-            e.printStackTrace();
-            log.error("InterruptedException: {}", e);
-            return null;
-        } catch (ExecutionException e) {
-            e.printStackTrace();
-            log.error("ExecutionException: {}", e);
-            return null;
-        }
-    }
-
-    @Override
-    public OFBarrierReplyFuture barrierAsync(IOFSwitch sw) {
-        // TODO creation of message and future should be moved to OFSwitchImpl
-
-        if (sw == null) {
-            return null;
-        }
-
-        OFBarrierRequest msg = createBarrierRequest(sw);
-
-        OFBarrierReplyFuture future = new OFBarrierReplyFuture(threadPool, sw, msg.getXid());
-        barrierFutures.put(BarrierInfo.create(sw, msg), future);
-
-        addMessageImpl(sw, msg, MsgPriority.NORMAL);
-
-        return future;
-    }
-
-    protected OFBarrierRequest createBarrierRequest(IOFSwitch sw) {
-        OFBarrierRequest msg = (OFBarrierRequest) factory.getMessage(OFType.BARRIER_REQUEST);
-        msg.setXid(sw.getNextTransactionId());
-
-        return msg;
-    }
-
-    /**
-     * Get a queue attached to a switch.
-     *
-     * @param sw Switch object
-     * @return Queue object
-     */
-    protected SwitchQueue getQueue(IOFSwitch sw) {
-        if (sw == null) {
-            return null;
-        }
-
-        FlowPusherThread th = getProcessingThread(sw);
-        if (th == null) {
-            return null;
-        }
-
-        return th.assignedQueues.get(sw);
-    }
-
-    /**
-     * Get a hash value correspondent to a switch.
-     *
-     * @param sw Switch object
-     * @return Hash value
-     */
-    protected long getHash(IOFSwitch sw) {
-        // This code assumes DPID is sequentially assigned.
-        // TODO consider equalization algorithm
-        return sw.getId() % number_thread;
-    }
-
-    /**
-     * Get a Thread object which processes the queue attached to a switch.
-     *
-     * @param sw Switch object
-     * @return Thread object
-     */
-    protected FlowPusherThread getProcessingThread(IOFSwitch sw) {
-        long hash = getHash(sw);
-
-        return threadMap.get(hash);
-    }
-
-    @Override
-    public String getName() {
-        return "flowpusher";
-    }
-
-    @Override
-    public boolean isCallbackOrderingPrereq(OFType type, String name) {
-        return false;
-    }
-
-    @Override
-    public boolean isCallbackOrderingPostreq(OFType type, String name) {
-        return false;
-    }
-
-    @Override
-    public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
-        if (log.isTraceEnabled()) {
-            log.trace("Received BARRIER_REPLY from : {}", sw.getId());
-        }
-
-        if (msg.getType() != OFType.BARRIER_REPLY) {
-            log.error("Unexpected reply message : {}", msg.getType());
-            return Command.CONTINUE;
-        }
-
-        OFBarrierReply reply = (OFBarrierReply) msg;
-        BarrierInfo info = BarrierInfo.create(sw, reply);
-
-        // Deliver future if exists
-        OFBarrierReplyFuture future = barrierFutures.get(info);
-        if (future != null) {
-            future.deliverFuture(sw, msg);
-            barrierFutures.remove(info);
-        }
-
-        return Command.CONTINUE;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizer.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizer.java
deleted file mode 100644
index 12df976..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/FlowSynchronizer.java
+++ /dev/null
@@ -1,387 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
-
-import org.openflow.protocol.OFFlowMod;
-import org.openflow.protocol.OFMatch;
-import org.openflow.protocol.OFPort;
-import org.openflow.protocol.OFStatisticsRequest;
-import org.openflow.protocol.statistics.OFFlowStatisticsReply;
-import org.openflow.protocol.statistics.OFFlowStatisticsRequest;
-import org.openflow.protocol.statistics.OFStatistics;
-import org.openflow.protocol.statistics.OFStatisticsType;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import net.floodlightcontroller.core.IOFSwitch;
-import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService.MsgPriority;
-import net.onrc.onos.ofcontroller.util.Dpid;
-import net.onrc.onos.ofcontroller.util.FlowEntry;
-import net.onrc.onos.ofcontroller.util.FlowEntryId;
-
-/**
- * FlowSynchronizer is an implementation of FlowSyncService.
- * In addition to IFlowSyncService, FlowSynchronizer periodically reads flow
- * tables from switches and compare them with GraphDB to drop unnecessary
- * flows and/or to install missing flows.
- *
- * @author Brian
- */
-public class FlowSynchronizer implements IFlowSyncService {
-
-    private static Logger log = LoggerFactory.getLogger(FlowSynchronizer.class);
-
-    // TODO: fix when FlowSynchronizer is refactored
-    // private DBOperation dbHandler;
-    protected IFlowPusherService pusher;
-    private Map<IOFSwitch, FutureTask<SyncResult>> switchThreads;
-
-    public FlowSynchronizer() {
-        // TODO: fix when FlowSynchronizer is refactored
-        // dbHandler = GraphDBManager.getDBOperation();
-        switchThreads = new HashMap<IOFSwitch, FutureTask<SyncResult>>();
-    }
-
-    @Override
-    public Future<SyncResult> synchronize(IOFSwitch sw) {
-        Synchronizer sync = new Synchronizer(sw);
-        FutureTask<SyncResult> task = new FutureTask<SyncResult>(sync);
-        switchThreads.put(sw, task);
-        task.run();
-        return task;
-    }
-
-    @Override
-    public void interrupt(IOFSwitch sw) {
-        FutureTask<SyncResult> t = switchThreads.remove(sw);
-        if (t != null) {
-            t.cancel(true);
-        }
-    }
-
-    /**
-     * Initialize Synchronizer.
-     *
-     * @param pusherService FlowPusherService used for sending messages.
-     */
-    public void init(IFlowPusherService pusherService) {
-        pusher = pusherService;
-    }
-
-    /**
-     * Synchronizer represents main thread of synchronization.
-     *
-     * @author Brian
-     */
-    protected class Synchronizer implements Callable<SyncResult> {
-        IOFSwitch sw;
-        // TODO: fix when FlowSynchronizer is refactored
-        // ISwitchObject swObj;
-
-        public Synchronizer(IOFSwitch sw) {
-            this.sw = sw;
-            Dpid dpid = new Dpid(sw.getId());
-            // TODO: fix when FlowSynchronizer is refactored
-            // this.swObj = dbHandler.searchSwitch(dpid.toString());
-        }
-
-        double graphIDTime, switchTime, compareTime, graphEntryTime, extractTime, pushTime, totalTime;
-
-        @Override
-        public SyncResult call() {
-            pusher.suspend(sw);
-            try {
-                long start = System.nanoTime();
-                Set<FlowEntryWrapper> graphEntries = getFlowEntriesFromGraph();
-                long step1 = System.nanoTime();
-                Set<FlowEntryWrapper> switchEntries = getFlowEntriesFromSwitch();
-                if (switchEntries == null) {
-                    log.debug("getFlowEntriesFromSwitch() failed");
-                    return null;
-                }
-                long step2 = System.nanoTime();
-                SyncResult result = compare(graphEntries, switchEntries);
-                long step3 = System.nanoTime();
-                graphIDTime = (step1 - start);
-                switchTime = (step2 - step1);
-                compareTime = (step3 - step2);
-                totalTime = (step3 - start);
-                outputTime();
-
-                return result;
-            } finally {
-                pusher.resume(sw);
-            }
-        }
-
-        private void outputTime() {
-            double div = Math.pow(10, 6); //convert nanoseconds to ms
-            graphIDTime /= div;
-            switchTime /= div;
-            compareTime = (compareTime - graphEntryTime - extractTime - pushTime) / div;
-            graphEntryTime /= div;
-            extractTime /= div;
-            pushTime /= div;
-            totalTime /= div;
-            log.debug("Sync time (ms):{},{},{},{},{},{},{}"
-                    , graphIDTime
-                    , switchTime
-                    , compareTime
-                    , graphEntryTime
-                    , extractTime
-                    , pushTime
-                    , totalTime);
-        }
-
-        /**
-         * Compare flows entries in GraphDB and switch to pick up necessary
-         * messages.
-         * After picking up, picked messages are added to FlowPusher.
-         *
-         * @param graphEntries  Flow entries in GraphDB.
-         * @param switchEntries Flow entries in switch.
-         */
-        private SyncResult compare(Set<FlowEntryWrapper> graphEntries, Set<FlowEntryWrapper> switchEntries) {
-            int added = 0, removed = 0, skipped = 0;
-            for (FlowEntryWrapper entry : switchEntries) {
-                if (graphEntries.contains(entry)) {
-                    graphEntries.remove(entry);
-                    skipped++;
-                } else {
-                    // remove flow entry from the switch
-                    entry.removeFromSwitch(sw);
-                    removed++;
-                }
-            }
-            for (FlowEntryWrapper entry : graphEntries) {
-                // add flow entry to switch
-                entry.addToSwitch(sw);
-                graphEntryTime += entry.dbTime;
-                extractTime += entry.extractTime;
-                pushTime += entry.pushTime;
-                added++;
-            }
-            log.debug("Flow entries added {}, " +
-                    "Flow entries removed {}, " +
-                    "Flow entries skipped {}"
-                    , added
-                    , removed
-                    , skipped);
-
-            return new SyncResult(added, removed, skipped);
-        }
-
-        /**
-         * Read GraphDB to get FlowEntries associated with a switch.
-         *
-         * @return set of FlowEntries
-         */
-        private Set<FlowEntryWrapper> getFlowEntriesFromGraph() {
-            Set<FlowEntryWrapper> entries = new HashSet<FlowEntryWrapper>();
-
-            // TODO: fix when FlowSynchronizer is refactored
-        /*
-        for(IFlowEntry entry : swObj.getFlowEntries()) {
-        FlowEntryWrapper fe = new FlowEntryWrapper(entry);
-        entries.add(fe);
-        }
-        */
-            return entries;
-        }
-
-        /**
-         * Read flow table from switch and derive FlowEntries from table.
-         *
-         * @return set of FlowEntries
-         */
-        private Set<FlowEntryWrapper> getFlowEntriesFromSwitch() {
-
-            int lengthU = 0;
-            OFMatch match = new OFMatch();
-            match.setWildcards(OFMatch.OFPFW_ALL);
-
-            OFFlowStatisticsRequest stat = new OFFlowStatisticsRequest();
-            stat.setOutPort((short) 0xffff); //TODO: OFPort.OFPP_NONE
-            stat.setTableId((byte) 0xff); // TODO: fix this with enum (ALL TABLES)
-            stat.setMatch(match);
-            List<OFStatistics> stats = new ArrayList<OFStatistics>();
-            stats.add(stat);
-            lengthU += stat.getLength();
-
-            OFStatisticsRequest req = new OFStatisticsRequest();
-            req.setStatisticType(OFStatisticsType.FLOW);
-            req.setStatistics(stats);
-            lengthU += req.getLengthU();
-            req.setLengthU(lengthU);
-
-            List<OFStatistics> entries = null;
-            try {
-                Future<List<OFStatistics>> dfuture = sw.getStatistics(req);
-                entries = dfuture.get();
-            } catch (IOException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-                return null;
-            } catch (InterruptedException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-                return null;
-            } catch (ExecutionException e) {
-                // TODO Auto-generated catch block
-                e.printStackTrace();
-                return null;
-            }
-
-            Set<FlowEntryWrapper> results = new HashSet<FlowEntryWrapper>();
-            for (OFStatistics result : entries) {
-                OFFlowStatisticsReply entry = (OFFlowStatisticsReply) result;
-                FlowEntryWrapper fe = new FlowEntryWrapper(entry);
-                results.add(fe);
-            }
-            return results;
-        }
-
-    }
-
-    /**
-     * FlowEntryWrapper represents abstract FlowEntry which is embodied
-     * by FlowEntryId (from GraphDB) or OFFlowStatisticsReply (from switch).
-     *
-     * @author Brian
-     */
-    class FlowEntryWrapper {
-        FlowEntryId flowEntryId;
-        // TODO: fix when FlowSynchronizer is refactored
-        // IFlowEntry iFlowEntry;
-        OFFlowStatisticsReply statisticsReply;
-
-
-        // TODO: fix when FlowSynchronizer is refactored
-    /*
-    public FlowEntryWrapper(IFlowEntry entry) {
-        flowEntryId = new FlowEntryId(entry.getFlowEntryId());
-        iFlowEntry = entry;
-    }
-    */
-
-        public FlowEntryWrapper(OFFlowStatisticsReply entry) {
-            flowEntryId = new FlowEntryId(entry.getCookie());
-            statisticsReply = entry;
-        }
-
-        /**
-         * Install this FlowEntry to a switch via FlowPusher.
-         *
-         * @param sw Switch to which flow will be installed.
-         */
-        double dbTime, extractTime, pushTime;
-
-        public void addToSwitch(IOFSwitch sw) {
-            if (statisticsReply != null) {
-                log.error("Error adding existing flow entry {} to sw {}",
-                        statisticsReply.getCookie(), sw.getId());
-                return;
-            }
-
-            double startDB = System.nanoTime();
-            // Get the Flow Entry state from the Network Graph
-            // TODO: fix when FlowSynchronizer is refactored
-        /*
-        if (iFlowEntry == null) {
-            try {
-        // TODO: fix when FlowSynchronizer is refactored
-                iFlowEntry = dbHandler.searchFlowEntry(flowEntryId);
-            } catch (Exception e) {
-                log.error("Error finding flow entry {} in Network Graph",
-                        flowEntryId);
-                return;
-            }
-        }
-        */
-            dbTime = System.nanoTime() - startDB;
-
-            //
-            // TODO: The old FlowDatabaseOperation class is gone, so the code
-            //
-        /*
-        double startExtract = System.nanoTime();
-        FlowEntry flowEntry =
-        FlowDatabaseOperation.extractFlowEntry(iFlowEntry);
-        if (flowEntry == null) {
-        log.error("Cannot add flow entry {} to sw {} : flow entry cannot be extracted",
-              flowEntryId, sw.getId());
-        return;
-        }
-        extractTime = System.nanoTime() - startExtract;
-
-        double startPush = System.nanoTime();
-        pusher.pushFlowEntry(sw, flowEntry, MsgPriority.HIGH);
-        pushTime = System.nanoTime() - startPush;
-        */
-        }
-
-        /**
-         * Remove this FlowEntry from a switch via FlowPusher.
-         *
-         * @param sw Switch from which flow will be removed.
-         */
-        public void removeFromSwitch(IOFSwitch sw) {
-            if (statisticsReply == null) {
-                log.error("Error removing non-existent flow entry {} from sw {}",
-                        flowEntryId, sw.getId());
-                return;
-            }
-
-            // Convert Statistics Reply to Flow Mod, then write it
-            OFFlowMod fm = new OFFlowMod();
-            fm.setCookie(statisticsReply.getCookie());
-            fm.setCommand(OFFlowMod.OFPFC_DELETE_STRICT);
-            fm.setLengthU(OFFlowMod.MINIMUM_LENGTH);
-            fm.setMatch(statisticsReply.getMatch());
-            fm.setPriority(statisticsReply.getPriority());
-            fm.setOutPort(OFPort.OFPP_NONE);
-
-            pusher.add(sw, fm, MsgPriority.HIGH);
-        }
-
-        /**
-         * Return the hash code of the Flow Entry ID
-         */
-        @Override
-        public int hashCode() {
-            return flowEntryId.hashCode();
-        }
-
-        /**
-         * Returns true of the object is another Flow Entry ID with
-         * the same value; otherwise, returns false.
-         *
-         * @param Object to compare
-         * @return true if the object has the same Flow Entry ID.
-         */
-        @Override
-        public boolean equals(Object obj) {
-            if (obj != null && obj.getClass() == this.getClass()) {
-                FlowEntryWrapper entry = (FlowEntryWrapper) obj;
-                // TODO: we need to actually compare the match + actions
-                return this.flowEntryId.equals(entry.flowEntryId);
-            }
-            return false;
-        }
-
-        @Override
-        public String toString() {
-            return flowEntryId.toString();
-        }
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/IFlowPusherService.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/IFlowPusherService.java
deleted file mode 100644
index 6658495..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/IFlowPusherService.java
+++ /dev/null
@@ -1,187 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer;
-
-import java.util.Collection;
-
-import org.openflow.protocol.OFBarrierReply;
-import org.openflow.protocol.OFMessage;
-
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.core.internal.OFMessageFuture;
-import net.floodlightcontroller.core.module.IFloodlightService;
-import net.onrc.onos.ofcontroller.util.FlowEntry;
-import net.onrc.onos.ofcontroller.util.Pair;
-
-/**
- * FlowPusherService is a service to send message to switches in proper rate.
- * Conceptually a queue is attached to each switch, and FlowPusherService
- * read a message from queue and send it to switch in order.
- * To guarantee message has been installed, FlowPusherService can add barrier
- * message to queue and can notify when barrier message is sent to switch.
- *
- * @author Naoki Shiota
- */
-public interface IFlowPusherService extends IFloodlightService {
-    public static enum MsgPriority {
-        HIGH,        // High priority: e.g. flow synchronization
-        NORMAL,        // Normal priority
-//		LOW,		// Low priority, not needed for now
-    }
-
-    public static enum QueueState {
-        READY,        // Queues with all priority are at work
-        SUSPENDED,    // Only prior queue is at work
-        UNKNOWN
-    }
-
-    /**
-     * Create a queue correspondent to the switch.
-     *
-     * @param sw Switch to which new queue is attached.
-     * @return true if new queue is successfully created.
-     */
-    boolean createQueue(IOFSwitch sw);
-
-    /**
-     * Delete a queue correspondent to the switch.
-     * Messages remains in queue will be all sent before queue is deleted.
-     *
-     * @param sw Switch of which queue is deleted.
-     * @return true if queue is successfully deleted.
-     */
-    boolean deleteQueue(IOFSwitch sw);
-
-    /**
-     * Delete a queue correspondent to the switch.
-     * By setting force flag on, queue will be deleted immediately.
-     *
-     * @param sw        Switch of which queue is deleted.
-     * @param forceStop If this flag is set to true, queue will be deleted
-     *                  immediately regardless of any messages in the queue.
-     *                  If false, all messages will be sent to switch and queue will
-     *                  be deleted after that.
-     * @return true if queue is successfully deleted or flagged to be deleted.
-     */
-    boolean deleteQueue(IOFSwitch sw, boolean forceStop);
-
-    /**
-     * Add a message to the queue of the switch with normal priority.
-     * <p/>
-     * Note: Notification is NOT delivered for the pushed message.
-     *
-     * @param sw  Switch to which message is pushed.
-     * @param msg Message object to be added.
-     * @return true if message is successfully added to a queue.
-     */
-    boolean add(IOFSwitch sw, OFMessage msg);
-
-    /**
-     * Add a message to the queue of the switch with specific priority.
-     *
-     * @param sw       Switch to which message is pushed.
-     * @param msg      Message object to be added.
-     * @param priority Sending priority of the message.
-     * @return true if message is successfully added to a queue.
-     */
-    boolean add(IOFSwitch sw, OFMessage msg, MsgPriority priority);
-
-    /**
-     * Push a collection of Flow Entries to the corresponding switches
-     * with normal priority.
-     * <p/>
-     * Note: Notification is delivered for the Flow Entries that
-     * are pushed successfully.
-     *
-     * @param entries the collection of <IOFSwitch, FlowEntry> pairs
-     *                to push.
-     */
-    void pushFlowEntries(Collection<Pair<IOFSwitch, FlowEntry>> entries);
-
-    /**
-     * Push a collection of Flow Entries to the corresponding switches
-     * with specific priority.
-     * <p/>
-     * Note: Notification is delivered for the Flow Entries that
-     * are pushed successfully.
-     *
-     * @param entries  the collection of <IOFSwitch, FlowEntry> pairs
-     *                 to push.
-     * @param priority Sending priority of flow entries.
-     */
-    void pushFlowEntries(Collection<Pair<IOFSwitch, FlowEntry>> entries,
-                         MsgPriority priority);
-
-    /**
-     * Create a message from FlowEntry and add it to the queue of the
-     * switch with normal priority.
-     * <p/>
-     * Note: Notification is delivered for the Flow Entries that
-     * are pushed successfully.
-     *
-     * @param sw        Switch to which message is pushed.
-     * @param flowEntry FlowEntry object used for creating message.
-     * @return true if message is successfully added to a queue.
-     */
-    void pushFlowEntry(IOFSwitch sw, FlowEntry flowEntry);
-
-    /**
-     * Create a message from FlowEntry and add it to the queue of the
-     * switch with specific priority.
-     * <p/>
-     * Note: Notification is delivered for the Flow Entries that
-     * are pushed successfully.
-     *
-     * @param sw        Switch to which message is pushed.
-     * @param flowEntry FlowEntry object used for creating message.
-     * @return true if message is successfully added to a queue.
-     */
-    void pushFlowEntry(IOFSwitch sw, FlowEntry flowEntry,
-                       MsgPriority priority);
-
-    /**
-     * Set sending rate to a switch.
-     *
-     * @param sw   Switch.
-     * @param rate Rate in bytes/ms.
-     */
-    public void setRate(IOFSwitch sw, long rate);
-
-    /**
-     * Add BARRIER message to queue and wait for reply.
-     *
-     * @param sw Switch to which barrier message is pushed.
-     * @return BARRIER_REPLY message sent from switch.
-     */
-    OFBarrierReply barrier(IOFSwitch sw);
-
-    /**
-     * Add BARRIER message to queue asynchronously.
-     *
-     * @param sw Switch to which barrier message is pushed.
-     * @return Future object of BARRIER_REPLY message which will be sent from switch.
-     */
-    OFMessageFuture<OFBarrierReply> barrierAsync(IOFSwitch sw);
-
-    /**
-     * Suspend pushing message to a switch.
-     *
-     * @param sw Switch to be suspended pushing message.
-     * @return true if success
-     */
-    boolean suspend(IOFSwitch sw);
-
-    /**
-     * Resume pushing message to a switch.
-     *
-     * @param sw Switch to be resumed pushing message.
-     * @return true if success
-     */
-    boolean resume(IOFSwitch sw);
-
-    /**
-     * Get state of queue attached to a switch.
-     *
-     * @param sw Switch to be checked.
-     * @return State of queue.
-     */
-    QueueState getState(IOFSwitch sw);
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/IFlowSyncService.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/IFlowSyncService.java
deleted file mode 100644
index 63d395f..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/IFlowSyncService.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer;
-
-import java.util.concurrent.Future;
-
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.core.module.IFloodlightService;
-
-/**
- * FlowSyncService is a service to synchronize GraphDB and switch's flow table.
- * FlowSyncService offers APIs to trigger and interrupt synchronization explicitly.
- *
- * @author Brian
- */
-public interface IFlowSyncService extends IFloodlightService {
-    public Future<SyncResult> synchronize(IOFSwitch sw);
-
-    public void interrupt(IOFSwitch sw);
-
-    public class SyncResult {
-        public final int flowAdded;
-        public final int flowRemoved;
-        public final int flowSkipped;
-
-        public SyncResult(int added, int removed, int skipped) {
-            flowAdded = added;
-            flowRemoved = removed;
-            flowSkipped = skipped;
-        }
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/OFBarrierReplyFuture.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/OFBarrierReplyFuture.java
deleted file mode 100644
index 501eaa6..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/OFBarrierReplyFuture.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer;
-
-import java.util.concurrent.TimeUnit;
-
-import org.openflow.protocol.OFBarrierReply;
-import org.openflow.protocol.OFMessage;
-import org.openflow.protocol.OFType;
-
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.core.internal.OFMessageFuture;
-import net.floodlightcontroller.threadpool.IThreadPoolService;
-
-public class OFBarrierReplyFuture extends OFMessageFuture<OFBarrierReply> {
-
-    protected volatile boolean finished;
-
-    public OFBarrierReplyFuture(IThreadPoolService tp,
-                                IOFSwitch sw, int transactionId) {
-        super(tp, sw, OFType.FEATURES_REPLY, transactionId);
-        init();
-    }
-
-    public OFBarrierReplyFuture(IThreadPoolService tp,
-                                IOFSwitch sw, int transactionId, long timeout, TimeUnit unit) {
-        super(tp, sw, OFType.FEATURES_REPLY, transactionId, timeout, unit);
-        init();
-    }
-
-    private void init() {
-        this.finished = false;
-        this.result = null;
-    }
-
-    @Override
-    protected void handleReply(IOFSwitch sw, OFMessage msg) {
-        this.result = (OFBarrierReply) msg;
-        this.finished = true;
-    }
-
-    @Override
-    protected boolean isFinished() {
-        return finished;
-    }
-
-    @Override
-    protected void unRegister() {
-        super.unRegister();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/DoInterruptResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/DoInterruptResource.java
deleted file mode 100644
index 66704bf..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/DoInterruptResource.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import net.floodlightcontroller.core.IOFSwitch;
-
-import org.openflow.util.HexString;
-import org.restlet.resource.Get;
-
-/**
- * FlowProgrammer REST API implementation: Interrupt synchronization to a switch.
- * <p/>
- * GET /wm/fprog/synchronizer/interrupt/{dpid}/json"
- */
-public class DoInterruptResource extends SynchronizerResource {
-
-    /**
-     * Implement the API.
-     *
-     * @return true if succeeded, false if failed.
-     */
-    @Get("json")
-    public boolean retrieve() {
-        if (!init()) {
-            return false;
-        }
-
-        long dpid;
-        try {
-            dpid = HexString.toLong((String) getRequestAttributes().get("dpid"));
-        } catch (NumberFormatException e) {
-            log.error("Invalid number format");
-            return false;
-        }
-
-        IOFSwitch sw = provider.getSwitches().get(dpid);
-        if (sw == null) {
-            log.error("Invalid dpid");
-            return false;
-        }
-
-        synchronizer.interrupt(sw);
-
-        return true;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/DoSynchronizeResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/DoSynchronizeResource.java
deleted file mode 100644
index c7deb11..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/DoSynchronizeResource.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import net.floodlightcontroller.core.IOFSwitch;
-
-import org.openflow.util.HexString;
-import org.restlet.resource.Get;
-
-/**
- * FlowProgrammer REST API implementation: Begin synchronization to a switch.
- * <p/>
- * GET /wm/fprog/synchronizer/sync/{dpid}/json"
- */
-public class DoSynchronizeResource extends SynchronizerResource {
-    /**
-     * Implement the API.
-     *
-     * @return true if succeeded, false if failed.
-     */
-    @Get("json")
-    public boolean retrieve() {
-        if (!init()) {
-            return false;
-        }
-
-        long dpid;
-        try {
-            dpid = HexString.toLong((String) getRequestAttributes().get("dpid"));
-        } catch (NumberFormatException e) {
-            log.error("Invalid number format");
-            return false;
-        }
-
-        IOFSwitch sw = provider.getSwitches().get(dpid);
-        if (sw == null) {
-            log.error("Invalid dpid");
-            return false;
-        }
-
-        synchronizer.synchronize(sw);
-
-        return true;
-    }
-
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/FlowProgrammerWebRoutable.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/FlowProgrammerWebRoutable.java
deleted file mode 100644
index 26ea765..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/FlowProgrammerWebRoutable.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import org.restlet.Context;
-import org.restlet.Restlet;
-import org.restlet.routing.Router;
-
-import net.floodlightcontroller.restserver.RestletRoutable;
-
-public class FlowProgrammerWebRoutable implements RestletRoutable {
-
-    @Override
-    public Restlet getRestlet(Context context) {
-        Router router = new Router(context);
-        router.attach("/pusher/setrate/{dpid}/{rate}/json", SetPushRateResource.class);
-        router.attach("/pusher/suspend/{dpid}/json", SuspendPusherResource.class);
-        router.attach("/pusher/resume/{dpid}/json", ResumePusherResource.class);
-        router.attach("/pusher/barrier/{dpid}/json", SendBarrierResource.class);
-        router.attach("/synchronizer/sync/{dpid}/json", DoSynchronizeResource.class);
-        router.attach("/synchronizer/interrupt/{dpid}/json", DoInterruptResource.class);
-        return router;
-    }
-
-    @Override
-    public String basePath() {
-        return "/wm/onos/flowprogrammer";
-    }
-
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/PusherResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/PusherResource.java
deleted file mode 100644
index 5257646..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/PusherResource.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import org.restlet.resource.ServerResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService;
-
-public class PusherResource extends ServerResource {
-    protected final static Logger log = LoggerFactory.getLogger(PusherResource.class);
-
-    protected IFloodlightProviderService provider;
-    protected IFlowPusherService pusher;
-
-    protected boolean init() {
-        provider = (IFloodlightProviderService)
-                getContext().getAttributes().
-                        get(IFloodlightProviderService.class.getCanonicalName());
-        if (provider == null) {
-            log.debug("ONOS FloodlightProvider not found");
-            return false;
-        }
-
-        pusher = (IFlowPusherService) getContext().getAttributes().
-                get(IFlowPusherService.class.getCanonicalName());
-        if (pusher == null) {
-            log.debug("ONOS FlowPusherService not found");
-            return false;
-        }
-        return true;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/ResumePusherResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/ResumePusherResource.java
deleted file mode 100644
index 80f04f5..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/ResumePusherResource.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import net.floodlightcontroller.core.IOFSwitch;
-
-import org.openflow.util.HexString;
-import org.restlet.resource.Get;
-
-/**
- * FlowProgrammer REST API implementation: Resume sending message to switch.
- * <p/>
- * GET /wm/fprog/pusher/resume/{dpid}/json"
- */
-public class ResumePusherResource extends PusherResource {
-    /**
-     * Implement the API.
-     *
-     * @return true if succeeded, false if failed.
-     */
-    @Get("json")
-    public boolean retrieve() {
-        if (!init()) {
-            return false;
-        }
-
-        long dpid;
-        try {
-            dpid = HexString.toLong((String) getRequestAttributes().get("dpid"));
-        } catch (NumberFormatException e) {
-            log.error("Invalid number format");
-            return false;
-        }
-
-        IOFSwitch sw = provider.getSwitches().get(dpid);
-        if (sw == null) {
-            log.error("Invalid dpid");
-            return false;
-        }
-
-        return pusher.resume(sw);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SendBarrierResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SendBarrierResource.java
deleted file mode 100644
index 53fd14f..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SendBarrierResource.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import net.floodlightcontroller.core.IOFSwitch;
-
-import org.openflow.protocol.OFBarrierReply;
-import org.openflow.util.HexString;
-import org.restlet.resource.Get;
-
-/**
- * FlowProgrammer REST API implementation: Send barrier message to switch.
- * <p/>
- * GET /wm/fprog/pusher/barrier/{dpid}/json"
- */
-public class SendBarrierResource extends PusherResource {
-    /**
-     * Implement the API.
-     *
-     * @return true if succeeded, false if failed.
-     */
-    @Get("json")
-    public OFBarrierReply retrieve() {
-        if (!init()) {
-            return null;
-        }
-        long dpid;
-        try {
-            dpid = HexString.toLong((String) getRequestAttributes().get("dpid"));
-        } catch (NumberFormatException e) {
-            log.error("Invalid number format");
-            return null;
-        }
-
-        IOFSwitch sw = provider.getSwitches().get(dpid);
-        if (sw == null) {
-            log.error("Invalid dpid");
-            return null;
-        }
-
-        return pusher.barrier(sw);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SetPushRateResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SetPushRateResource.java
deleted file mode 100644
index 5879069..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SetPushRateResource.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import net.floodlightcontroller.core.IOFSwitch;
-
-import org.openflow.util.HexString;
-import org.restlet.resource.Get;
-
-/**
- * FlowProgrammer REST API implementation: Set sending rate to the switch.
- * <p/>
- * GET /wm/fprog/pusher/setrate/{dpid}/{rate}/json"
- */
-public class SetPushRateResource extends PusherResource {
-
-    /**
-     * Implement the API.
-     *
-     * @return true if succeeded, false if failed.
-     */
-    @Get("json")
-    public boolean retrieve() {
-        if (!init()) {
-            return false;
-        }
-
-        long dpid;
-        long rate;
-
-        try {
-            dpid = HexString.toLong((String) getRequestAttributes().get("dpid"));
-            rate = Long.valueOf((String) getRequestAttributes().get("rate"));
-        } catch (NumberFormatException e) {
-            log.error("Invalid number format");
-            return false;
-        }
-
-        IOFSwitch sw = provider.getSwitches().get(dpid);
-        if (sw == null) {
-            log.error("Invalid dpid");
-            return false;
-        }
-
-        pusher.setRate(sw, rate);
-
-        return true;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SuspendPusherResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SuspendPusherResource.java
deleted file mode 100644
index d01e259..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SuspendPusherResource.java
+++ /dev/null
@@ -1,46 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import net.floodlightcontroller.core.IOFSwitch;
-
-import org.openflow.util.HexString;
-import org.restlet.resource.Get;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * FlowProgrammer REST API implementation: Suspend sending message to switch.
- * <p/>
- * GET /wm/fprog/pusher/suspend/{dpid}/json"
- */
-public class SuspendPusherResource extends PusherResource {
-
-    protected final static Logger log = LoggerFactory.getLogger(SetPushRateResource.class);
-
-    /**
-     * Implement the API.
-     *
-     * @return true if succeeded, false if failed.
-     */
-    @Get("json")
-    public boolean retrieve() {
-        if (!init()) {
-            return false;
-        }
-
-        long dpid;
-        try {
-            dpid = HexString.toLong((String) getRequestAttributes().get("dpid"));
-        } catch (NumberFormatException e) {
-            log.error("Invalid number format");
-            return false;
-        }
-
-        IOFSwitch sw = provider.getSwitches().get(dpid);
-        if (sw == null) {
-            log.error("Invalid dpid");
-            return false;
-        }
-
-        return pusher.suspend(sw);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SynchronizerResource.java b/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SynchronizerResource.java
deleted file mode 100644
index b155fd3..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/flowprogrammer/web/SynchronizerResource.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package net.onrc.onos.ofcontroller.flowprogrammer.web;
-
-import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.onrc.onos.ofcontroller.flowprogrammer.IFlowSyncService;
-
-import org.restlet.resource.ServerResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class SynchronizerResource extends ServerResource {
-    protected final static Logger log = LoggerFactory.getLogger(SynchronizerResource.class);
-
-    protected IFloodlightProviderService provider;
-    protected IFlowSyncService synchronizer;
-
-    protected boolean init() {
-        provider = (IFloodlightProviderService)
-                getContext().getAttributes().
-                        get(IFloodlightProviderService.class.getCanonicalName());
-        if (provider == null) {
-            log.debug("ONOS FloodlightProvider not found");
-            return false;
-        }
-
-        synchronizer = (IFlowSyncService)
-                getContext().getAttributes().
-                        get(IFlowSyncService.class.getCanonicalName());
-        if (synchronizer == null) {
-            log.debug("ONOS FlowSyncService not found");
-            return false;
-        }
-
-        return true;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscovery.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscovery.java
deleted file mode 100644
index cdb71be..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscovery.java
+++ /dev/null
@@ -1,172 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery;
-
-import net.floodlightcontroller.core.IUpdate;
-
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.codehaus.jackson.map.ser.std.ToStringSerializer;
-import org.openflow.util.HexString;
-
-public interface ILinkDiscovery {
-
-    @JsonSerialize(using=ToStringSerializer.class)
-    public enum UpdateOperation {
-    	LINK_ADDED("Link Added"), // Operation Added by ONOS
-        LINK_UPDATED("Link Updated"),
-        LINK_REMOVED("Link Removed"),
-        SWITCH_UPDATED("Switch Updated"),
-        SWITCH_REMOVED("Switch Removed"),
-        PORT_UP("Port Up"),
-        PORT_DOWN("Port Down");
-        
-        private String value;
-        UpdateOperation(String v) {
-            value = v;
-        }
-        
-        @Override
-        public String toString() {
-            return value;
-        }
-    }
-
-    public class LDUpdate implements IUpdate{
-        protected long src;
-        protected short srcPort;
-        protected long dst;
-        protected short dstPort;
-        protected SwitchType srcType;
-        protected LinkType type;
-        protected UpdateOperation operation;
-
-        public LDUpdate(long src, short srcPort,
-                      long dst, short dstPort,
-                      ILinkDiscovery.LinkType type,
-                      UpdateOperation operation) {
-            this.src = src;
-            this.srcPort = srcPort;
-            this.dst = dst;
-            this.dstPort = dstPort;
-            this.type = type;
-            this.operation = operation;
-        }
-
-        public LDUpdate(LDUpdate old) {
-            this.src = old.src;
-            this.srcPort = old.srcPort;
-            this.dst = old.dst;
-            this.dstPort = old.dstPort;
-            this.srcType = old.srcType;
-            this.type = old.type;
-            this.operation = old.operation;
-        }
-
-        // For updtedSwitch(sw)
-        public LDUpdate(long switchId, SwitchType stype, UpdateOperation oper ){
-            this.operation = oper;
-            this.src = switchId;
-            this.srcType = stype;
-        }
-
-        // For port up or port down.
-        public LDUpdate(long sw, short port, UpdateOperation operation) {
-            this.src = sw;
-            this.srcPort = port;
-            this.operation = operation;
-        }
-
-        public long getSrc() {
-            return src;
-        }
-
-        public short getSrcPort() {
-            return srcPort;
-        }
-
-        public long getDst() {
-            return dst;
-        }
-
-        public short getDstPort() {
-            return dstPort;
-        }
-
-        public SwitchType getSrcType() {
-            return srcType;
-        }
-
-        public LinkType getType() {
-            return type;
-        }
-
-        public UpdateOperation getOperation() {
-            return operation;
-        }
-
-        public void setOperation(UpdateOperation operation) {
-            this.operation = operation;
-        }
-        
-        @Override
-        public String toString() {
-            switch (operation) {
-            case LINK_ADDED:
-            case LINK_REMOVED:
-            case LINK_UPDATED:
-                return "LDUpdate [operation=" + operation +
-                        ", src=" + HexString.toHexString(src)
-                        + ", srcPort=" + srcPort
-                        + ", dst=" + HexString.toHexString(dst) 
-                        + ", dstPort=" + dstPort
-                        + ", type=" + type + "]";
-            case PORT_DOWN:
-            case PORT_UP:
-                return "LDUpdate [operation=" + operation +
-                        ", src=" + HexString.toHexString(src)
-                        + ", srcPort=" + srcPort + "]";
-            case SWITCH_REMOVED:
-            case SWITCH_UPDATED:
-                return "LDUpdate [operation=" + operation +
-                        ", src=" + HexString.toHexString(src) + "]";
-            default:
-                return "LDUpdate: Unknown update.";
-            }
-        }
-
-		@Override
-		public void dispatch() {
-			// TODO Auto-generated method stub
-			
-		}
-    }
-
-    public enum SwitchType {
-        BASIC_SWITCH, CORE_SWITCH
-    };
-
-    public enum LinkType {
-        INVALID_LINK {
-        	@Override
-        	public String toString() {
-        		return "invalid";
-        	}
-        }, 
-        DIRECT_LINK{
-        	@Override
-        	public String toString() {
-        		return "internal";
-        	}
-        }, 
-        MULTIHOP_LINK {
-        	@Override
-        	public String toString() {
-        		return "external";
-        	}
-        }, 
-        TUNNEL {
-        	@Override
-        	public String toString() {
-        		return "tunnel";
-        	}
-        }
-    };
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscoveryListener.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscoveryListener.java
deleted file mode 100644
index 9ca114f..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscoveryListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-/**
- *    Copyright 2011, Big Switch Networks, Inc. 
- *    Originally created by David Erickson, Stanford University
- * 
- *    Licensed under the Apache License, Version 2.0 (the "License"); you may
- *    not use this file except in compliance with the License. You may obtain
- *    a copy of the License at
- *
- *         http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- *    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- *    License for the specific language governing permissions and limitations
- *    under the License.
- **/
-
-package net.onrc.onos.ofcontroller.linkdiscovery;
-
-public interface ILinkDiscoveryListener extends ILinkDiscovery{
-
-    public void linkDiscoveryUpdate(LDUpdate update);
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscoveryService.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscoveryService.java
deleted file mode 100644
index 2b45200..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/ILinkDiscoveryService.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/**
-*    Copyright 2011, Big Switch Networks, Inc. 
-*    Originally created by David Erickson, Stanford University
-* 
-*    Licensed under the Apache License, Version 2.0 (the "License"); you may
-*    not use this file except in compliance with the License. You may obtain
-*    a copy of the License at
-*
-*         http://www.apache.org/licenses/LICENSE-2.0
-*
-*    Unless required by applicable law or agreed to in writing, software
-*    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-*    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-*    License for the specific language governing permissions and limitations
-*    under the License.
-**/
-
-package net.onrc.onos.ofcontroller.linkdiscovery;
-
-import java.util.Map;
-import java.util.Set;
-
-import net.floodlightcontroller.core.module.IFloodlightService;
-
-
-public interface ILinkDiscoveryService extends IFloodlightService {
-    /**
-     * Retrieves a map of all known link connections between OpenFlow switches
-     * and the associated info (valid time, port states) for the link.
-     */
-    public Map<Link, LinkInfo> getLinks();
-
-    /**
-     * Returns link type of a given link
-     * @param info
-     * @return
-     */
-    public ILinkDiscovery.LinkType getLinkType(Link lt, LinkInfo info);
-
-    /**
-     * Returns an unmodifiable map from switch id to a set of all links with it 
-     * as an endpoint.
-     */
-    public Map<Long, Set<Link>> getSwitchLinks();
-
-    /**
-     * Adds a listener to listen for ILinkDiscoveryService messages
-     * @param listener The listener that wants the notifications
-     */
-    public void addListener(ILinkDiscoveryListener listener);
-
-    /**
-     * Retrieves a set of all switch ports on which lldps are suppressed.
-     */
-    public Set<NodePortTuple> getSuppressLLDPsInfo();
-
-    /**
-     * Adds a switch port to suppress lldp set
-     */
-    public void AddToSuppressLLDPs(long sw, short port);
-
-    /**
-     * Removes a switch port from suppress lldp set
-     */
-    public void RemoveFromSuppressLLDPs(long sw, short port);
-
-    /**
-     * Get the set of quarantined ports on a switch
-     */
-    public Set<Short> getQuarantinedPorts(long sw);
-
-    /**
-     * Get the status of auto port fast feature.
-     */
-    public boolean isAutoPortFastFeature();
-
-    /**
-     * Set the state for auto port fast feature.
-     * @param autoPortFastFeature
-     */
-    public void setAutoPortFastFeature(boolean autoPortFastFeature);
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/Link.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/Link.java
deleted file mode 100755
index 38fc3d9..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/Link.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/**
-*    Copyright 2011, Big Switch Networks, Inc. 
-*    Originally created by David Erickson, Stanford University
-* 
-*    Licensed under the Apache License, Version 2.0 (the "License"); you may
-*    not use this file except in compliance with the License. You may obtain
-*    a copy of the License at
-*
-*         http://www.apache.org/licenses/LICENSE-2.0
-*
-*    Unless required by applicable law or agreed to in writing, software
-*    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-*    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-*    License for the specific language governing permissions and limitations
-*    under the License.
-**/
-
-package net.onrc.onos.ofcontroller.linkdiscovery;
-
-import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
-import net.floodlightcontroller.core.web.serializers.UShortSerializer;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.openflow.util.HexString;
-
-public class Link {
-    private long src;
-    private short srcPort;
-    private long dst;
-    private short dstPort;
-
-
-    public Link(long srcId, short srcPort, long dstId, short dstPort) {
-        this.src = srcId;
-        this.srcPort = srcPort;
-        this.dst = dstId;
-        this.dstPort = dstPort;
-    }
-
-    // Convenience method
-    public Link(long srcId, int srcPort, long dstId, int dstPort) {
-        this.src = srcId;
-        this.srcPort = (short) srcPort;
-        this.dst = dstId;
-        this.dstPort = (short) dstPort;
-    }
-
-    @JsonProperty("src-switch")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getSrc() {
-        return src;
-    }
-
-    @JsonProperty("src-port")
-    @JsonSerialize(using=UShortSerializer.class)
-    public short getSrcPort() {
-        return srcPort;
-    }
-
-    @JsonProperty("dst-switch")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getDst() {
-        return dst;
-    }
-    @JsonProperty("dst-port")
-    @JsonSerialize(using=UShortSerializer.class)
-    public short getDstPort() {
-        return dstPort;
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + (int) (dst ^ (dst >>> 32));
-        result = prime * result + dstPort;
-        result = prime * result + (int) (src ^ (src >>> 32));
-        result = prime * result + srcPort;
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        Link other = (Link) obj;
-        if (dst != other.dst)
-            return false;
-        if (dstPort != other.dstPort)
-            return false;
-        if (src != other.src)
-            return false;
-        if (srcPort != other.srcPort)
-            return false;
-        return true;
-    }
-
-
-    @Override
-    public String toString() {
-        return "Link [src=" + HexString.toHexString(this.src) 
-                + " outPort="
-                + (srcPort & 0xffff)
-                + ", dst=" + HexString.toHexString(this.dst)
-                + ", inPort="
-                + (dstPort & 0xffff)
-                + "]";
-    }
-    
-    public String toKeyString() {
-    	return (HexString.toHexString(this.src) + "|" +
-    			(this.srcPort & 0xffff) + "|" +
-    			HexString.toHexString(this.dst) + "|" +
-    		    (this.dstPort & 0xffff) );
-    }
-}
-
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/LinkInfo.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/LinkInfo.java
deleted file mode 100644
index 825b0a2..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/LinkInfo.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/**
-*    Copyright 2011, Big Switch Networks, Inc.*    Originally created by David Erickson, Stanford University
-**    Licensed under the Apache License, Version 2.0 (the "License"); you may
-*    not use this file except in compliance with the License. You may obtain
-*    a copy of the License at
-*
-*         http://www.apache.org/licenses/LICENSE-2.0
-*
-*    Unless required by applicable law or agreed to in writing, software
-*    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
-*    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
-*    License for the specific language governing permissions and limitations
-*    under the License.
-**/
-
-package net.onrc.onos.ofcontroller.linkdiscovery;
-
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscovery.LinkType;
-
-import org.openflow.protocol.OFPhysicalPort.OFPortState;
-
-public class LinkInfo {
-
-    public LinkInfo(Long firstSeenTime,
-                    Long lastLldpReceivedTime,
-                    Long lastBddpReceivedTime,
-                    int srcPortState,
-                    int dstPortState) {
-        super();
-        this.srcPortState = srcPortState;
-        this.dstPortState = dstPortState;
-        this.firstSeenTime = firstSeenTime;
-        this.lastLldpReceivedTime = lastLldpReceivedTime;
-        this.lastBddpReceivedTime = lastBddpReceivedTime;
-    }
-
-    protected Integer srcPortState;
-    protected Integer dstPortState;
-    protected Long firstSeenTime;
-    protected Long lastLldpReceivedTime; /* Standard LLLDP received time */
-    protected Long lastBddpReceivedTime; /* Modified LLDP received time  */
-
-    /** The port states stored here are topology's last knowledge of
-     * the state of the port. This mostly mirrors the state
-     * maintained in the port list in IOFSwitch (i.e. the one returned
-     * from getPort), except that during a port status message the
-     * IOFSwitch port state will already have been updated with the
-     * new port state, so topology needs to keep its own copy so that
-     * it can determine if the port state has changed and therefore
-     * requires the new state to be written to storage.
-     */
-
-
-
-    public boolean linkStpBlocked() {
-        return ((srcPortState & OFPortState.OFPPS_STP_MASK.getValue()) == OFPortState.OFPPS_STP_BLOCK.getValue()) ||
-            ((dstPortState & OFPortState.OFPPS_STP_MASK.getValue()) == OFPortState.OFPPS_STP_BLOCK.getValue());
-    }
-
-    public Long getFirstSeenTime() {
-        return firstSeenTime;
-    }
-
-    public void setFirstSeenTime(Long firstSeenTime) {
-        this.firstSeenTime = firstSeenTime;
-    }
-
-    public Long getUnicastValidTime() {
-        return lastLldpReceivedTime;
-    }
-
-    public void setUnicastValidTime(Long unicastValidTime) {
-        this.lastLldpReceivedTime = unicastValidTime;
-    }
-
-    public Long getMulticastValidTime() {
-        return lastBddpReceivedTime;
-    }
-
-    public void setMulticastValidTime(Long multicastValidTime) {
-        this.lastBddpReceivedTime = multicastValidTime;
-    }
-
-    public Integer getSrcPortState() {
-        return srcPortState;
-    }
-
-    public void setSrcPortState(Integer srcPortState) {
-        this.srcPortState = srcPortState;
-    }
-
-    public Integer getDstPortState() {
-        return dstPortState;
-    }
-
-    public void setDstPortState(int dstPortState) {
-        this.dstPortState = dstPortState;
-    }
-
-    public LinkType getLinkType() {
-        if (lastLldpReceivedTime != null) {
-            return LinkType.DIRECT_LINK;
-        } else if (lastBddpReceivedTime != null) {
-            return LinkType.MULTIHOP_LINK;
-        }
-        return LinkType.INVALID_LINK;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#hashCode()
-     */
-    @Override
-    public int hashCode() {
-        final int prime = 5557;
-        int result = 1;
-        result = prime * result + ((firstSeenTime == null) ? 0 : firstSeenTime.hashCode());
-        result = prime * result + ((lastLldpReceivedTime == null) ? 0 : lastLldpReceivedTime.hashCode());
-        result = prime * result + ((lastBddpReceivedTime == null) ? 0 : lastBddpReceivedTime.hashCode());
-        result = prime * result + ((srcPortState == null) ? 0 : srcPortState.hashCode());
-        result = prime * result + ((dstPortState == null) ? 0 : dstPortState.hashCode());
-        return result;
-    }
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#equals(java.lang.Object)
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (!(obj instanceof LinkInfo))
-            return false;
-        LinkInfo other = (LinkInfo) obj;
-
-        if (firstSeenTime == null) {
-            if (other.firstSeenTime != null)
-                return false;
-        } else if (!firstSeenTime.equals(other.firstSeenTime))
-            return false;
-
-        if (lastLldpReceivedTime == null) {
-            if (other.lastLldpReceivedTime != null)
-                return false;
-        } else if (!lastLldpReceivedTime.equals(other.lastLldpReceivedTime))
-            return false;
-
-        if (lastBddpReceivedTime == null) {
-            if (other.lastBddpReceivedTime != null)
-                return false;
-        } else if (!lastBddpReceivedTime.equals(other.lastBddpReceivedTime))
-            return false;
-
-        if (srcPortState == null) {
-            if (other.srcPortState != null)
-                return false;
-        } else if (!srcPortState.equals(other.srcPortState))
-            return false;
-
-        if (dstPortState == null) {
-            if (other.dstPortState != null)
-                return false;
-        } else if (!dstPortState.equals(other.dstPortState))
-            return false;
-
-        return true;
-    }
-
-
-    /* (non-Javadoc)
-     * @see java.lang.Object#toString()
-     */
-    @Override
-    public String toString() {
-        return "LinkInfo [unicastValidTime=" + ((lastLldpReceivedTime == null) ? "null" : lastLldpReceivedTime)
-                + ", multicastValidTime=" + ((lastBddpReceivedTime == null) ? "null" : lastBddpReceivedTime)
-                + ", srcPortState=" + ((srcPortState == null) ? "null" : srcPortState)
-                + ", dstPortState=" + ((dstPortState == null) ? "null" : srcPortState)
-                + "]";
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/NodePortTuple.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/NodePortTuple.java
deleted file mode 100644
index 646386c..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/NodePortTuple.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery;
-
-import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
-import net.floodlightcontroller.core.web.serializers.UShortSerializer;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.openflow.util.HexString;
-
-/**
- * A NodePortTuple is similar to a SwitchPortTuple
- * but it only stores IDs instead of references
- * to the actual objects.
- * @author srini
- */
-public class NodePortTuple {
-    protected long nodeId; // switch DPID
-    protected short portId; // switch port id
-
-    /**
-     * Creates a NodePortTuple
-     * @param nodeId The DPID of the switch
-     * @param portId The port of the switch
-     */
-    public NodePortTuple(long nodeId, short portId) {
-        this.nodeId = nodeId;
-        this.portId = portId;
-    }
-
-    public NodePortTuple(long nodeId, int portId) {
-        this.nodeId = nodeId;
-        this.portId = (short) portId;
-    }
-
-    @JsonProperty("switch")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getNodeId() {
-        return nodeId;
-    }
-    public void setNodeId(long nodeId) {
-        this.nodeId = nodeId;
-    }
-    @JsonProperty("port")
-    @JsonSerialize(using=UShortSerializer.class)
-    public short getPortId() {
-        return portId;
-    }
-    public void setPortId(short portId) {
-        this.portId = portId;
-    }
-    
-    public String toString() {
-        return "[id=" + HexString.toHexString(nodeId) + ", port=" + new Short(portId) + "]";
-    }
-
-    @Override
-    public int hashCode() {
-        final int prime = 31;
-        int result = 1;
-        result = prime * result + (int) (nodeId ^ (nodeId >>> 32));
-        result = prime * result + portId;
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null)
-            return false;
-        if (getClass() != obj.getClass())
-            return false;
-        NodePortTuple other = (NodePortTuple) obj;
-        if (nodeId != other.nodeId)
-            return false;
-        if (portId != other.portId)
-            return false;
-        return true;
-    }
-    
-    /**
-     * API to return a String value formed wtih NodeID and PortID
-     * The portID is a 16-bit field, so mask it as an integer to get full
-     * positive value
-     * @return
-     */
-    public String toKeyString() {
-        return (HexString.toHexString(nodeId)+ "|" + (portId & 0xffff));
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/README b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/README
deleted file mode 100644
index 3cec58d..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/README
+++ /dev/null
@@ -1,8 +0,0 @@
-Note about this directory
-=========================
-
-This directory contains link discovery manager and it's related module derived from Flood Light v0.9.0.
-Many of the code is unmodified from it's original state, but they had to be moved due to package visibility etc.
-
-Compare with floodlight's linkdiscovery directory to see what was modified from it's original code.
-
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologyCluster.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologyCluster.java
deleted file mode 100644
index 696c63e..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologyCluster.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery.internal;
-
-import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/***
- * Topology Cluster merge/split event history related classes and members
- * @author subrata
- *
- */
-public class EventHistoryTopologyCluster {
-    // The following fields are not stored as String to save memory
-    // They should be converted to appropriate human-readable strings by 
-    // the front end (e.g. in cli in Python)
-    public long     dpid;
-    public long     clusterIdOld; // Switch with dpid moved from cluster x to y
-    public long     clusterIdNew;
-    public String   reason;
-    
-    @JsonProperty("Switch")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getDpid() {
-        return dpid;
-    }
-    @JsonProperty("OldClusterId")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getClusterIdOld() {
-        return clusterIdOld;
-    }
-    @JsonProperty("NewClusterId")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getClusterIdNew() {
-        return clusterIdNew;
-    }
-    @JsonProperty("Reason")
-    public String getReason() {
-        return reason;
-    }
-    
-    
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologyLink.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologyLink.java
deleted file mode 100644
index 5d2e955..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologyLink.java
+++ /dev/null
@@ -1,62 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery.internal;
-
-import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/***
- * Topology link up/down event history related classes and members
- * @author subrata
- *
- */
-public class EventHistoryTopologyLink {
-    // The following fields are not stored as String to save memory
-    // They should be converted to appropriate human-readable strings by 
-    // the front end (e.g. in cli in Python)
-    public long     srcSwDpid;
-    public long     dstSwDpid;
-    public int      srcPortState;
-    public int      dstPortState;
-    public int      srcSwport;
-    public int      dstSwport;
-    public String   linkType;
-    public String   reason;
-    
-    @JsonProperty("Source-Switch")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getSrcSwDpid() {
-        return srcSwDpid;
-    }
-    @JsonProperty("Dest-Switch")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getDstSwDpid() {
-        return dstSwDpid;
-    }
-    @JsonProperty("SrcPortState")
-    public int getSrcPortState() {
-        return srcPortState;
-    }
-    @JsonProperty("DstPortState")
-    public int getDstPortState() {
-        return dstPortState;
-    }
-    @JsonProperty("SrcPort")
-    public int getSrcSwport() {
-        return srcSwport;
-    }
-    @JsonProperty("DstPort")
-    public int getDstSwport() {
-        return dstSwport;
-    }
-    @JsonProperty("LinkType")
-    public String getLinkType() {
-        return linkType;
-    }
-    @JsonProperty("Reason")
-    public String getReason() {
-        return reason;
-    }
-    
-    
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologySwitch.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologySwitch.java
deleted file mode 100644
index d6afd7a..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/EventHistoryTopologySwitch.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery.internal;
-
-import net.floodlightcontroller.core.web.serializers.DPIDSerializer;
-import net.floodlightcontroller.core.web.serializers.IPv4Serializer;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/***
- * Topology Switch event history related classes and members
- * @author subrata
- *
- */
-public class EventHistoryTopologySwitch {
-    // The following fields are not stored as String to save memory
-    // They should be converted to appropriate human-readable strings by 
-    // the front end (e.g. in cli in Python)
-    public long     dpid;
-    public int  ipv4Addr;
-    public int    l4Port;
-    public String   reason;
-    
-    @JsonProperty("Switch")
-    @JsonSerialize(using=DPIDSerializer.class)
-    public long getDpid() {
-        return dpid;
-    }
-    @JsonProperty("IpAddr")
-    @JsonSerialize(using=IPv4Serializer.class)
-    public int getIpv4Addr() {
-        return ipv4Addr;
-    }
-    @JsonProperty("Port")
-    public int getL4Port() {
-        return l4Port;
-    }
-    @JsonProperty("Reason")
-    public String getReason() {
-        return reason;
-    }
-    
-    
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/LinkDiscoveryManager.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
deleted file mode 100644
index aa6e1d4..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/LinkDiscoveryManager.java
+++ /dev/null
@@ -1,1816 +0,0 @@
-/**
- *    Copyright 2011, Big Switch Networks, Inc.
- *    Originally created by David Erickson, Stanford University
- *
- *    Licensed under the Apache License, Version 2.0 (the "License"); you may
- *    not use this file except in compliance with the License. You may obtain
- *    a copy of the License at
- *
- *         http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- *    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- *    License for the specific language governing permissions and limitations
- *    under the License.
- **/
-
-package net.onrc.onos.ofcontroller.linkdiscovery.internal;
-
-import java.io.IOException;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-import java.net.NetworkInterface;
-import java.net.SocketAddress;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import net.floodlightcontroller.core.FloodlightContext;
-import net.floodlightcontroller.core.IFloodlightProviderService;
-import net.floodlightcontroller.core.IOFMessageListener;
-import net.floodlightcontroller.core.IOFSwitch;
-import net.floodlightcontroller.core.IOFSwitchListener;
-import net.floodlightcontroller.core.annotations.LogMessageCategory;
-import net.floodlightcontroller.core.annotations.LogMessageDoc;
-import net.floodlightcontroller.core.annotations.LogMessageDocs;
-import net.floodlightcontroller.core.internal.OFSwitchImpl;
-import net.floodlightcontroller.core.module.FloodlightModuleContext;
-import net.floodlightcontroller.core.module.FloodlightModuleException;
-import net.floodlightcontroller.core.module.IFloodlightModule;
-import net.floodlightcontroller.core.module.IFloodlightService;
-import net.floodlightcontroller.core.util.SingletonTask;
-import net.floodlightcontroller.restserver.IRestApiService;
-import net.floodlightcontroller.threadpool.IThreadPoolService;
-import net.floodlightcontroller.util.EventHistory;
-import net.floodlightcontroller.util.EventHistory.EvAction;
-import net.onrc.onos.core.main.IOnosRemoteSwitch;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscovery;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscovery.LDUpdate;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscovery.UpdateOperation;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryListener;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
-import net.onrc.onos.ofcontroller.linkdiscovery.Link;
-import net.onrc.onos.ofcontroller.linkdiscovery.LinkInfo;
-import net.onrc.onos.ofcontroller.linkdiscovery.NodePortTuple;
-import net.onrc.onos.ofcontroller.linkdiscovery.web.LinkDiscoveryWebRoutable;
-import net.onrc.onos.packet.BSN;
-import net.onrc.onos.packet.Ethernet;
-import net.onrc.onos.packet.IPv4;
-import net.onrc.onos.packet.LLDP;
-import net.onrc.onos.packet.LLDPTLV;
-import net.onrc.onos.registry.controller.IControllerRegistryService;
-
-import org.openflow.protocol.OFMessage;
-import org.openflow.protocol.OFPacketIn;
-import org.openflow.protocol.OFPacketOut;
-import org.openflow.protocol.OFPhysicalPort;
-import org.openflow.protocol.OFPhysicalPort.OFPortConfig;
-import org.openflow.protocol.OFPhysicalPort.OFPortState;
-import org.openflow.protocol.OFPort;
-import org.openflow.protocol.OFPortStatus;
-import org.openflow.protocol.OFPortStatus.OFPortReason;
-import org.openflow.protocol.OFType;
-import org.openflow.protocol.action.OFAction;
-import org.openflow.protocol.action.OFActionOutput;
-import org.openflow.util.HexString;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This class sends out LLDP messages containing the sending switch's datapath
- * id as well as the outgoing port number.  Received LLrescDP messages that
- * match a known switch cause a new LinkTuple to be created according to the
- * invariant rules listed below.  This new LinkTuple is also passed to routing
- * if it exists to trigger updates.
- *
- * This class also handles removing links that are associated to switch ports
- * that go down, and switches that are disconnected.
- *
- * Invariants:
- *  -portLinks and switchLinks will not contain empty Sets outside of
- *   critical sections
- *  -portLinks contains LinkTuples where one of the src or dst
- *   SwitchPortTuple matches the map key
- *  -switchLinks contains LinkTuples where one of the src or dst
- *   SwitchPortTuple's id matches the switch id
- *  -Each LinkTuple will be indexed into switchLinks for both
- *   src.id and dst.id, and portLinks for each src and dst
- *  -The updates queue is only added to from within a held write lock
- */
-@LogMessageCategory("Network Topology")
-public class LinkDiscoveryManager
-implements IOFMessageListener, IOFSwitchListener,
-ILinkDiscoveryService, IFloodlightModule {
-	protected IFloodlightProviderService controller;
-    protected final static Logger log = LoggerFactory.getLogger(LinkDiscoveryManager.class);
-
-    protected IFloodlightProviderService floodlightProvider;
-    protected IThreadPoolService threadPool;
-    protected IRestApiService restApi;
-    // Registry Service for ONOS
-    protected IControllerRegistryService registryService;
-
-
-    // LLDP and BDDP fields
-    private static final byte[] LLDP_STANDARD_DST_MAC_STRING =
-            HexString.fromHexString("01:80:c2:00:00:0e");
-    private static final long LINK_LOCAL_MASK  = 0xfffffffffff0L;
-    private static final long LINK_LOCAL_VALUE = 0x0180c2000000L;
-
-    // BigSwitch OUI is 5C:16:C7, so 5D:16:C7 is the multicast version
-    // private static final String LLDP_BSN_DST_MAC_STRING = "5d:16:c7:00:00:01";
-    private static final String LLDP_BSN_DST_MAC_STRING = "ff:ff:ff:ff:ff:ff";
-
-
-    // Direction TLVs are used to indicate if the LLDPs were sent
-    // periodically or in response to a recieved LLDP
-    private static final byte TLV_DIRECTION_TYPE = 0x73;
-    private static final short TLV_DIRECTION_LENGTH = 1;  // 1 byte
-    private static final byte TLV_DIRECTION_VALUE_FORWARD[] = {0x01};
-    private static final byte TLV_DIRECTION_VALUE_REVERSE[] = {0x02};
-    private static final LLDPTLV forwardTLV
-    = new LLDPTLV().
-    setType(TLV_DIRECTION_TYPE).
-    setLength(TLV_DIRECTION_LENGTH).
-    setValue(TLV_DIRECTION_VALUE_FORWARD);
-
-    private static final LLDPTLV reverseTLV
-    = new LLDPTLV().
-    setType(TLV_DIRECTION_TYPE).
-    setLength(TLV_DIRECTION_LENGTH).
-    setValue(TLV_DIRECTION_VALUE_REVERSE);
-
-    // Link discovery task details.
-    protected SingletonTask discoveryTask;
-    protected final int DISCOVERY_TASK_INTERVAL = 1;
-    protected final int LINK_TIMEOUT = 35; // original 35 secs, aggressive 5 secs
-    protected final int LLDP_TO_ALL_INTERVAL = 15 ; //original 15 seconds, aggressive 2 secs.
-    protected long lldpClock = 0;
-    // This value is intentionally kept higher than LLDP_TO_ALL_INTERVAL.
-    // If we want to identify link failures faster, we could decrease this
-    // value to a small number, say 1 or 2 sec.
-    protected final int LLDP_TO_KNOWN_INTERVAL= 20; // LLDP frequency for known links
-
-    protected LLDPTLV controllerTLV;
-    protected ReentrantReadWriteLock lock;
-    int lldpTimeCount = 0;
-
-    /**
-     * Flag to indicate if automatic port fast is enabled or not.
-     * Default is set to false -- Initialized in the init method as well.
-     */
-    boolean autoPortFastFeature = false;
-
-    /**
-     * Map of remote switches that are not connected to this controller. This
-     * is used to learn remote switches in a distributed controller ONOS.
-     */
-    protected Map<Long, IOnosRemoteSwitch> remoteSwitches;
-
-    /**
-     * Map from link to the most recent time it was verified functioning
-     */
-    protected Map<Link, LinkInfo> links;
-
-    /**
-     * Map from switch id to a set of all links with it as an endpoint
-     */
-    protected Map<Long, Set<Link>> switchLinks;
-
-    /**
-     * Map from a id:port to the set of links containing it as an endpoint
-     */
-    protected Map<NodePortTuple, Set<Link>> portLinks;
-
-    /**
-     * Set of link tuples over which multicast LLDPs are received
-     * and unicast LLDPs are not received.
-     */
-    protected Map<NodePortTuple, Set<Link>> portBroadcastDomainLinks;
-
-    protected volatile boolean shuttingDown = false;
-
-    /* topology aware components are called in the order they were added to the
-     * the array */
-    protected ArrayList<ILinkDiscoveryListener> linkDiscoveryAware;
-
-    protected class LinkUpdate extends LDUpdate {
-
-		public LinkUpdate(LDUpdate old) {
-			super(old);
-		}
-		@LogMessageDoc(level="ERROR",
-	            message="Error in link discovery updates loop",
-	            explanation="An unknown error occured while dispatching " +
-	            		"link update notifications",
-	            recommendation=LogMessageDoc.GENERIC_ACTION)
-		@Override
-		public void dispatch() {
-			if (linkDiscoveryAware != null) {
-                if (log.isTraceEnabled()) {
-                    log.trace("Dispatching link discovery update {} {} {} {} {} for {}",
-                              new Object[]{this.getOperation(),
-                                           HexString.toHexString(this.getSrc()), this.getSrcPort(),
-                                           HexString.toHexString(this.getDst()), this.getDstPort(),
-                                           linkDiscoveryAware});
-                }
-                try {
-                    for (ILinkDiscoveryListener lda : linkDiscoveryAware) { // order maintained
-                        lda.linkDiscoveryUpdate(this);
-                    }
-                }
-                catch (Exception e) {
-                    log.error("Error in link discovery updates loop", e);
-                }
-            }
-		}
-    }
-
-    /**
-     * List of ports through which LLDP/BDDPs are not sent.
-     */
-    protected Set<NodePortTuple> suppressLinkDiscovery;
-
-    /** A list of ports that are quarantined for discovering links through
-     * them.  Data traffic from these ports are not allowed until the ports
-     * are released from quarantine.
-     */
-    protected LinkedBlockingQueue<NodePortTuple> quarantineQueue;
-    protected LinkedBlockingQueue<NodePortTuple> maintenanceQueue;
-    /**
-     * Quarantine task
-     */
-    protected SingletonTask bddpTask;
-    protected final int BDDP_TASK_INTERVAL = 100; // 100 ms.
-    protected final int BDDP_TASK_SIZE = 5;       // # of ports per iteration
-
-    /**
-     * Map of broadcast domain ports and the last time a BDDP was either
-     * sent or received on that port.
-     */
-    protected Map<NodePortTuple, Long> broadcastDomainPortTimeMap;
-
-    /**
-     * Get the LLDP sending period in seconds.
-     * @return LLDP sending period in seconds.
-     */
-    public int getLldpFrequency() {
-        return LLDP_TO_KNOWN_INTERVAL;
-    }
-
-    /**
-     * Get the LLDP timeout value in seconds
-     * @return LLDP timeout value in seconds
-     */
-    public int getLldpTimeout() {
-        return LINK_TIMEOUT;
-    }
-
-    public Map<NodePortTuple, Set<Link>> getPortLinks() {
-        return portLinks;
-    }
-
-    @Override
-    public Set<NodePortTuple> getSuppressLLDPsInfo() {
-        return suppressLinkDiscovery;
-    }
-
-    /**
-     * Add a switch port to the suppressed LLDP list.
-     * Remove any known links on the switch port.
-     */
-    @Override
-    public void AddToSuppressLLDPs(long sw, short port)
-    {
-        NodePortTuple npt = new NodePortTuple(sw, port);
-        this.suppressLinkDiscovery.add(npt);
-        deleteLinksOnPort(npt, "LLDP suppressed.");
-    }
-
-    /**
-     * Remove a switch port from the suppressed LLDP list.
-     * Discover links on that switchport.
-     */
-    @Override
-    public void RemoveFromSuppressLLDPs(long sw, short port)
-    {
-        NodePortTuple npt = new NodePortTuple(sw, port);
-        this.suppressLinkDiscovery.remove(npt);
-        discover(npt);
-    }
-
-    public boolean isShuttingDown() {
-        return shuttingDown;
-    }
-
-    public boolean isFastPort(long sw, short port) {
-        return false;
-    }
-
-    @Override
-    public ILinkDiscovery.LinkType getLinkType(Link lt, LinkInfo info) {
-        if (info.getUnicastValidTime() != null) {
-            return ILinkDiscovery.LinkType.DIRECT_LINK;
-        } else if (info.getMulticastValidTime() != null) {
-            return ILinkDiscovery.LinkType.MULTIHOP_LINK;
-        }
-        return ILinkDiscovery.LinkType.INVALID_LINK;
-    }
-
-
-    private boolean isLinkDiscoverySuppressed(long sw, short portNumber) {
-        return this.suppressLinkDiscovery.contains(new NodePortTuple(sw, portNumber));
-    }
-
-    protected void discoverLinks() {
-
-        // timeout known links.
-        timeoutLinks();
-
-        //increment LLDP clock
-        lldpClock = (lldpClock + 1)% LLDP_TO_ALL_INTERVAL;
-
-        if (lldpClock == 0) {
-            log.debug("Sending LLDP out on all ports.");
-            discoverOnAllPorts();
-        }
-    }
-
-
-    /**
-     *  Quarantine Ports.
-     */
-    protected class QuarantineWorker implements Runnable {
-        @Override
-        public void run() {
-            try {
-                processBDDPLists();
-            }
-            catch (Exception e) {
-                log.error("Error in quarantine worker thread", e);
-            } finally {
-                    bddpTask.reschedule(BDDP_TASK_INTERVAL,
-                                              TimeUnit.MILLISECONDS);
-            }
-        }
-    }
-
-    /**
-     * Add a switch port to the quarantine queue. Schedule the
-     * quarantine task if the quarantine queue was empty before adding
-     * this switch port.
-     * @param npt
-     */
-    protected void addToQuarantineQueue(NodePortTuple npt) {
-        if (quarantineQueue.contains(npt) == false)
-            quarantineQueue.add(npt);
-    }
-
-    /**
-     * Remove a switch port from the quarantine queue.
-     */
-    protected void removeFromQuarantineQueue(NodePortTuple npt) {
-        // Remove all occurrences of the node port tuple from the list.
-        while (quarantineQueue.remove(npt));
-    }
-
-    /**
-     * Add a switch port to maintenance queue.
-     * @param npt
-     */
-    protected void addToMaintenanceQueue(NodePortTuple npt) {
-        // TODO We are not checking if the switch port tuple is already
-        // in the maintenance list or not.  This will be an issue for
-        // really large number of switch ports in the network.
-        if (maintenanceQueue.contains(npt) == false)
-            maintenanceQueue.add(npt);
-    }
-
-    /**
-     * Remove a switch port from maintenance queue.
-     * @param npt
-     */
-    protected void removeFromMaintenanceQueue(NodePortTuple npt) {
-        // Remove all occurrences of the node port tuple from the queue.
-        while (maintenanceQueue.remove(npt));
-    }
-
-    /**
-    * This method processes the quarantine list in bursts.  The task is
-    * at most once per BDDP_TASK_INTERVAL.
-    * One each call, BDDP_TASK_SIZE number of switch ports are processed.
-    * Once the BDDP packets are sent out through the switch ports, the ports
-    * are removed from the quarantine list.
-    */
-
-    protected void processBDDPLists() {
-        int count = 0;
-        Set<NodePortTuple> nptList = new HashSet<NodePortTuple>();
-
-        while(count < BDDP_TASK_SIZE && quarantineQueue.peek() !=null) {
-            NodePortTuple npt;
-            npt = quarantineQueue.remove();
-            sendDiscoveryMessage(npt.getNodeId(), npt.getPortId(), false, false);
-            nptList.add(npt);
-            count++;
-        }
-
-        count = 0;
-        while (count < BDDP_TASK_SIZE && maintenanceQueue.peek() != null) {
-            NodePortTuple npt;
-            npt = maintenanceQueue.remove();
-            sendDiscoveryMessage(npt.getNodeId(), npt.getPortId(), false, false);
-            count++;
-        }
-
-        for(NodePortTuple npt:nptList) {
-            generateSwitchPortStatusUpdate(npt.getNodeId(), npt.getPortId());
-        }
-    }
-
-    @Override
-    public Set<Short> getQuarantinedPorts(long sw) {
-        Set<Short> qPorts = new HashSet<Short>();
-
-        Iterator<NodePortTuple> iter = quarantineQueue.iterator();
-        while (iter.hasNext()) {
-            NodePortTuple npt = iter.next();
-            if (npt.getNodeId() == sw) {
-                qPorts.add(npt.getPortId());
-            }
-        }
-        return qPorts;
-    }
-
-    private void generateSwitchPortStatusUpdate(long sw, short port) {
-        UpdateOperation operation;
-
-        IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
-        if (iofSwitch == null) return;
-
-        OFPhysicalPort ofp = iofSwitch.getPort(port);
-        if (ofp == null) return;
-
-        int srcPortState = ofp.getState();
-        boolean portUp = ((srcPortState &
-                OFPortState.OFPPS_STP_MASK.getValue()) !=
-                OFPortState.OFPPS_STP_BLOCK.getValue());
-
-        if (portUp) operation = UpdateOperation.PORT_UP;
-        else operation = UpdateOperation.PORT_DOWN;
-
-        LinkUpdate update = new LinkUpdate(new LDUpdate(sw, port, operation));
-
-
-        controller.publishUpdate(update);
-    }
-
-    /**
-     * Send LLDP on known ports
-     */
-    protected void discoverOnKnownLinkPorts() {
-        // Copy the port set.
-        Set<NodePortTuple> nptSet = new HashSet<NodePortTuple>();
-        nptSet.addAll(portLinks.keySet());
-
-        // Send LLDP from each of them.
-        for(NodePortTuple npt: nptSet) {
-            discover(npt);
-        }
-    }
-
-    protected void discover(NodePortTuple npt) {
-        discover(npt.getNodeId(), npt.getPortId());
-    }
-
-    protected void discover(long sw, short port) {
-        sendDiscoveryMessage(sw, port, true, false);
-    }
-
-    /**
-     * Learn remote switches when running as a distributed controller ONOS
-     */
-    protected IOFSwitch addRemoteSwitch(long sw, short port) {
-    	IOnosRemoteSwitch remotesw = null;
-
-    	// add a switch if we have not seen it before
-    	remotesw = remoteSwitches.get(sw);
-
-    	if (remotesw == null) {
-        	remotesw = new OFSwitchImpl();
-        	remotesw.setupRemoteSwitch(sw);
-        	remoteSwitches.put(remotesw.getId(), remotesw);
-        	log.debug("addRemoteSwitch(): added fake remote sw {}", remotesw);
-        }
-
-        // add the port if we have not seen it before
-        if (remotesw.getPort(port) == null) {
-        	OFPhysicalPort remoteport = new OFPhysicalPort();
-        	remoteport.setPortNumber(port);
-        	remoteport.setName("fake_" + port);
-        	remoteport.setConfig(0);
-        	remoteport.setState(0);
-        	remotesw.setPort(remoteport);
-        	log.debug("addRemoteSwitch(): added fake remote port {} to sw {}", remoteport, remotesw.getId());
-        }
-
-        return remotesw;
-    }
-
-    /**
-     * Send link discovery message out of a given switch port.
-     * The discovery message may be a standard LLDP or a modified
-     * LLDP, where the dst mac address is set to :ff.
-     *
-     * TODO: The modified LLDP will updated in the future and may
-     * use a different eth-type.
-     * @param sw
-     * @param port
-     * @param isStandard   indicates standard or modified LLDP
-     * @param isReverse    indicates whether the LLDP was sent as a response
-     */
-    @LogMessageDoc(level="ERROR",
-            message="Failure sending LLDP out port {port} on switch {switch}",
-            explanation="An I/O error occured while sending LLDP message " +
-            		"to the switch.",
-            recommendation=LogMessageDoc.CHECK_SWITCH)
-    protected void sendDiscoveryMessage(long sw, short port,
-                             boolean isStandard,
-                             boolean isReverse) {
-
-        IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
-        if (iofSwitch == null) {
-            return;
-        }
-
-        if (port == OFPort.OFPP_LOCAL.getValue())
-            return;
-
-        OFPhysicalPort ofpPort = iofSwitch.getPort(port);
-
-        if (ofpPort == null) {
-            if (log.isTraceEnabled()) {
-                log.trace("Null physical port. sw={}, port={}", sw, port);
-            }
-            return;
-        }
-
-        if (isLinkDiscoverySuppressed(sw, port)) {
-            /* Dont send LLDPs out of this port as suppressLLDPs set
-             *
-             */
-            return;
-        }
-
-        // For fast ports, do not send forward LLDPs or BDDPs.
-        if (!isReverse && autoPortFastFeature && isFastPort(sw, port))
-            return;
-
-        if (log.isTraceEnabled()) {
-            log.trace("Sending LLDP packet out of swich: {}, port: {}",
-                      sw, port);
-        }
-
-        // using "nearest customer bridge" MAC address for broadest possible propagation
-        // through provider and TPMR bridges (see IEEE 802.1AB-2009 and 802.1Q-2011),
-        // in particular the Linux bridge which behaves mostly like a provider bridge
-        byte[] chassisId = new byte[] {4, 0, 0, 0, 0, 0, 0}; // filled in later
-        byte[] portId = new byte[] {2, 0, 0}; // filled in later
-        byte[] ttlValue = new byte[] {0, 0x78};
-        // OpenFlow OUI - 00-26-E1
-        byte[] dpidTLVValue = new byte[] {0x0, 0x26, (byte) 0xe1, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-        LLDPTLV dpidTLV = new LLDPTLV().setType((byte) 127).setLength((short) dpidTLVValue.length).setValue(dpidTLVValue);
-
-        byte[] dpidArray = new byte[8];
-        ByteBuffer dpidBB = ByteBuffer.wrap(dpidArray);
-        ByteBuffer portBB = ByteBuffer.wrap(portId, 1, 2);
-
-        Long dpid = sw;
-        dpidBB.putLong(dpid);
-        // set the ethernet source mac to last 6 bytes of dpid
-        System.arraycopy(dpidArray, 2, ofpPort.getHardwareAddress(), 0, 6);
-        // set the chassis id's value to last 6 bytes of dpid
-        System.arraycopy(dpidArray, 2, chassisId, 1, 6);
-        // set the optional tlv to the full dpid
-        System.arraycopy(dpidArray, 0, dpidTLVValue, 4, 8);
-
-
-        // set the portId to the outgoing port
-        portBB.putShort(port);
-        if (log.isTraceEnabled()) {
-            log.trace("Sending LLDP out of interface: {}/{}",
-                      HexString.toHexString(sw), port);
-        }
-
-        LLDP lldp = new LLDP();
-        lldp.setChassisId(new LLDPTLV().setType((byte) 1).setLength((short) chassisId.length).setValue(chassisId));
-        lldp.setPortId(new LLDPTLV().setType((byte) 2).setLength((short) portId.length).setValue(portId));
-        lldp.setTtl(new LLDPTLV().setType((byte) 3).setLength((short) ttlValue.length).setValue(ttlValue));
-        lldp.getOptionalTLVList().add(dpidTLV);
-
-        // Add the controller identifier to the TLV value.
-        lldp.getOptionalTLVList().add(controllerTLV);
-        if (isReverse) {
-            lldp.getOptionalTLVList().add(reverseTLV);
-        }else {
-            lldp.getOptionalTLVList().add(forwardTLV);
-        }
-
-        Ethernet ethernet;
-        if (isStandard) {
-            ethernet = new Ethernet()
-            .setSourceMACAddress(ofpPort.getHardwareAddress())
-            .setDestinationMACAddress(LLDP_STANDARD_DST_MAC_STRING)
-            .setEtherType(Ethernet.TYPE_LLDP);
-            ethernet.setPayload(lldp);
-        } else {
-            BSN bsn = new BSN(BSN.BSN_TYPE_BDDP);
-            bsn.setPayload(lldp);
-
-            ethernet = new Ethernet()
-            .setSourceMACAddress(ofpPort.getHardwareAddress())
-            .setDestinationMACAddress(LLDP_BSN_DST_MAC_STRING)
-            .setEtherType(Ethernet.TYPE_BSN);
-            ethernet.setPayload(bsn);
-        }
-
-
-        // serialize and wrap in a packet out
-        byte[] data = ethernet.serialize();
-        OFPacketOut po = (OFPacketOut) floodlightProvider.getOFMessageFactory().getMessage(OFType.PACKET_OUT);
-        po.setBufferId(OFPacketOut.BUFFER_ID_NONE);
-        po.setInPort(OFPort.OFPP_NONE);
-
-        // set actions
-        List<OFAction> actions = new ArrayList<OFAction>();
-        actions.add(new OFActionOutput(port, (short) 0));
-        po.setActions(actions);
-        po.setActionsLength((short) OFActionOutput.MINIMUM_LENGTH);
-
-        // set data
-        po.setLengthU(OFPacketOut.MINIMUM_LENGTH + po.getActionsLength() + data.length);
-        po.setPacketData(data);
-
-        // send
-        try {
-            iofSwitch.write(po, null);
-            iofSwitch.flush();
-        } catch (IOException e) {
-            log.error("Failure sending LLDP out port "+port+" on switch "+iofSwitch.getStringId(), e);
-        }
-
-    }
-
-    /**
-     * Send LLDPs to all switch-ports
-     */
-    protected void discoverOnAllPorts() {
-        if (log.isTraceEnabled()) {
-            log.trace("Sending LLDP packets out of all the enabled ports on switch");
-        }
-        Set<Long> switches = floodlightProvider.getSwitches().keySet();
-        // Send standard LLDPs
-        for (long sw: switches) {
-            IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
-            if (iofSwitch == null) continue;
-            if (iofSwitch.getEnabledPorts() != null) {
-                for (OFPhysicalPort ofp: iofSwitch.getEnabledPorts()) {
-                    if (isLinkDiscoverySuppressed(sw, ofp.getPortNumber()))
-                        continue;
-                    if (autoPortFastFeature && isFastPort(sw, ofp.getPortNumber()))
-                        continue;
-
-                    // sends forward LLDP only non-fastports.
-                    sendDiscoveryMessage(sw, ofp.getPortNumber(), true, false);
-
-                    // If the switch port is not alreayd in the maintenance
-                    // queue, add it.
-                    NodePortTuple npt = new NodePortTuple(sw, ofp.getPortNumber());
-                    addToMaintenanceQueue(npt);
-                }
-            }
-        }
-    }
-
-    protected void setControllerTLV() {
-        //Setting the controllerTLVValue based on current nano time,
-        //controller's IP address, and the network interface object hash
-        //the corresponding IP address.
-
-        final int prime = 7867;
-        InetAddress localIPAddress = null;
-        NetworkInterface localInterface = null;
-
-        byte[] controllerTLVValue = new byte[] {0, 0, 0, 0, 0, 0, 0, 0};  // 8 byte value.
-        ByteBuffer bb = ByteBuffer.allocate(10);
-
-        try{
-            localIPAddress = java.net.InetAddress.getLocalHost();
-            localInterface = NetworkInterface.getByInetAddress(localIPAddress);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        long result = System.nanoTime();
-        if (localIPAddress != null)
-            result = result * prime + IPv4.toIPv4Address(localIPAddress.getHostAddress());
-        if (localInterface != null)
-            result = result * prime + localInterface.hashCode();
-        // set the first 4 bits to 0.
-        result = result & (0x0fffffffffffffffL);
-
-        bb.putLong(result);
-
-        bb.rewind();
-        bb.get(controllerTLVValue, 0, 8);
-
-        this.controllerTLV = new LLDPTLV().setType((byte) 0x0c).setLength((short) controllerTLVValue.length).setValue(controllerTLVValue);
-    }
-
-    @Override
-    public String getName() {
-        return "linkdiscovery";
-    }
-
-    @Override
-    public Command receive(IOFSwitch sw, OFMessage msg, FloodlightContext cntx) {
-        switch (msg.getType()) {
-            case PACKET_IN:
-                return this.handlePacketIn(sw.getId(), (OFPacketIn) msg, cntx);
-            case PORT_STATUS:
-                return this.handlePortStatus(sw.getId(), (OFPortStatus) msg);
-            default:
-                break;
-        }
-        return Command.CONTINUE;
-    }
-
-    private Command handleLldp(LLDP lldp, long sw, OFPacketIn pi, boolean isStandard, FloodlightContext cntx) {
-        // If LLDP is suppressed on this port, ignore received packet as well
-        IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
-        if (iofSwitch == null) {
-            return Command.STOP;
-        }
-
-        if (isLinkDiscoverySuppressed(sw, pi.getInPort()))
-            return Command.STOP;
-
-        // If this is a malformed LLDP, or not from us, exit
-        if (lldp.getPortId() == null || lldp.getPortId().getLength() != 3)
-            return Command.CONTINUE;
-
-        long myId = ByteBuffer.wrap(controllerTLV.getValue()).getLong();
-        long otherId = 0;
-        boolean myLLDP = false;
-        Boolean isReverse = null;
-
-        ByteBuffer portBB = ByteBuffer.wrap(lldp.getPortId().getValue());
-        portBB.position(1);
-
-        Short remotePort = portBB.getShort();
-        IOFSwitch remoteSwitch = null;
-
-        // Verify this LLDP packet matches what we're looking for
-        for (LLDPTLV lldptlv : lldp.getOptionalTLVList()) {
-            if (lldptlv.getType() == 127 && lldptlv.getLength() == 12 &&
-                    lldptlv.getValue()[0] == 0x0 && lldptlv.getValue()[1] == 0x26 &&
-                    lldptlv.getValue()[2] == (byte)0xe1 && lldptlv.getValue()[3] == 0x0) {
-                ByteBuffer dpidBB = ByteBuffer.wrap(lldptlv.getValue());
-                remoteSwitch = floodlightProvider.getSwitches().get(dpidBB.getLong(4));
-                if (remoteSwitch == null) {
-                	// Added by ONOS
-                	// floodlight LLDP coming from a remote switch connected to a different controller
-                	// add it to our cache of unconnected remote switches
-                	remoteSwitch = addRemoteSwitch(dpidBB.getLong(4), remotePort);
-                }
-            } else if (lldptlv.getType() == 12 && lldptlv.getLength() == 8){
-                otherId = ByteBuffer.wrap(lldptlv.getValue()).getLong();
-                if (myId == otherId)
-                    myLLDP = true;
-            } else if (lldptlv.getType() == TLV_DIRECTION_TYPE &&
-                    lldptlv.getLength() == TLV_DIRECTION_LENGTH) {
-                if (lldptlv.getValue()[0] == TLV_DIRECTION_VALUE_FORWARD[0])
-                    isReverse = false;
-                else if (lldptlv.getValue()[0] == TLV_DIRECTION_VALUE_REVERSE[0])
-                    isReverse = true;
-            }
-        }
-
-        if (myLLDP == false) {
-            // This is not the LLDP sent by this controller.
-            // If the LLDP message has multicast bit set, then we need to broadcast
-            // the packet as a regular packet.
-            if (isStandard) {
-                if (log.isTraceEnabled()) {
-                    log.trace("Getting standard LLDP from a different controller and quelching it.");
-                }
-                return Command.STOP;
-            }
-            else if(sw <= remoteSwitch.getId()){
-                if (log.isTraceEnabled()) {
-                    log.trace("Getting BBDP from a different controller. myId {}: remoteId {}", myId, otherId);
-                    log.trace("and my controller id is smaller than the other, so quelching it. myPort {}: rPort {}", pi.getInPort(), remotePort);
-                  }
-                  //XXX ONOS: Fix the BDDP broadcast issue
-                  //return Command.CONTINUE;
-                  return Command.STOP;
-            }
-            /*
-            else if (myId < otherId)  {
-                if (log.isTraceEnabled()) {
-                    log.trace("Getting BDDP packets from a different controller" +
-                            "and letting it go through normal processing chain.");
-                }
-                //XXX ONOS: Fix the BDDP broadcast issue
-                //return Command.CONTINUE;
-                return Command.STOP;
-            }
-            */
-        }
-
-
-        if (remoteSwitch == null) {
-            // Ignore LLDPs not generated by Floodlight, or from a switch that has recently
-            // disconnected, or from a switch connected to another Floodlight instance
-            if (log.isTraceEnabled()) {
-                log.trace("Received LLDP from remote switch not connected to the controller");
-            }
-            return Command.STOP;
-        }
-
-        if (!remoteSwitch.portEnabled(remotePort)) {
-            if (log.isTraceEnabled()) {
-                log.trace("Ignoring link with disabled source port: switch {} port {}", remoteSwitch, remotePort);
-            }
-            return Command.STOP;
-        }
-        if (suppressLinkDiscovery.contains(new NodePortTuple(remoteSwitch.getId(),
-                                                     remotePort))) {
-            if (log.isTraceEnabled()) {
-                log.trace("Ignoring link with suppressed src port: switch {} port {}",
-                      remoteSwitch, remotePort);
-            }
-            return Command.STOP;
-        }
-        if (!iofSwitch.portEnabled(pi.getInPort())) {
-            if (log.isTraceEnabled()) {
-                log.trace("Ignoring link with disabled dest port: switch {} port {}", sw, pi.getInPort());
-            }
-            return Command.STOP;
-        }
-
-        OFPhysicalPort physicalPort = remoteSwitch.getPort(remotePort);
-        int srcPortState = (physicalPort != null) ? physicalPort.getState() : 0;
-        physicalPort = iofSwitch.getPort(pi.getInPort());
-        int dstPortState = (physicalPort != null) ? physicalPort.getState() : 0;
-
-        // Store the time of update to this link, and push it out to routingEngine
-        Link lt = new Link(remoteSwitch.getId(), remotePort, iofSwitch.getId(), pi.getInPort());
-
-
-        Long lastLldpTime = null;
-        Long lastBddpTime = null;
-
-        Long firstSeenTime = System.currentTimeMillis();
-
-        if (isStandard)
-            lastLldpTime = System.currentTimeMillis();
-        else
-            lastBddpTime = System.currentTimeMillis();
-
-        LinkInfo newLinkInfo =
-                new LinkInfo(firstSeenTime, lastLldpTime, lastBddpTime,
-                             srcPortState, dstPortState);
-
-        addOrUpdateLink(lt, newLinkInfo);
-
-        // Check if reverse link exists.
-        // If it doesn't exist and if the forward link was seen
-        // first seen within a small interval, send probe on the
-        // reverse link.
-
-        newLinkInfo = links.get(lt);
-        if (newLinkInfo != null && isStandard && isReverse == false) {
-            Link reverseLink = new Link(lt.getDst(), lt.getDstPort(),
-                                        lt.getSrc(), lt.getSrcPort());
-            LinkInfo reverseInfo = links.get(reverseLink);
-            if (reverseInfo == null) {
-                // the reverse link does not exist.
-                if (newLinkInfo.getFirstSeenTime() > System.currentTimeMillis() - LINK_TIMEOUT) {
-                    this.sendDiscoveryMessage(lt.getDst(), lt.getDstPort(), isStandard, true);
-                }
-            }
-        }
-
-        // If the received packet is a BDDP packet, then create a reverse BDDP
-        // link as well.
-        if (!isStandard) {
-            Link reverseLink = new Link(lt.getDst(), lt.getDstPort(),
-                                        lt.getSrc(), lt.getSrcPort());
-
-            // srcPortState and dstPort state are reversed.
-            LinkInfo reverseInfo =
-                    new LinkInfo(firstSeenTime, lastLldpTime, lastBddpTime,
-                                 dstPortState, srcPortState);
-
-            addOrUpdateLink(reverseLink, reverseInfo);
-        }
-
-        // Remove the node ports from the quarantine and maintenance queues.
-        NodePortTuple nptSrc = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-        NodePortTuple nptDst = new NodePortTuple(lt.getDst(), lt.getDstPort());
-        removeFromQuarantineQueue(nptSrc);
-        removeFromMaintenanceQueue(nptSrc);
-        removeFromQuarantineQueue(nptDst);
-        removeFromMaintenanceQueue(nptDst);
-
-        // Consume this message
-        return Command.STOP;
-    }
-
-    protected Command handlePacketIn(long sw, OFPacketIn pi,
-                                     FloodlightContext cntx) {
-        Ethernet eth =
-                IFloodlightProviderService.bcStore.get(cntx,
-                                                       IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
-
-        if(eth.getEtherType() == Ethernet.TYPE_BSN) {
-            BSN bsn = (BSN) eth.getPayload();
-            if (bsn == null) return Command.STOP;
-            if (bsn.getPayload() == null) return Command.STOP;
-            // It could be a packet other than BSN LLDP, therefore
-            // continue with the regular processing.
-            if (bsn.getPayload() instanceof LLDP == false)
-                return Command.CONTINUE;
-            return handleLldp((LLDP) bsn.getPayload(), sw, pi, false, cntx);
-        } else if (eth.getEtherType() == Ethernet.TYPE_LLDP)  {
-            return handleLldp((LLDP) eth.getPayload(), sw, pi, true, cntx);
-        } else if (eth.getEtherType() < 1500) {
-            long destMac = eth.getDestinationMAC().toLong();
-            if ((destMac & LINK_LOCAL_MASK) == LINK_LOCAL_VALUE){
-                if (log.isTraceEnabled()) {
-                    log.trace("Ignoring packet addressed to 802.1D/Q " +
-                            "reserved address.");
-                }
-                return Command.STOP;
-            }
-        }
-
-        // If packet-in is from a quarantine port, stop processing.
-        NodePortTuple npt = new NodePortTuple(sw, pi.getInPort());
-        if (quarantineQueue.contains(npt)) return Command.STOP;
-
-        return Command.CONTINUE;
-    }
-
-    protected UpdateOperation getUpdateOperation(int srcPortState,
-                                                 int dstPortState) {
-        boolean added =
-                (((srcPortState &
-                   OFPortState.OFPPS_STP_MASK.getValue()) !=
-                   OFPortState.OFPPS_STP_BLOCK.getValue()) &&
-                ((dstPortState &
-                  OFPortState.OFPPS_STP_MASK.getValue()) !=
-                  OFPortState.OFPPS_STP_BLOCK.getValue()));
-
-        if (added) return UpdateOperation.LINK_UPDATED;
-        return UpdateOperation.LINK_REMOVED;
-    }
-
-
-
-    protected UpdateOperation getUpdateOperation(int srcPortState) {
-        boolean portUp = ((srcPortState &
-                OFPortState.OFPPS_STP_MASK.getValue()) !=
-                OFPortState.OFPPS_STP_BLOCK.getValue());
-
-        if (portUp) return UpdateOperation.PORT_UP;
-        else return UpdateOperation.PORT_DOWN;
-    }
-
-    protected boolean addOrUpdateLink(Link lt, LinkInfo newInfo) {
-
-        NodePortTuple srcNpt, dstNpt;
-        boolean linkChanged = false;
-
-        lock.writeLock().lock();
-        try {
-            // put the new info.  if an old info exists, it will be returned.
-            LinkInfo oldInfo = links.put(lt, newInfo);
-            if (oldInfo != null &&
-                    oldInfo.getFirstSeenTime() < newInfo.getFirstSeenTime())
-                newInfo.setFirstSeenTime(oldInfo.getFirstSeenTime());
-
-            if (log.isTraceEnabled()) {
-                log.trace("addOrUpdateLink: {} {}",
-                          lt,
-                          (newInfo.getMulticastValidTime()!=null) ? "multicast" : "unicast");
-            }
-
-            UpdateOperation updateOperation = null;
-            linkChanged = false;
-
-            srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-            dstNpt = new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-            if (oldInfo == null) {
-                // index it by switch source
-                if (!switchLinks.containsKey(lt.getSrc()))
-                    switchLinks.put(lt.getSrc(), new HashSet<Link>());
-                switchLinks.get(lt.getSrc()).add(lt);
-
-                // index it by switch dest
-                if (!switchLinks.containsKey(lt.getDst()))
-                    switchLinks.put(lt.getDst(), new HashSet<Link>());
-                switchLinks.get(lt.getDst()).add(lt);
-
-                // index both ends by switch:port
-                if (!portLinks.containsKey(srcNpt))
-                    portLinks.put(srcNpt, new HashSet<Link>());
-                portLinks.get(srcNpt).add(lt);
-
-                if (!portLinks.containsKey(dstNpt))
-                    portLinks.put(dstNpt, new HashSet<Link>());
-                portLinks.get(dstNpt).add(lt);
-
-                // Add to portNOFLinks if the unicast valid time is null
-                if (newInfo.getUnicastValidTime() == null)
-                    addLinkToBroadcastDomain(lt);
-
-                // ONOS: Distinguish added event separately from updated event
-                updateOperation = UpdateOperation.LINK_ADDED;
-                linkChanged = true;
-
-                // Add to event history
-                evHistTopoLink(lt.getSrc(),
-                               lt.getDst(),
-                               lt.getSrcPort(),
-                               lt.getDstPort(),
-                               newInfo.getSrcPortState(), newInfo.getDstPortState(),
-                               getLinkType(lt, newInfo),
-                               EvAction.LINK_ADDED, "LLDP Recvd");
-            } else {
-                // Since the link info is already there, we need to
-                // update the right fields.
-                if (newInfo.getUnicastValidTime() == null) {
-                    // This is due to a multicast LLDP, so copy the old unicast
-                    // value.
-                    if (oldInfo.getUnicastValidTime() != null) {
-                        newInfo.setUnicastValidTime(oldInfo.getUnicastValidTime());
-                    }
-                } else if (newInfo.getMulticastValidTime() == null) {
-                    // This is due to a unicast LLDP, so copy the old multicast
-                    // value.
-                    if (oldInfo.getMulticastValidTime() != null) {
-                        newInfo.setMulticastValidTime(oldInfo.getMulticastValidTime());
-                    }
-                }
-
-                Long oldTime = oldInfo.getUnicastValidTime();
-                Long newTime = newInfo.getUnicastValidTime();
-                // the link has changed its state between openflow and non-openflow
-                // if the unicastValidTimes are null or not null
-                if (oldTime != null & newTime == null) {
-                    // openflow -> non-openflow transition
-                    // we need to add the link tuple to the portNOFLinks
-                    addLinkToBroadcastDomain(lt);
-                    linkChanged = true;
-                } else if (oldTime == null & newTime != null) {
-                    // non-openflow -> openflow transition
-                    // we need to remove the link from the portNOFLinks
-                    removeLinkFromBroadcastDomain(lt);
-                    linkChanged = true;
-                }
-
-                // Only update the port states if they've changed
-                if (newInfo.getSrcPortState().intValue() !=
-                        oldInfo.getSrcPortState().intValue() ||
-                        newInfo.getDstPortState().intValue() !=
-                        oldInfo.getDstPortState().intValue())
-                    linkChanged = true;
-
-                if (linkChanged) {
-                    updateOperation = getUpdateOperation(newInfo.getSrcPortState(),
-                                                         newInfo.getDstPortState());
-                    if (log.isTraceEnabled()) {
-                        log.trace("Updated link {}", lt);
-                    }
-                    // Add to event history
-                    evHistTopoLink(lt.getSrc(),
-                                   lt.getDst(),
-                                   lt.getSrcPort(),
-                                   lt.getDstPort(),
-                                   newInfo.getSrcPortState(), newInfo.getDstPortState(),
-                                   getLinkType(lt, newInfo),
-                                   EvAction.LINK_PORT_STATE_UPDATED,
-                                   "LLDP Recvd");
-                }
-            }
-
-            if (linkChanged) {
-                // find out if the link was added or removed here.
-                LinkUpdate update = new LinkUpdate(new LDUpdate(lt.getSrc(), lt.getSrcPort(),
-                                         lt.getDst(), lt.getDstPort(),
-                                         getLinkType(lt, newInfo),
-                                         updateOperation));
-                controller.publishUpdate(update);
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-
-        return linkChanged;
-    }
-
-    @Override
-    public Map<Long, Set<Link>> getSwitchLinks() {
-        return this.switchLinks;
-    }
-
-    /**
-     * Removes links from memory and storage.
-     * @param links The List of @LinkTuple to delete.
-     */
-    protected void deleteLinks(List<Link> links, String reason) {
-        NodePortTuple srcNpt, dstNpt;
-
-        lock.writeLock().lock();
-        try {
-            for (Link lt : links) {
-                srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-                dstNpt  =new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-                switchLinks.get(lt.getSrc()).remove(lt);
-                switchLinks.get(lt.getDst()).remove(lt);
-                if (switchLinks.containsKey(lt.getSrc()) &&
-                        switchLinks.get(lt.getSrc()).isEmpty())
-                    this.switchLinks.remove(lt.getSrc());
-                if (this.switchLinks.containsKey(lt.getDst()) &&
-                        this.switchLinks.get(lt.getDst()).isEmpty())
-                    this.switchLinks.remove(lt.getDst());
-
-                if (this.portLinks.get(srcNpt) != null) {
-                    this.portLinks.get(srcNpt).remove(lt);
-                    if (this.portLinks.get(srcNpt).isEmpty())
-                        this.portLinks.remove(srcNpt);
-                }
-                if (this.portLinks.get(dstNpt) != null) {
-                    this.portLinks.get(dstNpt).remove(lt);
-                    if (this.portLinks.get(dstNpt).isEmpty())
-                        this.portLinks.remove(dstNpt);
-                }
-
-                LinkInfo info = this.links.remove(lt);
-                LinkUpdate update = new LinkUpdate(new LDUpdate(lt.getSrc(), lt.getSrcPort(),
-                                         lt.getDst(), lt.getDstPort(),
-                                         getLinkType(lt, info),
-                                         UpdateOperation.LINK_REMOVED));
-                controller.publishUpdate(update);
-
-                // Update Event History
-                evHistTopoLink(lt.getSrc(),
-                               lt.getDst(),
-                               lt.getSrcPort(),
-                               lt.getDstPort(),
-                               0, 0, // Port states
-                               ILinkDiscovery.LinkType.INVALID_LINK,
-                               EvAction.LINK_DELETED, reason);
-
-                // TODO  Whenever link is removed, it has to checked if
-                // the switchports must be added to quarantine.
-
-                if (log.isTraceEnabled()) {
-                    log.trace("Deleted link {}", lt);
-                }
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-    /**
-     * Handles an OFPortStatus message from a switch. We will add or
-     * delete LinkTupes as well re-compute the topology if needed.
-     * @param sw The IOFSwitch that sent the port status message
-     * @param ps The OFPortStatus message
-     * @return The Command to continue or stop after we process this message
-     */
-    protected Command handlePortStatus(long sw, OFPortStatus ps) {
-
-        IOFSwitch iofSwitch = floodlightProvider.getSwitches().get(sw);
-        if (iofSwitch == null) return Command.CONTINUE;
-
-        // ONOS: If we do not control this switch, then we should not process its port status messages
-        if (!registryService.hasControl(iofSwitch.getId())) return Command.CONTINUE;
-
-        if (log.isTraceEnabled()) {
-            log.trace("handlePortStatus: Switch {} port #{} reason {}; " +
-                    "config is {} state is {}",
-                    new Object[] {iofSwitch.getStringId(),
-                                  ps.getDesc().getPortNumber(),
-                                  ps.getReason(),
-                                  ps.getDesc().getConfig(),
-                                  ps.getDesc().getState()});
-        }
-
-        short port = ps.getDesc().getPortNumber();
-        NodePortTuple npt = new NodePortTuple(sw, port);
-        boolean linkDeleted  = false;
-        boolean linkInfoChanged = false;
-
-        lock.writeLock().lock();
-        try {
-            // if ps is a delete, or a modify where the port is down or
-            // configured down
-            if ((byte)OFPortReason.OFPPR_DELETE.ordinal() == ps.getReason() ||
-                    ((byte)OFPortReason.OFPPR_MODIFY.ordinal() ==
-                    ps.getReason() && !portEnabled(ps.getDesc()))) {
-                deleteLinksOnPort(npt, "Port Status Changed");
-                LinkUpdate update = new LinkUpdate(new LDUpdate(sw, port, UpdateOperation.PORT_DOWN));
-                controller.publishUpdate(update);
-                linkDeleted = true;
-                }
-            else if (ps.getReason() ==
-                    (byte)OFPortReason.OFPPR_MODIFY.ordinal()) {
-                // If ps is a port modification and the port state has changed
-                // that affects links in the topology
-
-                if (this.portLinks.containsKey(npt)) {
-                    for (Link lt: this.portLinks.get(npt)) {
-                        LinkInfo linkInfo = links.get(lt);
-                        assert(linkInfo != null);
-                        Integer updatedSrcPortState = null;
-                        Integer updatedDstPortState = null;
-                        if (lt.getSrc() == npt.getNodeId() &&
-                                lt.getSrcPort() == npt.getPortId() &&
-                                (linkInfo.getSrcPortState() !=
-                                ps.getDesc().getState())) {
-                            updatedSrcPortState = ps.getDesc().getState();
-                            linkInfo.setSrcPortState(updatedSrcPortState);
-                        }
-                        if (lt.getDst() == npt.getNodeId() &&
-                                lt.getDstPort() == npt.getPortId() &&
-                                (linkInfo.getDstPortState() !=
-                                ps.getDesc().getState())) {
-                            updatedDstPortState = ps.getDesc().getState();
-                            linkInfo.setDstPortState(updatedDstPortState);
-                        }
-                        if ((updatedSrcPortState != null) ||
-                                (updatedDstPortState != null)) {
-                            // The link is already known to link discovery
-                            // manager and the status has changed, therefore
-                            // send an LinkUpdate.
-                            UpdateOperation operation =
-                                    getUpdateOperation(linkInfo.getSrcPortState(),
-                                                       linkInfo.getDstPortState());
-                            LinkUpdate update = new LinkUpdate(new LDUpdate(lt.getSrc(), lt.getSrcPort(),
-                                                     lt.getDst(), lt.getDstPort(),
-                                                     getLinkType(lt, linkInfo),
-                                                     operation));
-                            controller.publishUpdate(update);
-
-                            linkInfoChanged = true;
-                        }
-                    }
-                }
-
-                UpdateOperation operation =
-                        getUpdateOperation(ps.getDesc().getState());
-                LinkUpdate update = new LinkUpdate(new LDUpdate(sw, port, operation));
-                controller.publishUpdate(update);
-            }
-
-            if (!linkDeleted && !linkInfoChanged){
-                if (log.isTraceEnabled()) {
-                    log.trace("handlePortStatus: Switch {} port #{} reason {};"+
-                            " no links to update/remove",
-                            new Object[] {HexString.toHexString(sw),
-                                          ps.getDesc().getPortNumber(),
-                                          ps.getReason()});
-                }
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-
-        if (!linkDeleted) {
-            // Send LLDP right away when port state is changed for faster
-            // cluster-merge. If it is a link delete then there is not need
-            // to send the LLDPs right away and instead we wait for the LLDPs
-            // to be sent on the timer as it is normally done
-            // do it outside the write-lock
-            // sendLLDPTask.reschedule(1000, TimeUnit.MILLISECONDS);
-            processNewPort(npt.getNodeId(), npt.getPortId());
-        }
-        return Command.CONTINUE;
-    }
-
-    /**
-     * Process a new port.
-     * If link discovery is disabled on the port, then do nothing.
-     * If autoportfast feature is enabled and the port is a fast port, then
-     * do nothing.
-     * Otherwise, send LLDP message.  Add the port to quarantine.
-     * @param sw
-     * @param p
-     */
-    private void processNewPort(long sw, short p) {
-        if (isLinkDiscoverySuppressed(sw, p)) {
-            // Do nothing as link discovery is suppressed.
-        }
-        else if (autoPortFastFeature && isFastPort(sw, p)) {
-            // Do nothing as the port is a fast port.
-        }
-        else {
-            NodePortTuple npt = new NodePortTuple(sw, p);
-            discover(sw, p);
-            // if it is not a fast port, add it to quarantine.
-            if (!isFastPort(sw, p)) {
-                addToQuarantineQueue(npt);
-            } else {
-                // Add to maintenance queue to ensure that BDDP packets
-                // are sent out.
-                addToMaintenanceQueue(npt);
-            }
-        }
-    }
-
-    /**
-     * We send out LLDP messages when a switch is added to discover the topology
-     * @param sw The IOFSwitch that connected to the controller
-     */
-    @Override
-    public void addedSwitch(IOFSwitch sw) {
-
-        if (sw.getEnabledPorts() != null) {
-            for (Short p : sw.getEnabledPortNumbers()) {
-                processNewPort(sw.getId(), p);
-            }
-        }
-        // Update event history
-        evHistTopoSwitch(sw, EvAction.SWITCH_CONNECTED, "None");
-        LinkUpdate update = new LinkUpdate(new LDUpdate(sw.getId(), null,
-                                       UpdateOperation.SWITCH_UPDATED));
-        controller.publishUpdate(update);
-    }
-
-    /**
-     * When a switch disconnects we remove any links from our map and notify.
-     */
-    @Override
-    public void removedSwitch(IOFSwitch iofSwitch) {
-        // Update event history
-        long sw = iofSwitch.getId();
-        evHistTopoSwitch(iofSwitch, EvAction.SWITCH_DISCONNECTED, "None");
-        List<Link> eraseList = new ArrayList<Link>();
-        lock.writeLock().lock();
-        try {
-            if (switchLinks.containsKey(sw)) {
-                if (log.isTraceEnabled()) {
-                    log.trace("Handle switchRemoved. Switch {}; removing links {}",
-                              HexString.toHexString(sw), switchLinks.get(sw));
-                }
-                // add all tuples with an endpoint on this switch to erase list
-                eraseList.addAll(switchLinks.get(sw));
-                deleteLinks(eraseList, "Switch Removed");
-
-                // Send a switch removed update
-                LinkUpdate update = new LinkUpdate(new LDUpdate(sw, null, UpdateOperation.SWITCH_REMOVED));
-                controller.publishUpdate(update);
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-    /**
-     * We don't react the port changed notifications here. we listen for
-     * OFPortStatus messages directly. Might consider using this notifier
-     * instead
-     */
-    @Override
-    public void switchPortChanged(Long switchId) {
-        // no-op
-    }
-
-    /**
-     * Delete links incident on a given switch port.
-     * @param npt
-     * @param reason
-     */
-    protected void deleteLinksOnPort(NodePortTuple npt, String reason) {
-        List<Link> eraseList = new ArrayList<Link>();
-        if (this.portLinks.containsKey(npt)) {
-            if (log.isTraceEnabled()) {
-                log.trace("handlePortStatus: Switch {} port #{} " +
-                        "removing links {}",
-                        new Object[] {HexString.toHexString(npt.getNodeId()),
-                                      npt.getPortId(),
-                                      this.portLinks.get(npt)});
-            }
-            eraseList.addAll(this.portLinks.get(npt));
-            deleteLinks(eraseList, reason);
-        }
-    }
-
-    /**
-     * Iterates through the list of links and deletes if the
-     * last discovery message reception time exceeds timeout values.
-     */
-    protected void timeoutLinks() {
-        List<Link> eraseList = new ArrayList<Link>();
-        Long curTime = System.currentTimeMillis();
-        boolean linkChanged = false;
-
-        // reentrant required here because deleteLink also write locks
-        lock.writeLock().lock();
-        try {
-            Iterator<Entry<Link, LinkInfo>> it =
-                    this.links.entrySet().iterator();
-            while (it.hasNext()) {
-                Entry<Link, LinkInfo> entry = it.next();
-                Link lt = entry.getKey();
-                LinkInfo info = entry.getValue();
-
-                // Timeout the unicast and multicast LLDP valid times
-                // independently.
-                if ((info.getUnicastValidTime() != null) &&
-                        (info.getUnicastValidTime() + (this.LINK_TIMEOUT * 1000) < curTime)){
-                    info.setUnicastValidTime(null);
-
-                    if (info.getMulticastValidTime() != null)
-                        addLinkToBroadcastDomain(lt);
-                    // Note that even if mTime becomes null later on,
-                    // the link would be deleted, which would trigger updateClusters().
-                    linkChanged = true;
-                }
-                if ((info.getMulticastValidTime()!= null) &&
-                        (info.getMulticastValidTime()+ (this.LINK_TIMEOUT * 1000) < curTime)) {
-                    info.setMulticastValidTime(null);
-                    // if uTime is not null, then link will remain as openflow
-                    // link. If uTime is null, it will be deleted.  So, we
-                    // don't care about linkChanged flag here.
-                    removeLinkFromBroadcastDomain(lt);
-                    linkChanged = true;
-                }
-                // Add to the erase list only if the unicast
-                // time is null.
-                if (info.getUnicastValidTime() == null &&
-                        info.getMulticastValidTime() == null){
-                    eraseList.add(entry.getKey());
-                } else if (linkChanged) {
-                    UpdateOperation operation;
-                    operation = getUpdateOperation(info.getSrcPortState(),
-                                                   info.getDstPortState());
-                    LinkUpdate update = new LinkUpdate(new LDUpdate(lt.getSrc(), lt.getSrcPort(),
-                                             lt.getDst(), lt.getDstPort(),
-                                             getLinkType(lt, info),
-                                             operation));
-                    controller.publishUpdate(update);
-                }
-            }
-
-            // if any link was deleted or any link was changed.
-            if ((eraseList.size() > 0) || linkChanged) {
-                deleteLinks(eraseList, "LLDP timeout");
-            }
-        } finally {
-            lock.writeLock().unlock();
-        }
-    }
-
-    private boolean portEnabled(OFPhysicalPort port) {
-        if (port == null)
-            return false;
-        if ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0)
-            return false;
-        if ((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0)
-            return false;
-        // Port STP state doesn't work with multiple VLANs, so ignore it for now
-        // if ((port.getState() & OFPortState.OFPPS_STP_MASK.getValue()) == OFPortState.OFPPS_STP_BLOCK.getValue())
-        //    return false;
-        return true;
-    }
-
-    public Map<NodePortTuple, Set<Link>> getPortBroadcastDomainLinks() {
-        return portBroadcastDomainLinks;
-    }
-
-    @Override
-    public Map<Link, LinkInfo> getLinks() {
-        lock.readLock().lock();
-        Map<Link, LinkInfo> result;
-        try {
-            result = new HashMap<Link, LinkInfo>(links);
-        } finally {
-            lock.readLock().unlock();
-        }
-        return result;
-    }
-
-    protected void addLinkToBroadcastDomain(Link lt) {
-
-        NodePortTuple srcNpt, dstNpt;
-        srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-        dstNpt = new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-        if (!portBroadcastDomainLinks.containsKey(srcNpt))
-            portBroadcastDomainLinks.put(srcNpt, new HashSet<Link>());
-        portBroadcastDomainLinks.get(srcNpt).add(lt);
-
-        if (!portBroadcastDomainLinks.containsKey(dstNpt))
-            portBroadcastDomainLinks.put(dstNpt, new HashSet<Link>());
-        portBroadcastDomainLinks.get(dstNpt).add(lt);
-    }
-
-    protected void removeLinkFromBroadcastDomain(Link lt) {
-
-        NodePortTuple srcNpt, dstNpt;
-        srcNpt = new NodePortTuple(lt.getSrc(), lt.getSrcPort());
-        dstNpt = new NodePortTuple(lt.getDst(), lt.getDstPort());
-
-        if (portBroadcastDomainLinks.containsKey(srcNpt)) {
-            portBroadcastDomainLinks.get(srcNpt).remove(lt);
-            if (portBroadcastDomainLinks.get(srcNpt).isEmpty())
-                portBroadcastDomainLinks.remove(srcNpt);
-        }
-
-        if (portBroadcastDomainLinks.containsKey(dstNpt)) {
-            portBroadcastDomainLinks.get(dstNpt).remove(lt);
-            if (portBroadcastDomainLinks.get(dstNpt).isEmpty())
-                portBroadcastDomainLinks.remove(dstNpt);
-        }
-    }
-
-    @Override
-    public void addListener(ILinkDiscoveryListener listener) {
-        linkDiscoveryAware.add(listener);
-    }
-
-    /**
-     * Register a link discovery aware component
-     * @param linkDiscoveryAwareComponent
-     */
-    public void addLinkDiscoveryAware(ILinkDiscoveryListener linkDiscoveryAwareComponent) {
-        // TODO make this a copy on write set or lock it somehow
-        this.linkDiscoveryAware.add(linkDiscoveryAwareComponent);
-    }
-
-    /**
-     * Deregister a link discovery aware component
-     * @param linkDiscoveryAwareComponent
-     */
-    public void removeLinkDiscoveryAware(ILinkDiscoveryListener linkDiscoveryAwareComponent) {
-        // TODO make this a copy on write set or lock it somehow
-        this.linkDiscoveryAware.remove(linkDiscoveryAwareComponent);
-    }
-
-    @Override
-    public boolean isCallbackOrderingPrereq(OFType type, String name) {
-        return false;
-    }
-
-    @Override
-    public boolean isCallbackOrderingPostreq(OFType type, String name) {
-        return false;
-    }
-
-    // IFloodlightModule classes
-
-    @Override
-    public Collection<Class<? extends IFloodlightService>> getModuleServices() {
-        Collection<Class<? extends IFloodlightService>> l =
-                new ArrayList<Class<? extends IFloodlightService>>();
-        l.add(ILinkDiscoveryService.class);
-        //l.add(ITopologyService.class);
-        return l;
-    }
-
-    @Override
-    public Map<Class<? extends IFloodlightService>, IFloodlightService>
-    getServiceImpls() {
-        Map<Class<? extends IFloodlightService>,
-        IFloodlightService> m =
-        new HashMap<Class<? extends IFloodlightService>,
-        IFloodlightService>();
-        // We are the class that implements the service
-        m.put(ILinkDiscoveryService.class, this);
-        return m;
-    }
-
-    @Override
-    public Collection<Class<? extends IFloodlightService>> getModuleDependencies() {
-        Collection<Class<? extends IFloodlightService>> l =
-                new ArrayList<Class<? extends IFloodlightService>>();
-        l.add(IFloodlightProviderService.class);
-        l.add(IThreadPoolService.class);
-        l.add(IRestApiService.class);
-        // Added by ONOS
-        l.add(IControllerRegistryService.class);
-        return l;
-    }
-
-    @Override
-    public void init(FloodlightModuleContext context)
-            throws FloodlightModuleException {
-        floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
-        threadPool = context.getServiceImpl(IThreadPoolService.class);
-        restApi = context.getServiceImpl(IRestApiService.class);
-        // Added by ONOS
-        registryService = context.getServiceImpl(IControllerRegistryService.class);
-
-        // Set the autoportfast feature to false.
-        this.autoPortFastFeature = false;
-
-        // We create this here because there is no ordering guarantee
-        this.linkDiscoveryAware = new ArrayList<ILinkDiscoveryListener>();
-        this.lock = new ReentrantReadWriteLock();
-        this.links = new HashMap<Link, LinkInfo>();
-        this.portLinks = new HashMap<NodePortTuple, Set<Link>>();
-        this.suppressLinkDiscovery =
-                Collections.synchronizedSet(new HashSet<NodePortTuple>());
-        this.portBroadcastDomainLinks = new HashMap<NodePortTuple, Set<Link>>();
-        this.switchLinks = new HashMap<Long, Set<Link>>();
-        this.quarantineQueue = new LinkedBlockingQueue<NodePortTuple>();
-        this.maintenanceQueue = new LinkedBlockingQueue<NodePortTuple>();
-        // Added by ONOS
-        this.remoteSwitches = new HashMap<Long, IOnosRemoteSwitch>();
-
-        this.evHistTopologySwitch =
-                new EventHistory<EventHistoryTopologySwitch>("Topology: Switch");
-        this.evHistTopologyLink =
-                new EventHistory<EventHistoryTopologyLink>("Topology: Link");
-        this.evHistTopologyCluster =
-                new EventHistory<EventHistoryTopologyCluster>("Topology: Cluster");
-    }
-
-    @Override
-    @LogMessageDocs({
-        @LogMessageDoc(level="ERROR",
-                message="No storage source found.",
-                explanation="Storage source was not initialized; cannot initialize " +
-                "link discovery.",
-                recommendation=LogMessageDoc.REPORT_CONTROLLER_BUG),
-        @LogMessageDoc(level="ERROR",
-                message="Error in installing listener for " +
-                        "switch config table {table}",
-                explanation="Failed to install storage notification for the " +
-                		"switch config table",
-                recommendation=LogMessageDoc.REPORT_CONTROLLER_BUG),
-        @LogMessageDoc(level="ERROR",
-                message="No storage source found.",
-                explanation="Storage source was not initialized; cannot initialize " +
-                "link discovery.",
-                recommendation=LogMessageDoc.REPORT_CONTROLLER_BUG),
-        @LogMessageDoc(level="ERROR",
-                message="Exception in LLDP send timer.",
-                explanation="An unknown error occured while sending LLDP " +
-                		"messages to switches.",
-                recommendation=LogMessageDoc.CHECK_SWITCH)
-    })
-    public void startUp(FloodlightModuleContext context) {
-        ScheduledExecutorService ses = threadPool.getScheduledExecutor();
-        controller =
-                context.getServiceImpl(IFloodlightProviderService.class);
-
-        // To be started by the first switch connection
-        discoveryTask = new SingletonTask(ses, new Runnable() {
-            @Override
-            public void run() {
-                try {
-                    discoverLinks();
-                } catch (Exception e) {
-                    log.error("Exception in LLDP send timer.", e);
-                } finally {
-                    if (!shuttingDown) {
-                    	// Always reschedule link discovery if we're not
-                    	// shutting down (no chance of SLAVE role now)
-                        log.trace("Rescheduling discovery task");
-                        discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL,
-                        					TimeUnit.SECONDS);
-                    }
-                }
-            }
-        });
-
-        // Always reschedule link discovery as we are never in SLAVE role now
-        discoveryTask.reschedule(DISCOVERY_TASK_INTERVAL, TimeUnit.SECONDS);
-
-        // Setup the BDDP task.  It is invoked whenever switch port tuples
-        // are added to the quarantine list.
-        bddpTask = new SingletonTask(ses, new QuarantineWorker());
-        bddpTask.reschedule(BDDP_TASK_INTERVAL, TimeUnit.MILLISECONDS);
-
-
-        // Register for the OpenFlow messages we want to receive
-        floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
-        floodlightProvider.addOFMessageListener(OFType.PORT_STATUS, this);
-        // Register for switch updates
-        floodlightProvider.addOFSwitchListener(this);
-        if (restApi != null)
-            restApi.addRestletRoutable(new LinkDiscoveryWebRoutable());
-        setControllerTLV();
-    }
-
-    // ****************************************************
-    // Topology Manager's Event History members and methods
-    // ****************************************************
-
-    // Topology Manager event history
-    public EventHistory<EventHistoryTopologySwitch>  evHistTopologySwitch;
-    public EventHistory<EventHistoryTopologyLink>    evHistTopologyLink;
-    public EventHistory<EventHistoryTopologyCluster> evHistTopologyCluster;
-    public EventHistoryTopologySwitch  evTopoSwitch;
-    public EventHistoryTopologyLink    evTopoLink;
-    public EventHistoryTopologyCluster evTopoCluster;
-
-    // Switch Added/Deleted
-    private void evHistTopoSwitch(IOFSwitch sw, EvAction actn, String reason) {
-        if (evTopoSwitch == null) {
-            evTopoSwitch = new EventHistoryTopologySwitch();
-        }
-        evTopoSwitch.dpid     = sw.getId();
-        if ((sw.getChannel() != null) &&
-                (SocketAddress.class.isInstance(
-                                                sw.getChannel().getRemoteAddress()))) {
-            evTopoSwitch.ipv4Addr =
-                    IPv4.toIPv4Address(((InetSocketAddress)(sw.getChannel().
-                            getRemoteAddress())).getAddress().getAddress());
-            evTopoSwitch.l4Port   =
-                    ((InetSocketAddress)(sw.getChannel().
-                            getRemoteAddress())).getPort();
-        } else {
-            evTopoSwitch.ipv4Addr = 0;
-            evTopoSwitch.l4Port = 0;
-        }
-        evTopoSwitch.reason   = reason;
-        evTopoSwitch = evHistTopologySwitch.put(evTopoSwitch, actn);
-    }
-
-    private void evHistTopoLink(long srcDpid, long dstDpid, short srcPort,
-                                short dstPort, int srcPortState, int dstPortState,
-                                ILinkDiscovery.LinkType linkType,
-                                EvAction actn, String reason) {
-        if (evTopoLink == null) {
-            evTopoLink = new EventHistoryTopologyLink();
-        }
-        evTopoLink.srcSwDpid = srcDpid;
-        evTopoLink.dstSwDpid = dstDpid;
-        evTopoLink.srcSwport = srcPort & 0xffff;
-        evTopoLink.dstSwport = dstPort & 0xffff;
-        evTopoLink.srcPortState = srcPortState;
-        evTopoLink.dstPortState = dstPortState;
-        evTopoLink.reason    = reason;
-        switch (linkType) {
-            case DIRECT_LINK:
-                evTopoLink.linkType = "DIRECT_LINK";
-                break;
-            case MULTIHOP_LINK:
-                evTopoLink.linkType = "MULTIHOP_LINK";
-                break;
-            case TUNNEL:
-                evTopoLink.linkType = "TUNNEL";
-                break;
-            case INVALID_LINK:
-            default:
-                evTopoLink.linkType = "Unknown";
-                break;
-        }
-        evTopoLink = evHistTopologyLink.put(evTopoLink, actn);
-    }
-
-    public void evHistTopoCluster(long dpid, long clusterIdOld,
-                                  long clusterIdNew, EvAction action, String reason) {
-        if (evTopoCluster == null) {
-            evTopoCluster = new EventHistoryTopologyCluster();
-        }
-        evTopoCluster.dpid         = dpid;
-        evTopoCluster.clusterIdOld = clusterIdOld;
-        evTopoCluster.clusterIdNew = clusterIdNew;
-        evTopoCluster.reason       = reason;
-        evTopoCluster = evHistTopologyCluster.put(evTopoCluster, action);
-    }
-
-    @Override
-    public boolean isAutoPortFastFeature() {
-        return autoPortFastFeature;
-    }
-
-    @Override
-    public void setAutoPortFastFeature(boolean autoPortFastFeature) {
-        this.autoPortFastFeature = autoPortFastFeature;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/AutoPortFast.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/AutoPortFast.java
deleted file mode 100644
index ce1be94..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/AutoPortFast.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery.web;
-
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
-
-import org.restlet.data.Status;
-import org.restlet.resource.Get;
-import org.restlet.resource.ServerResource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class AutoPortFast extends ServerResource {
-    protected final static Logger log = LoggerFactory.getLogger(AutoPortFast.class);
-
-    @Get("json")
-    public String retrieve() {
-        ILinkDiscoveryService linkDiscovery;
-        linkDiscovery = (ILinkDiscoveryService)getContext().getAttributes().
-                get(ILinkDiscoveryService.class.getCanonicalName());
-
-        String param = ((String)getRequestAttributes().get("state")).toLowerCase();
-        if (param.equals("enable") || param.equals("true")) {
-            linkDiscovery.setAutoPortFastFeature(true);
-        } else if (param.equals("disable") || param.equals("false")) {
-            linkDiscovery.setAutoPortFastFeature(false);
-        }
-        setStatus(Status.SUCCESS_OK, "OK");
-        if (linkDiscovery.isAutoPortFastFeature())
-            return "enabled";
-        else return "disabled";
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinkDiscoveryWebRoutable.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinkDiscoveryWebRoutable.java
deleted file mode 100644
index 4350ba6..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinkDiscoveryWebRoutable.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery.web;
-
-import net.floodlightcontroller.restserver.RestletRoutable;
-
-import org.restlet.Context;
-import org.restlet.routing.Router;
-
-public class LinkDiscoveryWebRoutable implements RestletRoutable {
-    /**
-     * Create the Restlet router and bind to the proper resources.
-     */
-    @Override
-    public Router getRestlet(Context context) {
-        Router router = new Router(context);
-        router.attach("/links/json", LinksResource.class);
-        router.attach("/autoportfast/{state}/json", AutoPortFast.class); // enable/true or disable/false
-        return router;
-    }
-
-    /**
-     * Set the base path for the Topology
-     */
-    @Override
-    public String basePath() {
-        return "/wm/onos/linkdiscovery";
-    }
-}
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinkWithType.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinkWithType.java
deleted file mode 100644
index 6fa430e..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinkWithType.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery.web;
-
-import java.io.IOException;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.openflow.util.HexString;
-
-import net.onrc.onos.ofcontroller.linkdiscovery.Link;
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscovery.LinkType;
-
-/**
- * This class is both the datastructure and the serializer
- * for a link with the corresponding type of link.
- * @author alexreimers
- */
-@JsonSerialize(using=LinkWithType.class)
-public class LinkWithType extends JsonSerializer<LinkWithType> {
-    public long srcSwDpid;
-    public short srcPort;
-    public int srcPortState;
-    public long dstSwDpid;
-    public short dstPort;
-    public int dstPortState;
-    public LinkType type;
-
-    // Do NOT delete this, it's required for the serializer
-    public LinkWithType() {}
-    
-    public LinkWithType(Link link,
-                        int srcPortState,
-                        int dstPortState,
-                        LinkType type) {
-        this.srcSwDpid = link.getSrc();
-        this.srcPort = link.getSrcPort();
-        this.srcPortState = srcPortState;
-        this.dstSwDpid = link.getDst();
-        this.dstPort = link.getDstPort();
-        this.dstPortState = dstPortState;
-        this.type = type;
-    }
-
-	@Override
-	public void serialize(LinkWithType lwt, JsonGenerator jgen, SerializerProvider arg2) 
-			throws IOException, JsonProcessingException {
-		// You ****MUST*** use lwt for the fields as it's actually a different object.
-		jgen.writeStartObject();
-		jgen.writeStringField("src-switch", HexString.toHexString(lwt.srcSwDpid));
-		jgen.writeNumberField("src-port", lwt.srcPort);
-		jgen.writeNumberField("src-port-state", lwt.srcPortState);
-		jgen.writeStringField("dst-switch", HexString.toHexString(lwt.dstSwDpid));
-		jgen.writeNumberField("dst-port", lwt.dstPort);
-		jgen.writeNumberField("dst-port-state", lwt.dstPortState);
-		jgen.writeStringField("type", lwt.type.toString());
-		jgen.writeEndObject();
-	}
-	
-	@Override
-	public Class<LinkWithType> handledType() {
-		return LinkWithType.class;
-	}
-}
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinksResource.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinksResource.java
deleted file mode 100644
index ce6b2fa..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/web/LinksResource.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package net.onrc.onos.ofcontroller.linkdiscovery.web;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import net.onrc.onos.ofcontroller.linkdiscovery.ILinkDiscoveryService;
-import net.onrc.onos.ofcontroller.linkdiscovery.Link;
-import net.onrc.onos.ofcontroller.linkdiscovery.LinkInfo;
-
-import org.restlet.resource.Get;
-import org.restlet.resource.ServerResource;
-
-public class LinksResource extends ServerResource {
-
-    @Get("json")
-    public Set<LinkWithType> retrieve() {
-        ILinkDiscoveryService ld = (ILinkDiscoveryService)getContext().getAttributes().
-                get(ILinkDiscoveryService.class.getCanonicalName());
-        Map<Link, LinkInfo> links = new HashMap<Link, LinkInfo>();
-        Set<LinkWithType> returnLinkSet = new HashSet<LinkWithType>();
-
-        if (ld != null) {
-            links.putAll(ld.getLinks());
-            for(Entry<Link, LinkInfo> e : links.entrySet()) {
-                Link link = e.getKey();
-                LinkInfo info = e.getValue();
-                LinkWithType lwt = new LinkWithType(link,
-                                                    info.getSrcPortState(),
-                                                    info.getDstPortState(),
-                                                    ld.getLinkType(link, info));
-                returnLinkSet.add(lwt);
-            }
-        }
-        return returnLinkSet;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
index 732265e..d002c2e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/TopologyManager.java
@@ -20,8 +20,8 @@
 import net.onrc.onos.core.datastore.topology.KVLink;
 import net.onrc.onos.core.datastore.topology.KVPort;
 import net.onrc.onos.core.datastore.topology.KVSwitch;
+import net.onrc.onos.core.util.EventEntry;
 import net.onrc.onos.ofcontroller.networkgraph.PortEvent.SwitchPort;
-import net.onrc.onos.ofcontroller.util.EventEntry;
 import net.onrc.onos.registry.controller.IControllerRegistryService;
 
 import org.slf4j.Logger;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/NetworkGraphShortestPathResource.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/NetworkGraphShortestPathResource.java
index fa5e93b..f5a6479 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/NetworkGraphShortestPathResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/web/NetworkGraphShortestPathResource.java
@@ -5,6 +5,7 @@
 import java.util.List;
 
 import net.onrc.onos.core.intent.ConstrainedBFSTree;
+import net.onrc.onos.core.util.Dpid;
 import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
 import net.onrc.onos.ofcontroller.networkgraph.Link;
 import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
@@ -12,7 +13,6 @@
 import net.onrc.onos.ofcontroller.networkgraph.Path;
 import net.onrc.onos.ofcontroller.networkgraph.Switch;
 import net.onrc.onos.ofcontroller.networkgraph.serializers.LinkSerializer;
-import net.onrc.onos.ofcontroller.util.Dpid;
 
 import org.codehaus.jackson.Version;
 import org.codehaus.jackson.map.ObjectMapper;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/CallerId.java b/src/main/java/net/onrc/onos/ofcontroller/util/CallerId.java
deleted file mode 100644
index a0217d4..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/CallerId.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing a Caller ID for an ONOS component.
- */
-public class CallerId {
-    private String value;
-
-    /**
-     * Default constructor.
-     */
-    public CallerId() {}
-    
-    /**
-     * Copy constructor
-     * @param otherCallerId
-     */
-    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; }
-
-    /**
-     * Set the value of the Caller ID.
-     *
-     * @param value the value to set.
-     */
-    @JsonProperty("value")
-    public void setValue(String value) {
-	this.value = 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/ofcontroller/util/DataPath.java b/src/main/java/net/onrc/onos/ofcontroller/util/DataPath.java
deleted file mode 100644
index ba8f458..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/DataPath.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package net.onrc.onos.ofcontroller.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.
-     *
-     * 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() {
-	String ret = "[src=" + this.srcPort.toString();
-
-	for (FlowEntry fe : flowEntries) {
-	    ret += " flowEntry=" + fe.toString();
-	}
-	ret += " dst=" + this.dstPort.toString() + "]";
-
-	return ret;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/DataPathEndpoints.java b/src/main/java/net/onrc/onos/ofcontroller/util/DataPathEndpoints.java
deleted file mode 100644
index 9cdd4fb..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/DataPathEndpoints.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Data Path Endpoints.
- */
-public class DataPathEndpoints {
-    private SwitchPort srcPort;		// The source port
-    private SwitchPort dstPort;		// The destination port
-
-    /**
-     * Default constructor.
-     */
-    public DataPathEndpoints() {
-    }
-
-    /**
-     * 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; }
-
-    /**
-     * 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;
-    }
-
-    /**
-     * Convert the data path endpoints to a string.
-     *
-     * 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/ofcontroller/util/Dpid.java b/src/main/java/net/onrc/onos/ofcontroller/util/Dpid.java
deleted file mode 100644
index 81223d2..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/Dpid.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import net.onrc.onos.ofcontroller.util.serializers.DpidDeserializer;
-import net.onrc.onos.ofcontroller.util.serializers.DpidSerializer;
-
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.openflow.util.HexString;
-
-/**
- * The class representing a network switch DPID.
- */
-@JsonDeserialize(using=DpidDeserializer.class)
-@JsonSerialize(using=DpidSerializer.class)
-public class Dpid {
-    static public final long UNKNOWN = 0;
-
-    private long value;
-
-    /**
-     * Default constructor.
-     */
-    public Dpid() {
-	this.value = Dpid.UNKNOWN;
-    }
-
-    /**
-     * Constructor from a long value.
-     *
-     * @param value the value to use.
-     */
-    public Dpid(long value) {
-	this.value = value;
-    }
-
-    /**
-     * Constructor from a string.
-     *
-     * @param value the value to use.
-     */
-    public Dpid(String value) {
-	this.value = HexString.toLong(value);
-    }
-
-    /**
-     * Get the value of the DPID.
-     *
-     * @return the value of the DPID.
-     */
-    public long value() { return value; }
-
-    /**
-     * Set the value of the DPID.
-     *
-     * @param value the value to set.
-     */
-    public void setValue(long value) {
-	this.value = value;
-    }
-
-    /**
-     * Convert the DPID value to a ':' separated hexadecimal string.
-     *
-     * @return the DPID value as a ':' separated hexadecimal string.
-     */
-    @Override
-    public String toString() {
-	return HexString.toHexString(this.value);
-    }
-
-    @Override
-    public boolean equals(Object other) {
-    	if (!(other instanceof Dpid)) {
-    		return false;
-    	}
-
-    	Dpid otherDpid = (Dpid) other;
-
-    	return value == otherDpid.value;
-    }
-
-    @Override
-    public int hashCode() {
-    	int hash = 17;
-    	hash += 31 * hash + (int)(value ^ value >>> 32); 
-    	return hash;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/EventEntry.java b/src/main/java/net/onrc/onos/ofcontroller/util/EventEntry.java
deleted file mode 100644
index 5b296e0..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/EventEntry.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-/**
- * Class for encapsulating events with event-related data entry.
- */
-public class EventEntry<T> {
-    /**
-     * The event types.
-     */
-    public enum Type {
-	ENTRY_ADD,			// Add or update an entry
-	ENTRY_REMOVE			// Remove an entry
-    }
-
-    private Type	eventType;	// The event type
-    private T		eventData;	// The relevant event data entry
-
-    /**
-     * Constructor for a given event type and event-related data entry.
-     *
-     * @param eventType the event type.
-     * @param eventData the event data entry.
-     */
-    public EventEntry(EventEntry.Type eventType, T eventData) {
-	this.eventType = eventType;
-	this.eventData = eventData;
-    }
-
-    /**
-     * Test whether the event type is ENTRY_ADD.
-     *
-     * @return true if the event type is ENTRY_ADD, otherwise false.
-     */
-    public boolean isAdd() {
-	return (this.eventType == Type.ENTRY_ADD);
-    }
-
-    /**
-     * Test whether the event type is ENTRY_REMOVE.
-     *
-     * @return true if the event type is ENTRY_REMOVE, otherwise false.
-     */
-    public boolean isRemove() {
-	return (this.eventType == Type.ENTRY_REMOVE);
-    }
-
-    /**
-     * Get the event type.
-     *
-     * @return the event type.
-     */
-    public EventEntry.Type eventType() {
-	return this.eventType;
-    }
-
-    /**
-     * Get the event-related data entry.
-     *
-     * @return the event-related data entry.
-     */
-    public T eventData() {
-	return this.eventData;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntry.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntry.java
deleted file mode 100644
index c6d6726..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntry.java
+++ /dev/null
@@ -1,462 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Flow Entry.
- *
- * 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 Port inPort;		// The Switch incoming port. Used only
-					// when the entry is used to return
-					// Shortest Path computation.
-    private Port 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * Used only when the entry is used to return Shortest Path computation.
-     *
-     * @return the Switch incoming port.
-     */
-    @JsonProperty("inPort")
-    public Port inPort() { return inPort; }
-
-    /**
-     * Set the Switch incoming port.
-     *
-     * 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(Port inPort) {
-	this.inPort = inPort;
-    }
-
-    /**
-     * Get the Switch outgoing port.
-     *
-     * Used only when the entry is used to return Shortest Path computation.
-     *
-     * @return the Switch outgoing port.
-     */
-    @JsonProperty("outPort")
-    public Port outPort() { return outPort; }
-
-    /**
-     * Set the Switch outgoing port.
-     *
-     * 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(Port 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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/ofcontroller/util/FlowEntryAction.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryAction.java
deleted file mode 100644
index e431f8a..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryAction.java
+++ /dev/null
@@ -1,1677 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import net.floodlightcontroller.util.MACAddress;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing a single Flow Entry action.
- *
- * 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.
-     *
-     * 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 Port 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 Port(other.port);
-	    this.maxLen = other.maxLen;
-	}
-
-	/**
-	 * Constructor from a string.
-	 *
-	 * 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(Port port, short maxLen) {
-	    this.port = port;
-	    this.maxLen = maxLen;
-	}
-
-	/**
-	 * Constructor for a given output port.
-	 *
-	 * @param port the output port to set.
-	 */
-	public ActionOutput(Port port) {
-	    this.port = port;
-	    this.maxLen = 0;
-	}
-
-	/**
-	 * Get the output port.
-	 *
-	 * @return the output port.
-	 */
-	@JsonProperty("port")
-	public Port 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.
-	 *
-	 * 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.
-	 *
-	 * 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 {
-			Short valueShort = Short.valueOf(tokens[1]);
-			port = new Port(valueShort);
-		    } 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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.
-	 *
-	 * 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 Port 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 Port(other.port);
-	    this.queueId = other.queueId;
-	}
-
-	/**
-	 * Constructor from a string.
-	 *
-	 * 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(Port port, int queueId) {
-	    this.port = port;
-	    this.queueId = queueId;
-	}
-
-	/**
-	 * Get the port.
-	 *
-	 * @return the port.
-	 */
-	@JsonProperty("port")
-	public Port 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.
-	 *
-	 * 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.
-	 *
-	 * 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 Port(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.
-     *
-     * 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(Port 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) {
-	Port port = new Port(Port.PortValues.PORT_CONTROLLER);
-	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(Port port, int queueId) {
-	actionEnqueue = new ActionEnqueue(port, queueId);
-	actionType = ActionValues.ACTION_ENQUEUE;
-    }
-
-    /**
-     * Convert the action to a string.
-     *
-     * 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;
-	}
-	ret += "]";
-
-	return ret;
-    }
-
-    /**
-     * Convert a string to an action.
-     *
-     * 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;
-	    }
-	} catch (IllegalArgumentException e) {
-	    throw new IllegalArgumentException("Invalid action string");
-	}
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryActions.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryActions.java
deleted file mode 100644
index 7d9688b..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryActions.java
+++ /dev/null
@@ -1,148 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import java.util.ArrayList;
-
-import org.codehaus.jackson.annotate.JsonIgnore;
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing multiple Flow Entry actions.
- *
- * 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.
-     *
-     * 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.
-     *
-     * 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() {
-	String ret = "[";
-	for (FlowEntryAction action : actions) {
-	    ret += action.toString() + ";";
-	}
-	ret += "]";
-
-	return ret;
-    }
-
-    /**
-     * Convert a string to a set of actions.
-     *
-     * 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/ofcontroller/util/FlowEntryErrorState.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryErrorState.java
deleted file mode 100644
index 2e8c448..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryErrorState.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package net.onrc.onos.ofcontroller.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 type the error type to use.
-     * @param code the error code to use.
-     */
-    public void setValue(short type, short code) {
-	this.type = type;
-	this.code = code;
-    }
-
-    /**
-     * Convert the error type and code to a string.
-     *
-     * 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/ofcontroller/util/FlowEntryId.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryId.java
deleted file mode 100644
index 0ecaebe..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryId.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import java.math.BigInteger;
-
-import net.onrc.onos.ofcontroller.util.serializers.FlowEntryIdDeserializer;
-import net.onrc.onos.ofcontroller.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.
- */
-@JsonDeserialize(using=FlowEntryIdDeserializer.class)
-@JsonSerialize(using=FlowEntryIdSerializer.class)
-public class FlowEntryId {
-    private long value;
-
-    /**
-     * Default constructor.
-     */
-    public FlowEntryId() {
-	this.value = -1;
-    }
-
-    /**
-     * 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; }
-
-    /**
-     * Set the value of the Flow Entry ID.
-     *
-     * @param value the value to set.
-     */
-    public void setValue(long value) {
-	this.value = 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() != -1);
-    }
-
-    /**
-     * Returns true of the object is another Flow Entry ID with 
-     * the same value; otherwise, returns false.
-     * 
-     * @param Object 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/ofcontroller/util/FlowEntryMatch.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryMatch.java
deleted file mode 100644
index a2ac748..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryMatch.java
+++ /dev/null
@@ -1,711 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import net.floodlightcontroller.util.MACAddress;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing the Flow Entry Matching filter.
- *
- * 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 value the value to set.
-	 */
-	public void enableMatch(T value) {
-	    this.value = value;
-	    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<Port> 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 Port inPort() {
-	if (inPort != null)
-	    return inPort.value();
-	return null;
-    }
-
-    /**
-     * Enable the matching on input switch port.
-     *
-     * @param inPort the input switch port value to enable for matching.
-     */
-    @JsonProperty("inPort")
-    public void enableInPort(Port inPort) {
-	this.inPort = new Field<Port>(inPort);
-    }
-
-    /**
-     * 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 srcMac the source MAC address value to enable for matching.
-     */
-    @JsonProperty("srcMac")
-    public void enableSrcMac(MACAddress srcMac) {
-	this.srcMac = new Field<MACAddress>(srcMac);
-    }
-
-    /**
-     * 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 dstMac the destination MAC address value to enable for matching.
-     */
-    @JsonProperty("dstMac")
-    public void enableDstMac(MACAddress dstMac) {
-	this.dstMac = new Field<MACAddress>(dstMac);
-    }
-
-    /**
-     * 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 ethernetFrameType the Ethernet frame type value to enable for
-     * matching.
-     */
-    @JsonProperty("ethernetFrameType")
-    public void enableEthernetFrameType(Short ethernetFrameType) {
-	this.ethernetFrameType = new Field<Short>(ethernetFrameType);
-    }
-
-    /**
-     * 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 vlanId the VLAN ID value to enable for matching.
-     */
-    @JsonProperty("vlanId")
-    public void enableVlanId(Short vlanId) {
-	this.vlanId = new Field<Short>(vlanId);
-    }
-
-    /**
-     * 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 vlanPriority the VLAN priority value to enable for matching.
-     */
-    @JsonProperty("vlanPriority")
-    public void enableVlanPriority(Byte vlanPriority) {
-	this.vlanPriority = new Field<Byte>(vlanPriority);
-    }
-
-    /**
-     * 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 srcIPv4Net the source IPv4 prefix value to enable for matching.
-     */
-    @JsonProperty("srcIPv4Net")
-    public void enableSrcIPv4Net(IPv4Net srcIPv4Net) {
-	this.srcIPv4Net = new Field<IPv4Net>(srcIPv4Net);
-    }
-
-    /**
-     * 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 dstIPv4Net the destination IPv4 prefix value to enable for
-     * matching.
-     */
-    @JsonProperty("dstIPv4Net")
-    public void enableDstIPv4Net(IPv4Net dstIPv4Net) {
-	this.dstIPv4Net = new Field<IPv4Net>(dstIPv4Net);
-    }
-
-    /**
-     * 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 ipProto the IP protocol value to enable for matching.
-     */
-    @JsonProperty("ipProto")
-    public void enableIpProto(Byte ipProto) {
-	this.ipProto = new Field<Byte>(ipProto);
-    }
-
-    /**
-     * 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 ipToS the IP ToS value to enable for matching.
-     */
-    @JsonProperty("ipToS")
-    public void enableIpToS(Byte ipToS) {
-	this.ipToS = new Field<Byte>(ipToS);
-    }
-
-    /**
-     * 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 srcTcpUdpPort the source TCP/UDP port to enable for matching.
-     */
-    @JsonProperty("srcTcpUdpPort")
-    public void enableSrcTcpUdpPort(Short srcTcpUdpPort) {
-	this.srcTcpUdpPort = new Field<Short>(srcTcpUdpPort);
-    }
-
-    /**
-     * 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 dstTcpUdpPort the destination TCP/UDP port to enable for
-     * matching.
-     */
-    @JsonProperty("dstTcpUdpPort")
-    public void enableDstTcpUdpPort(Short dstTcpUdpPort) {
-	this.dstTcpUdpPort = new Field<Short>(dstTcpUdpPort);
-    }
-
-    /**
-     * 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.
-     *
-     * 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/ofcontroller/util/FlowEntrySwitchState.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntrySwitchState.java
deleted file mode 100644
index 44439f2..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntrySwitchState.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package net.onrc.onos.ofcontroller.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/ofcontroller/util/FlowEntryUserState.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryUserState.java
deleted file mode 100644
index 5ed8865..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowEntryUserState.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.onrc.onos.ofcontroller.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/ofcontroller/util/FlowId.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowId.java
deleted file mode 100644
index d90e96f..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowId.java
+++ /dev/null
@@ -1,102 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import java.math.BigInteger;
-
-import net.onrc.onos.ofcontroller.util.serializers.FlowIdDeserializer;
-import net.onrc.onos.ofcontroller.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.
- */
-@JsonDeserialize(using=FlowIdDeserializer.class)
-@JsonSerialize(using=FlowIdSerializer.class)
-public class FlowId implements Comparable<FlowId> {
-    private long value;
-
-    /**
-     * Default constructor.
-     */
-    public FlowId() {
-	this.value = -1;
-    }
-
-    /**
-     * 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; }
-
-    /**
-     * Set the value of the Flow ID.
-     *
-     * @param value the value to set.
-     */
-    public void setValue(long value) {
-	this.value = 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() != -1);
-    }
-
-    /**
-     * 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());
-	}
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPath.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowPath.java
deleted file mode 100644
index c7806a2..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPath.java
+++ /dev/null
@@ -1,316 +0,0 @@
-package net.onrc.onos.ofcontroller.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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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;
-    }
-    
-    /**
-     * CompareTo method to order flowPath by Id
-     */
-    @Override
-    public int compareTo(FlowPath f) {
-    	return (int) (this.flowId.value() - f.flowId.value());
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPathFlags.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowPathFlags.java
deleted file mode 100644
index 3c6ffc4..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPathFlags.java
+++ /dev/null
@@ -1,129 +0,0 @@
-package net.onrc.onos.ofcontroller.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.
-     *
-     * 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.
-     *
-     * 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.
-     *
-     * 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/ofcontroller/util/FlowPathType.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowPathType.java
deleted file mode 100644
index 87f2d98..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPathType.java
+++ /dev/null
@@ -1,10 +0,0 @@
-package net.onrc.onos.ofcontroller.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/ofcontroller/util/FlowPathUserState.java b/src/main/java/net/onrc/onos/ofcontroller/util/FlowPathUserState.java
deleted file mode 100644
index 96b6345..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/FlowPathUserState.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.onrc.onos.ofcontroller.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/ofcontroller/util/IPv4.java b/src/main/java/net/onrc/onos/ofcontroller/util/IPv4.java
deleted file mode 100644
index 119165c..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/IPv4.java
+++ /dev/null
@@ -1,88 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import net.onrc.onos.ofcontroller.util.serializers.IPv4Deserializer;
-import net.onrc.onos.ofcontroller.util.serializers.IPv4Serializer;
-
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/**
- * The class representing an IPv4 address.
- */
-@JsonDeserialize(using=IPv4Deserializer.class)
-@JsonSerialize(using=IPv4Serializer.class)
-public class IPv4 {
-    private int value;
-
-    /**
-     * Default constructor.
-     */
-    public IPv4() {
-	this.value = 0;
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public IPv4(IPv4 other) {
-	this.value = other.value;
-    }
-
-    /**
-     * Constructor from an integer value.
-     *
-     * @param value the value to use.
-     */
-    public IPv4(int value) {
-	this.value = value;
-    }
-
-    /**
-     * Constructor from a string.
-     *
-     * @param value the value to use.
-     */
-    public IPv4(String value) {
-        String[] splits = value.split("\\.");
-        if (splits.length != 4)
-            throw new IllegalArgumentException("Specified IPv4 address must contain four " +
-					       "numerical digits separated by '.'");
-
-        int result = 0;
-        for (int i = 0; i < 4; ++i) {
-            result |= Integer.valueOf(splits[i]) << ((3-i)*8);
-        }
-	this.value = result;
-    }
-
-    /**
-     * Get the value of the IPv4 address.
-     *
-     * @return the value of the IPv4 address.
-     */
-    public int value() { return value; }
-
-    /**
-     * Set the value of the IPv4 address.
-     *
-     * @param value the value to set.
-     */
-    public void setValue(int value) {
-	this.value = value;
-    }
-
-    /**
-     * Convert the IPv4 value to a '.' separated string.
-     *
-     * @return the IPv4 value as a '.' separated string.
-     */
-    @Override
-    public String toString() {
-	return ((this.value >> 24) & 0xFF) + "." +
-	    ((this.value >> 16) & 0xFF) + "." +
-	    ((this.value >> 8) & 0xFF) + "." +
-	    (this.value & 0xFF);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/IPv4Net.java b/src/main/java/net/onrc/onos/ofcontroller/util/IPv4Net.java
deleted file mode 100644
index 9ce247c..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/IPv4Net.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import net.onrc.onos.ofcontroller.util.serializers.IPv4NetDeserializer;
-import net.onrc.onos.ofcontroller.util.serializers.IPv4NetSerializer;
-
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/**
- * The class representing an IPv4 network address.
- */
-@JsonDeserialize(using=IPv4NetDeserializer.class)
-@JsonSerialize(using=IPv4NetSerializer.class)
-public class IPv4Net {
-    private IPv4 address;		// The IPv4 address
-    private short prefixLen;		// The prefix length
-
-    /**
-     * Default constructor.
-     */
-    public IPv4Net() {
-	this.prefixLen = 0;
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public IPv4Net(IPv4Net other) {
-	if (other.address != null)
-	    this.address = new IPv4(other.address);
-	this.prefixLen = other.prefixLen;
-    }
-
-    /**
-     * Constructor for a given address and prefix length.
-     *
-     * @param address the address to use.
-     * @param prefixLen the prefix length to use.
-     */
-    public IPv4Net(IPv4 address, short prefixLen) {
-	this.address = address;
-	this.prefixLen = prefixLen;
-    }
-
-    /**
-     * Constructor from a string.
-     *
-     * @param value the value to use.
-     */
-    public IPv4Net(String value) {
-	String[] splits = value.split("/");
-	if (splits.length != 2) {
-	    throw new IllegalArgumentException("Specified IPv4Net address must contain an IPv4 " +
-					       "address and a prefix length separated by '/'");
-	}
-	this.address = new IPv4(splits[0]);
-	this.prefixLen = Short.decode(splits[1]);
-    }
-
-    /**
-     * Get the address value of the IPv4Net address.
-     *
-     * @return the address value of the IPv4Net address.
-     */
-    public IPv4 address() { return address; }
-
-    /**
-     * Set the address value of the IPv4Net address.
-     *
-     * @param address the address to use.
-     */
-    public void setAddress(IPv4 address) {
-	this.address = address;
-    }
-
-    /**
-     * Get the prefix length value of the IPv4Net address.
-     *
-     * @return the prefix length value of the IPv4Net address.
-     */
-    public short prefixLen() { return prefixLen; }
-
-    /**
-     * Set the prefix length value of the IPv4Net address.
-     *
-     * @param prefixLen the prefix length to use.
-     */
-    public void setPrefixLen(short prefixLen) {
-	this.prefixLen = prefixLen;
-    }
-
-    /**
-     * Set the value of the IPv4Net address.
-     *
-     * @param address the address to use.
-     * @param prefixLen the prefix length to use.
-     */
-    public void setValue(IPv4 address, short prefixLen) {
-	this.address = address;
-	this.prefixLen = prefixLen;
-    }
-
-    /**
-     * Convert the IPv4Net value to an "address/prefixLen" string.
-     *
-     * @return the IPv4Net value as an "address/prefixLen" string.
-     */
-    @Override
-    public String toString() {
-	return this.address.toString() + "/" + this.prefixLen;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/IPv6.java b/src/main/java/net/onrc/onos/ofcontroller/util/IPv6.java
deleted file mode 100644
index f5dae11..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/IPv6.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import net.onrc.onos.ofcontroller.util.serializers.IPv6Deserializer;
-import net.onrc.onos.ofcontroller.util.serializers.IPv6Serializer;
-
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-import org.openflow.util.HexString;
-
-/**
- * The class representing an IPv6 address.
- */
-@JsonDeserialize(using=IPv6Deserializer.class)
-@JsonSerialize(using=IPv6Serializer.class)
-public class IPv6 {
-    private long valueHigh;	// The higher (more significant) 64 bits
-    private long valueLow;	// The lower (less significant) 64 bits
-
-    /**
-     * Default constructor.
-     */
-    public IPv6() {
-	this.valueHigh = 0;
-	this.valueLow = 0;
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public IPv6(IPv6 other) {
-	this.valueHigh = other.valueHigh;
-	this.valueLow = other.valueLow;
-    }
-
-    /**
-     * Constructor from integer values.
-     *
-     * @param valueHigh the higher (more significant) 64 bits of the address.
-     * @param valueLow the lower (less significant) 64 bits of the address.
-     */
-    public IPv6(long valueHigh, long valueLow) {
-	this.valueHigh = valueHigh;
-	this.valueLow = valueLow;
-    }
-
-    /**
-     * Constructor from a string.
-     *
-     * @param value the value to use.
-     */
-    public IPv6(String value) {
-	// TODO: Implement it!
-	this.valueHigh = 0;
-	this.valueLow = 0;
-    }
-
-    /**
-     * Get the value of the higher (more significant) 64 bits of the address.
-     *
-     * @return the value of the higher (more significant) 64 bits of the
-     * address.
-     */
-    public long valueHigh() { return valueHigh; }
-
-    /**
-     * Set the value of the higher (more significant) 64 bits of the address.
-     *
-     * @param valueHigh the higher (more significant) 64 bits of the address.
-     */
-    public void setValueHigh(long valueHigh) {
-	this.valueHigh = valueHigh;
-    }
-
-    /**
-     * Get the value of the lower (less significant) 64 bits of the address.
-     *
-     * @return the value of the lower (less significant) 64 bits of the
-     * address.
-     */
-    public long valueLow() { return valueLow; }
-
-    /**
-     * Get the value of the lower (less significant) 64 bits of the address.
-     *
-     * @param valueLow the lower (less significant) 64 bits of the address.
-     */
-    public void setValueLow(long valueLow) {
-	this.valueLow = valueLow;
-    }
-
-    /**
-     * Set the value of the IPv6 address.
-     *
-     * @param valueHigh the higher (more significant) 64 bits of the address.
-     * @param valueLow the lower (less significant) 64 bits of the address.
-     */
-    public void setValue(long valueHigh, long valueLow) {
-	this.valueHigh = valueHigh;
-	this.valueLow = valueLow;
-    }
-
-    /**
-     * Convert the IPv6 value to a ':' separated string.
-     *
-     * @return the IPv6 value as a ':' separated string.
-     */
-    @Override
-    public String toString() {
-	return HexString.toHexString(this.valueHigh) + ":" +
-	    HexString.toHexString(this.valueLow);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/IPv6Net.java b/src/main/java/net/onrc/onos/ofcontroller/util/IPv6Net.java
deleted file mode 100644
index 65ffe54..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/IPv6Net.java
+++ /dev/null
@@ -1,114 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import net.onrc.onos.ofcontroller.util.serializers.IPv6NetDeserializer;
-import net.onrc.onos.ofcontroller.util.serializers.IPv6NetSerializer;
-
-import org.codehaus.jackson.map.annotate.JsonDeserialize;
-import org.codehaus.jackson.map.annotate.JsonSerialize;
-
-/**
- * The class representing an IPv6 network address.
- */
-@JsonDeserialize(using=IPv6NetDeserializer.class)
-@JsonSerialize(using=IPv6NetSerializer.class)
-public class IPv6Net {
-    private IPv6 address;		// The IPv6 address
-    private short prefixLen;		// The prefix length
-
-    /**
-     * Default constructor.
-     */
-    public IPv6Net() {
-	this.prefixLen = 0;
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public IPv6Net(IPv6Net other) {
-	if (other.address != null)
-	    this.address = new IPv6(other.address);
-	this.prefixLen = other.prefixLen;
-    }
-
-    /**
-     * Constructor for a given address and prefix length.
-     *
-     * @param address the address to use.
-     * @param prefixLen the prefix length to use.
-     */
-    public IPv6Net(IPv6 address, short prefixLen) {
-	this.address = address;
-	this.prefixLen = prefixLen;
-    }
-
-    /**
-     * Constructor from a string.
-     *
-     * @param value the value to use.
-     */
-    public IPv6Net(String value) {
-	String[] splits = value.split("/");
-	if (splits.length != 2) {
-	    throw new IllegalArgumentException("Specified IPv6Net address must contain an IPv6 " +
-					       "address and a prefix length separated by '/'");
-	}
-	this.address = new IPv6(splits[0]);
-	this.prefixLen = Short.decode(splits[1]);
-    }
-
-    /**
-     * Get the address value of the IPv6Net address.
-     *
-     * @return the address value of the IPv6Net address.
-     */
-    public IPv6 address() { return address; }
-
-    /**
-     * Set the address value of the IPv6Net address.
-     *
-     * @param address the address to use.
-     */
-    public void setAddress(IPv6 address) {
-	this.address = address;
-    }
-
-    /**
-     * Get the prefix length value of the IPv6Net address.
-     *
-     * @return the prefix length value of the IPv6Net address.
-     */
-    public short prefixLen() { return prefixLen; }
-
-    /**
-     * Set the prefix length value of the IPv6Net address.
-     *
-     * @param prefixLen the prefix length to use.
-     */
-    public void setPrefixLen(short prefixLen) {
-	this.prefixLen = prefixLen;
-    }
-
-    /**
-     * Set the value of the IPv6Net address.
-     *
-     * @param address the address to use.
-     * @param prefixLen the prefix length to use.
-     */
-    public void setValue(IPv6 address, short prefixLen) {
-	this.address = address;
-	this.prefixLen = prefixLen;
-    }
-
-    /**
-     * Convert the IPv6Net value to an "address/prefixLen" string.
-     *
-     * @return the IPv6Net value as an "address/prefixLen" string.
-     */
-    @Override
-    public String toString() {
-	return this.address.toString() + "/" + this.prefixLen;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/Pair.java b/src/main/java/net/onrc/onos/ofcontroller/util/Pair.java
deleted file mode 100644
index bdc24d3..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/Pair.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-/**
- * A generic class representing a pair of two values.
- */
-public class Pair<F, S> {
-    public F first;		// The first value in the pair
-    public S second;		// The second value in the pair
-
-    /**
-     * Constructor for a pair of two values.
-     *
-     * @param first the first value in the pair.
-     * @param second the second value in the pair.
-     */
-    public Pair(F first, S second) {
-	this.first = first;
-	this.second = second;
-    }
-
-    @Override
-    public String toString() {
-	return String.format("<%s, %s>", first, second);
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/PerformanceMonitor.java b/src/main/java/net/onrc/onos/ofcontroller/util/PerformanceMonitor.java
deleted file mode 100644
index 189ea6c..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/PerformanceMonitor.java
+++ /dev/null
@@ -1,292 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import java.util.Map.Entry;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * Class for collecting performance measurements
- */
-public class PerformanceMonitor {
-    private final static Logger log = LoggerFactory.getLogger(PerformanceMonitor.class);
-
-    // experiment name -> PerformanceMonitor
-    private static final ConcurrentHashMap<String,PerformanceMonitor> perfMons = new ConcurrentHashMap<>();
-    public static PerformanceMonitor experiment(String name) {
-	PerformanceMonitor pm = perfMons.get(name);
-	if (pm == null) {
-	    pm = new PerformanceMonitor();
-	    PerformanceMonitor existing = perfMons.putIfAbsent(name, pm);
-	    if (existing != null) {
-		pm = existing;
-	    }
-	}
-	return pm;
-    }
-
-    // tag -> Measurements
-    private final ConcurrentHashMap<String, Queue<Measurement>> map = new ConcurrentHashMap<>();
-    private long overhead;
-    private long experimentStart = Long.MAX_VALUE;
-    private final static double normalization = Math.pow(10, 6);
-
-    /**
-     * Start a performance measurement, identified by a tag
-     *
-     * Note: Only a single measurement can use the same tag at a time.
-     * ..... not true anymore.
-     *
-     * @param tag for performance measurement
-     */
-    public Measurement startStep(String tag) {
-	long start = System.nanoTime();
-	if(start < experimentStart) {
-	    experimentStart = start;
-	}
-	Queue<Measurement> list = map.get(tag);
-	if(list == null) {
-	    list = new ConcurrentLinkedQueue<Measurement>();
-	    Queue<Measurement> existing_list = map.putIfAbsent(tag, list);
-	    if (existing_list != null) {
-		// someone concurrently added, using theirs
-		list = existing_list;
-	    }
-	}
-	Measurement m = new Measurement();
-	list.add(m);
-	m.start();
-	overhead += System.nanoTime() - start;
-	return m;
-    }
-
-    /**
-     * Stop a performance measurement.
-     *
-     * You must have already started a measurement with tag.
-     *
-     * @param tag for performance measurement
-     */
-    public void stopStep(String tag) {
-	long time = System.nanoTime();
-	Queue<Measurement> list = map.get(tag);
-	if(list == null || list.size() == 0) {
-	    log.error("Tag {} does not exist", tag);
-	}
-	list.peek().stop(time);
-	if(list.size() > 1) {
-	    log.error("Tag {} has multiple measurements", tag);
-	}
-	overhead += System.nanoTime() - time;
-    }
-
-    /**
-     * Clear all performance measurements.
-     */
-    public void reset() {
-	map.clear();
-	overhead = 0;
-	experimentStart = Long.MAX_VALUE;
-    }
-
-    /**
-     * Write all performance measurements to the log
-     */
-    public void reportAll() {
-	String result = "Performance Results: (avg/start/stop/count)\n";
-	if(map.size() == 0) {
-	    result += "No Measurements";
-	    log.error(result);
-	    return;
-	}
-	long experimentEnd = -1;
-	for(Entry<String, Queue<Measurement>> e : map.entrySet()) {
-	    String key = e.getKey();
-	    Queue<Measurement> list = e.getValue();
-	    long total = 0, count = 0;
-	    long start = Long.MAX_VALUE, stop = -1;
-	    for(Measurement m : list) {
-		if(m.stop < 0) {
-		    continue; // measurement has not been stopped
-		}
-		// Collect overall start and end times
-		if(m.start < start) {
-		    start = m.start;
-		}
-		if(m.stop > stop) {
-		    stop = m.stop;
-		    if(stop > experimentEnd) {
-			experimentEnd = stop;
-		    }
-		}
-		// Collect statistics for average
-		total += m.elapsed();
-		count++;
-	    }
-	    double avg = (double) total / count;
-	    // Normalize start/stop
-	    start -= experimentStart;
-	    stop -= experimentStart;
-	    result += key + '=' +
-		    (avg / normalization) + '/' +
-		    (start / normalization) + '/' +
-		    (stop / normalization) + '/' +
-		    count + '\n';
-	}
-	double overheadMs = overhead / normalization;
-	double experimentElapsed = (experimentEnd - experimentStart) / normalization;
-	result += "TotalTime:" + experimentElapsed + "/Overhead:" + overheadMs;
-	log.error(result);
-//	log.error("Performance Results: {} with measurement overhead: {} ms", map, overheadMilli);
-    }
-
-    /**
-     * Write the performance measurement for a tag to the log
-     *
-     * @param tag the tag name.
-     */
-    public void reportStep(String tag) {
-	Queue<Measurement> list = map.get(tag);
-	if(list == null) {
-	    return; //TODO
-	}
-	//TODO: fix this;
-	Measurement m = list.peek();
-	if (m != null) {
-	    log.error("Performance Result: tag = {} start = {} stop = {} elapsed = {}",
-		      tag, m.start, m.stop, m.toString());
-	} else {
-	    log.error("Performance Result: unknown tag {}", tag);
-	}
-    }
-
-    /**
-     * A single performance measurement
-     */
-    public static class Measurement {
-	long start;
-	long stop = -1;
-
-	/**
-	 * Start the measurement
-	 */
-	public void start() {
-	    if(start <= 0) {
-		start = System.nanoTime();
-	    }
-	}
-
-	/**
-	 * Stop the measurement
-	 */
-	public void stop() {
-	    long now = System.nanoTime();
-	    stop(now);
-	}
-
-	/**
-	 * Stop the measurement at a specific time
-	 * @param time to stop
-	 */
-	public void stop(long time){
-	    if(stop <= 0) {
-		stop = time;
-	    }
-	}
-
-	/**
-	 * Compute the elapsed time of the measurement in nanoseconds
-	 *
-	 * @return the measurement time in nanoseconds, or -1 if the measurement is stil running.
-	 */
-	public long elapsed() {
-	    if(stop <= 0) {
-		return -1;
-	    }
-	    else {
-		return stop - start;
-	    }
-	}
-
-	/**
-	 * Returns the number of milliseconds for the measurement as a String.
-	 */
-	@Override
-	public String toString() {
-	    double milli = elapsed() / normalization;
-	    double startMs = start / normalization;
-	    double stopMs = stop / normalization;
-
-	    return milli + "ms/" + startMs + '/' + stopMs;
-	}
-    }
-
-    @Deprecated
-    private static final PerformanceMonitor theInstance = new PerformanceMonitor();
-
-    @Deprecated
-    public static Measurement start(String tag) {
-	return theInstance.startStep(tag);
-    }
-
-    @Deprecated
-    public static void stop(String tag) {
-	theInstance.stopStep(tag);;
-    }
-
-    @Deprecated
-    public static void clear() {
-	theInstance.reset();;
-    }
-
-    @Deprecated
-    public static void report() {
-	theInstance.reportAll();;
-    }
-
-    @Deprecated
-    public static void report(String tag) {
-	theInstance.reportStep(tag);
-    }
-
-    public static void main(String args[]){
-	// test the measurement overhead
-	String tag;
-	for(int i = 0; i < 2; i++){
-	    tag = "foo foo foo";
-	    Measurement m;
-	    m = start(tag); System.out.println(tag); m.stop();
-	    m = start(tag); System.out.println(tag); m.stop();
-	    m = start(tag); System.out.println(tag); m.stop();
-	    m = start(tag); System.out.println(tag); m.stop();
-	    tag = "bar";
-	    start(tag); stop(tag);
-	    tag = "baz";
-	    start(tag); stop(tag);
-	    report();
-	    clear();
-	}
-	for(int i = 0; i < 100; i++){
-	    tag = "a";
-	    start(tag); stop(tag);
-	    start(tag); stop(tag);
-
-	    start(tag); stop(tag);
-	    start(tag); stop(tag);
-	    start(tag); stop(tag);
-	    start(tag); stop(tag);
-	    start(tag); stop(tag);
-	    start(tag); stop(tag);
-
-	    tag = "b";
-	    start(tag); stop(tag);
-	    tag = "c";
-	    start(tag); stop(tag);
-	    report();
-	    clear();
-	}
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/Port.java b/src/main/java/net/onrc/onos/ofcontroller/util/Port.java
deleted file mode 100644
index fedc8df..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/Port.java
+++ /dev/null
@@ -1,153 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing a network port of a switch.
- */
-
-public class Port {
-    /**
-     * Special port values.
-     *
-     * Those values are taken as-is from the OpenFlow-v1.0.0 specification
-     * (pp 18-19).
-     */
-    public enum PortValues {
-	/* Maximum number of physical switch ports. */
-	PORT_MAX		((short)0xff00),
-
-	/* Fake output "ports". */
-
-	/* Send the packet out the input port. This
-	   virtual port must be explicitly used
-	   in order to send back out of the input
-	   port. */
-	PORT_IN_PORT		((short)0xfff8),
-
-	/* Perform actions in flow table.
-	   NB: This can only be the destination
-	   port for packet-out messages. */
-	PORT_TABLE		((short)0xfff9),
-
-	/* Process with normal L2/L3 switching. */
-	PORT_NORMAL		((short)0xfffa),
-
-	/* All physical ports except input port and
-	   those disabled by STP. */
-	PORT_FLOOD		((short)0xfffb),
-
-	/* All physical ports except input port. */
-	PORT_ALL		((short)0xfffc),
-
-	/* Send to controller. */
-	PORT_CONTROLLER		((short)0xfffd),
-
-	/* Local openflow "port". */
-	PORT_LOCAL		((short)0xfffe),
-
-	/* Not associated with a physical port. */
-	PORT_NONE		((short)0xffff);
-
-	private final short value;	// The value
-
-	/**
-	 * Constructor for a given value.
-	 *
-	 * @param value the value to use for the initialization.
-	 */
-	private PortValues(short value) {
-	    this.value = value;
-	}
-
-	/**
-	 * Get the value as a short integer.
-	 *
-	 * @return the value as a short integer.
-	 */
-	private short value() { return this.value; }
-    }
-
-    private short value;
-
-    /**
-     * Default constructor.
-     */
-    public Port() {
-	this.value = 0;
-    }
-
-    /**
-     * Copy constructor.
-     *
-     * @param other the object to copy from.
-     */
-    public Port(Port other) {
-	this.value = other.value();
-    }
-
-    /**
-     * Constructor from a short integer value.
-     *
-     * @param value the value to use.
-     */
-    public Port(short value) {
-	this.value = value;
-    }
-
-    /**
-     * Constructor from a PortValues enum value.
-     *
-     * @param value the value to use.
-     */
-    public Port(PortValues value) {
-	this.value = value.value();
-    }
-
-    /**
-     * Get the value of the port.
-     *
-     * @return the value of the port.
-     */
-    @JsonProperty("value")
-    public short value() { return value; }
-
-    /**
-     * Set the value of the port.
-     *
-     * @param value the value to set.
-     */
-    @JsonProperty("value")
-    public void setValue(short value) {
-	this.value = value;
-    }
-
-    /**
-     * Convert the port value to a string.
-     *
-     * @return the port value as a string.
-     */
-    @Override
-    public String toString() {
-	return Short.toString(this.value);
-    }
-    
-
-    @Override
-    public boolean equals(Object other) {
-    	if (!(other instanceof Port)) {
-    		return false;
-    	}
-
-    	Port otherPort = (Port) other;
-
-    	return value == otherPort.value;
-    }
-
-    @Override
-    public int hashCode() {
-    	int hash = 17;
-    	hash += 31 * hash + (int)value; 
-    	return hash;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/Switch.java b/src/main/java/net/onrc/onos/ofcontroller/util/Switch.java
deleted file mode 100644
index f7df223..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/Switch.java
+++ /dev/null
@@ -1,116 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing a Switch.
- * NOTE: Currently this class is (almost) not used.
- */
-public class Switch {
-    /**
-     * The Switch state.
-     */
-    public enum SwitchState {
-	INACTIVE,
-	ACTIVE,
-    }
-
-    private Dpid dpid;			// The DPID of the switch
-    private SwitchState state;		// The state of the switch
-
-    /**
-     * Default constructor.
-     *
-     * NOTE: The default state for the switch is INACTIVE.
-     */
-    public Switch() {
-	this.dpid = new Dpid();
-	this.state = SwitchState.INACTIVE;
-    }
-
-    /**
-     * Constructor for a given DPID.
-     *
-     * 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; }
-
-    /**
-     * Set the DPID.
-     *
-     * @param dpid the DPID to use.
-     */
-    @JsonProperty("dpid")
-    public void setDpid(Dpid dpid) {
-	this.dpid = 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.
-     *
-     * 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/ofcontroller/util/SwitchPort.java b/src/main/java/net/onrc/onos/ofcontroller/util/SwitchPort.java
deleted file mode 100644
index 8912803..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/SwitchPort.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package net.onrc.onos.ofcontroller.util;
-
-import org.codehaus.jackson.annotate.JsonProperty;
-
-/**
- * The class representing a Switch-Port.
- */
-public class SwitchPort {
-    private Dpid dpid;		// The DPID of the switch
-    private Port port;		// The port of the switch
-
-    /**
-     * Default constructor.
-     */
-    public SwitchPort() {
-    }
-
-    /**
-     * Constructor for a given DPID and a port.
-     *
-     * @param dpid the DPID to use.
-     * @param port the port to use.
-     */
-    public SwitchPort(Dpid dpid, Port port) {
-	this.dpid = dpid;
-	this.port = port;
-    }
-
-    /**
-     * Get the DPID value of the Switch-Port.
-     *
-     * @return the DPID value of the Switch-Port.
-     */
-    @JsonProperty("dpid")
-    public Dpid dpid() { return dpid; }
-
-    /**
-     * Set the DPID value of the Switch-Port.
-     *
-     * @param dpid the DPID to use.
-     */
-    @JsonProperty("dpid")
-    public void setDpid(Dpid dpid) {
-	this.dpid = dpid;
-    }
-
-    /**
-     * Get the port value of the Switch-Port.
-     *
-     * @return the port value of the Switch-Port.
-     */
-    @JsonProperty("port")
-    public Port port() { return port; }
-
-    /**
-     * Set the port value of the Switch-Port.
-     *
-     * @param port the port to use.
-     */
-    @JsonProperty("port")
-    public void setPort(Port port) {
-	this.port = port;
-    }
-
-    /**
-     * Set the DPID and port values of the Switch-Port.
-     *
-     * @param dpid the DPID to use.
-     * @param port the port to use.
-     */
-    public void setValue(Dpid dpid, Port port) {
-	this.dpid = dpid;
-	this.port = port;
-    }
-
-    /**
-     * Convert the Switch-Port value to a string.
-     *
-     * The string has the following form:
-     *  01:02:03:04:05:06:07:08/1234
-     *
-     * @return the Switch-Port value as a string.
-     */
-    @Override
-    public String toString() {
-	return this.dpid.toString() + "/" + this.port;
-    }
-    
-
-    @Override
-    public boolean equals(Object other) {
-    	if (!(other instanceof SwitchPort)) {
-    		return false;
-    	}
-
-    	SwitchPort otherSwitchPort = (SwitchPort) other;
-
-    	return (dpid.equals(otherSwitchPort.dpid) &&
-    			port.equals(otherSwitchPort.port));
-    }
-
-    @Override
-    public int hashCode() {
-    	int hash = 17;
-    	hash += 31 * hash + dpid.hashCode();
-    	hash += 31 * hash + port.hashCode();
-    	return hash;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/DpidDeserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/DpidDeserializer.java
deleted file mode 100644
index 695bb1a..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/DpidDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.Dpid;
-
-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 DPID from a string.
- */
-public class DpidDeserializer extends JsonDeserializer<Dpid> {
-
-    protected final static Logger log = LoggerFactory.getLogger(DpidDeserializer.class);
-
-    @Override
-    public Dpid deserialize(JsonParser jp,
-			    DeserializationContext ctxt)
-	throws IOException, JsonProcessingException {
-
-	Dpid dpid = 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);
-		dpid = new Dpid(value);
-	    }
-	}
-	return dpid;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/DpidSerializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/DpidSerializer.java
deleted file mode 100644
index 7ece4d3..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/DpidSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.Dpid;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize a DPID as a string.
- */
-public class DpidSerializer extends JsonSerializer<Dpid> {
-
-    @Override
-    public void serialize(Dpid dpid, JsonGenerator jGen,
-			  SerializerProvider serializer)
-	throws IOException, JsonProcessingException {
-	jGen.writeStartObject();
-	jGen.writeStringField("value", dpid.toString());
-	jGen.writeEndObject();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowEntryIdDeserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowEntryIdDeserializer.java
deleted file mode 100644
index 71b02e0..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowEntryIdDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.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> {
-
-    protected final static 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/ofcontroller/util/serializers/FlowEntryIdSerializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowEntryIdSerializer.java
deleted file mode 100644
index bf73265..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowEntryIdSerializer.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.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/ofcontroller/util/serializers/FlowIdDeserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowIdDeserializer.java
deleted file mode 100644
index e6c46aa..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowIdDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.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> {
-
-    protected final static 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/ofcontroller/util/serializers/FlowIdSerializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowIdSerializer.java
deleted file mode 100644
index 34f6e05..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/FlowIdSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.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/ofcontroller/util/serializers/IPv4Deserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4Deserializer.java
deleted file mode 100644
index ff2238a..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4Deserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv4;
-
-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 an IPv4 address from a string.
- */
-public class IPv4Deserializer extends JsonDeserializer<IPv4> {
-
-    protected final static Logger log = LoggerFactory.getLogger(IPv4Deserializer.class);
-
-    @Override
-    public IPv4 deserialize(JsonParser jp,
-			    DeserializationContext ctxt)
-	throws IOException, JsonProcessingException {
-
-	IPv4 ipv4 = 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);
-		ipv4 = new IPv4(value);
-	    }
-	}
-	return ipv4;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4NetDeserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4NetDeserializer.java
deleted file mode 100644
index edec8ad..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4NetDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv4Net;
-
-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 an IPv4Net address from a string.
- */
-public class IPv4NetDeserializer extends JsonDeserializer<IPv4Net> {
-
-    protected final static Logger log = LoggerFactory.getLogger(IPv4NetDeserializer.class);
-
-    @Override
-    public IPv4Net deserialize(JsonParser jp,
-			       DeserializationContext ctxt)
-	throws IOException, JsonProcessingException {
-
-	IPv4Net ipv4Net = 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);
-		ipv4Net = new IPv4Net(value);
-	    }
-	}
-	return ipv4Net;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4NetSerializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4NetSerializer.java
deleted file mode 100644
index 0454a58..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4NetSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv4Net;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize an IPv4Net address as a string.
- */
-public class IPv4NetSerializer extends JsonSerializer<IPv4Net> {
-
-    @Override
-    public void serialize(IPv4Net ipv4Net, JsonGenerator jGen,
-			  SerializerProvider serializer)
-	throws IOException, JsonProcessingException {
-	jGen.writeStartObject();
-	jGen.writeStringField("value", ipv4Net.toString());
-	jGen.writeEndObject();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4Serializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4Serializer.java
deleted file mode 100644
index aefc8a0..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv4Serializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv4;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize an IPv4 address as a string.
- */
-public class IPv4Serializer extends JsonSerializer<IPv4> {
-
-    @Override
-    public void serialize(IPv4 ipv4, JsonGenerator jGen,
-			  SerializerProvider serializer)
-	throws IOException, JsonProcessingException {
-	jGen.writeStartObject();
-	jGen.writeStringField("value", ipv4.toString());
-	jGen.writeEndObject();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6Deserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6Deserializer.java
deleted file mode 100644
index 6689024..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6Deserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv6;
-
-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 an IPv6 address from a string.
- */
-public class IPv6Deserializer extends JsonDeserializer<IPv6> {
-
-    protected final static Logger log = LoggerFactory.getLogger(IPv6Deserializer.class);
-
-    @Override
-    public IPv6 deserialize(JsonParser jp,
-			    DeserializationContext ctxt)
-	throws IOException, JsonProcessingException {
-
-	IPv6 ipv6 = 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);
-		ipv6 = new IPv6(value);
-	    }
-	}
-	return ipv6;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6NetDeserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6NetDeserializer.java
deleted file mode 100644
index 0d41c21..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6NetDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv6Net;
-
-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 an IPv6Net address from a string.
- */
-public class IPv6NetDeserializer extends JsonDeserializer<IPv6Net> {
-
-    protected final static Logger log = LoggerFactory.getLogger(IPv6NetDeserializer.class);
-
-    @Override
-    public IPv6Net deserialize(JsonParser jp,
-			       DeserializationContext ctxt)
-	throws IOException, JsonProcessingException {
-
-	IPv6Net ipv6Net = 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);
-		ipv6Net = new IPv6Net(value);
-	    }
-	}
-	return ipv6Net;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6NetSerializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6NetSerializer.java
deleted file mode 100644
index 06dc6cf..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6NetSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv6Net;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize an IPv6Net address as a string.
- */
-public class IPv6NetSerializer extends JsonSerializer<IPv6Net> {
-
-    @Override
-    public void serialize(IPv6Net ipv6Net, JsonGenerator jGen,
-			  SerializerProvider serializer)
-	throws IOException, JsonProcessingException {
-	jGen.writeStartObject();
-	jGen.writeStringField("value", ipv6Net.toString());
-	jGen.writeEndObject();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6Serializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6Serializer.java
deleted file mode 100644
index b6709b8..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/IPv6Serializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.onrc.onos.ofcontroller.util.IPv6;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize an IPv6 address as a string.
- */
-public class IPv6Serializer extends JsonSerializer<IPv6> {
-
-    @Override
-    public void serialize(IPv6 ipv6, JsonGenerator jGen,
-			  SerializerProvider serializer)
-	throws IOException, JsonProcessingException {
-	jGen.writeStartObject();
-	jGen.writeStringField("value", ipv6.toString());
-	jGen.writeEndObject();
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java
deleted file mode 100644
index 748749f..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java
+++ /dev/null
@@ -1,236 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.net.Inet4Address;
-import java.net.InetAddress;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashSet;
-
-import net.floodlightcontroller.util.MACAddress;
-import net.onrc.onos.apps.proxyarp.ArpReplyNotification;
-import net.onrc.onos.apps.proxyarp.BroadcastPacketOutNotification;
-import net.onrc.onos.apps.proxyarp.PacketOutNotification;
-import net.onrc.onos.apps.proxyarp.SinglePacketOutNotification;
-import net.onrc.onos.core.intent.ConstrainedShortestPathIntent;
-import net.onrc.onos.core.intent.ErrorIntent;
-import net.onrc.onos.core.intent.Intent;
-import net.onrc.onos.core.intent.IntentOperation;
-import net.onrc.onos.core.intent.IntentOperationList;
-import net.onrc.onos.core.intent.PathIntent;
-import net.onrc.onos.core.intent.ShortestPathIntent;
-import net.onrc.onos.core.intent.runtime.IntentStateList;
-import net.onrc.onos.ofcontroller.devicemanager.OnosDevice;
-import net.onrc.onos.ofcontroller.networkgraph.DeviceEvent;
-import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
-import net.onrc.onos.ofcontroller.networkgraph.Path;
-import net.onrc.onos.ofcontroller.networkgraph.PortEvent;
-import net.onrc.onos.ofcontroller.networkgraph.SwitchEvent;
-import net.onrc.onos.ofcontroller.networkgraph.TopologyEvent;
-import net.onrc.onos.ofcontroller.util.CallerId;
-import net.onrc.onos.ofcontroller.util.DataPath;
-import net.onrc.onos.ofcontroller.util.DataPathEndpoints;
-import net.onrc.onos.ofcontroller.util.Dpid;
-import net.onrc.onos.ofcontroller.util.FlowEntry;
-import net.onrc.onos.ofcontroller.util.FlowEntryAction;
-import net.onrc.onos.ofcontroller.util.FlowEntryActions;
-import net.onrc.onos.ofcontroller.util.FlowEntryErrorState;
-import net.onrc.onos.ofcontroller.util.FlowEntryId;
-import net.onrc.onos.ofcontroller.util.FlowEntryMatch;
-import net.onrc.onos.ofcontroller.util.FlowEntrySwitchState;
-import net.onrc.onos.ofcontroller.util.FlowEntryUserState;
-import net.onrc.onos.ofcontroller.util.FlowId;
-import net.onrc.onos.ofcontroller.util.FlowPath;
-import net.onrc.onos.ofcontroller.util.FlowPathFlags;
-import net.onrc.onos.ofcontroller.util.FlowPathType;
-import net.onrc.onos.ofcontroller.util.FlowPathUserState;
-import net.onrc.onos.ofcontroller.util.IPv4;
-import net.onrc.onos.ofcontroller.util.IPv4Net;
-import net.onrc.onos.ofcontroller.util.IPv6;
-import net.onrc.onos.ofcontroller.util.IPv6Net;
-import net.onrc.onos.ofcontroller.util.Port;
-import net.onrc.onos.ofcontroller.util.Switch;
-// import net.onrc.onos.ofcontroller.util.SwitchPort;
-
-
-
-
-
-
-
-
-
-
-
-
-import com.esotericsoftware.kryo.Kryo;
-
-/**
- * Class factory for allocating Kryo instances for
- * serialization/deserialization of classes.
- */
-public class KryoFactory {
-    private static final int DEFAULT_PREALLOCATIONS = 100;
-    private ArrayList<Kryo> kryoList = new ArrayList<Kryo>();
-
-    /**
-     * Default constructor.
-     *
-     * Preallocates {@code DEFAULT_PREALLOCATIONS} Kryo instances.
-     */
-    public KryoFactory() {
-        this(DEFAULT_PREALLOCATIONS);
-    }
-
-    /**
-     * Constructor to explicitly specify number of Kryo instances to pool
-     *
-     * @param initialCapacity number of Kryo instance to preallocate
-     */
-    public KryoFactory(final int initialCapacity) {
-        // Preallocate
-        kryoList.ensureCapacity(initialCapacity);
-        for (int i = 0; i < initialCapacity; i++) {
-            Kryo kryo = newKryoImpl();
-            kryoList.add(kryo);
-        }
-    }
-
-    /**
-     * Create and initialize a new Kryo object.
-     *
-     * @return the created Kryo object.
-     */
-    public Kryo newKryo() {
-	return newDeleteKryo(null);
-    }
-
-    /**
-     * Delete an existing Kryo object.
-     *
-     * @param deleteKryo the object to delete.
-     */
-    public void deleteKryo(Kryo deleteKryo) {
-	newDeleteKryo(deleteKryo);
-    }
-
-    /**
-     * Create or delete a Kryo object.
-     *
-     * @param deleteKryo if null, then allocate and return a new object,
-     * otherwise delete the provided object.
-     * @return a new Kryo object if needed, otherwise null.
-     */
-    synchronized private Kryo newDeleteKryo(Kryo deleteKryo) {
-	if (deleteKryo != null) {
-	    // Delete an entry by moving it back to the buffer
-	    kryoList.add(deleteKryo);
-	    return null;
-	} else {
-	    Kryo kryo = null;
-	    if (kryoList.isEmpty()) {
-		// Preallocate
-		for (int i = 0; i < 100; i++) {
-		    kryo = newKryoImpl();
-		    kryoList.add(kryo);
-		}
-	    }
-
-	    kryo = kryoList.remove(kryoList.size() - 1);
-	    return kryo;
-	}
-    }
-
-    /**
-     * Create and initialize a new Kryo object.
-     *
-     * @return the created Kryo object.
-     */
-    private Kryo newKryoImpl() {
-	Kryo kryo = new Kryo();
-	kryo.setRegistrationRequired(true);
-	//
-	// WARNING: Order of register() calls affects serialized bytes.
-	//  - Do no insert new entry in the middle, always add to the end.
-	//  - Do not simply remove existing entry
-	//
-
-	// kryo.setReferences(false);
-	//
-	kryo.register(ArrayList.class);
-
-	// FlowPath and related classes
-	kryo.register(CallerId.class);
-	kryo.register(DataPath.class);
-	kryo.register(DataPathEndpoints.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);
-	kryo.register(IPv6Net.class);
-	kryo.register(byte[].class);
-	kryo.register(MACAddress.class);
-	kryo.register(Port.class);
-	kryo.register(Switch.class);
-	// kryo.register(SwitchPort.class);
-
-	// New data model-related classes
-	kryo.register(DeviceEvent.class);
-	kryo.register(InetAddress.class);
-	kryo.register(LinkEvent.class);
-	kryo.register(PortEvent.class);
-	kryo.register(PortEvent.SwitchPort.class);
-	kryo.register(SwitchEvent.class);
-	kryo.register(TopologyEvent.class);
-
-	// Intent-related classes
-	kryo.register(Path.class);
-	kryo.register(Intent.class);
-	kryo.register(Intent.IntentState.class);
-	kryo.register(PathIntent.class);
-	kryo.register(ShortestPathIntent.class);
-	kryo.register(ConstrainedShortestPathIntent.class);
-	kryo.register(ErrorIntent.class);
-	kryo.register(ErrorIntent.ErrorType.class);
-	kryo.register(IntentOperation.class);
-	kryo.register(IntentOperation.Operator.class);
-	kryo.register(IntentOperationList.class);
-	kryo.register(IntentStateList.class);
-
-	// Device-related classes
-	kryo.register(HashSet.class);
-	kryo.register(Inet4Address.class);
-	kryo.register(OnosDevice.class);
-	kryo.register(Date.class);
-
-	// ProxyArp-related classes
-	kryo.register(BroadcastPacketOutNotification.class);
-	kryo.register(SinglePacketOutNotification.class);
-	kryo.register(ArpReplyNotification.class);
-
-	return kryo;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/MACAddressDeserializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/MACAddressDeserializer.java
deleted file mode 100644
index 1436f28..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/MACAddressDeserializer.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.util.MACAddress;
-
-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 MAC address from a string.
- */
-public class MACAddressDeserializer extends JsonDeserializer<MACAddress> {
-
-    protected final static Logger log = LoggerFactory.getLogger(MACAddressDeserializer.class);
-
-    @Override
-    public MACAddress deserialize(JsonParser jp,
-				  DeserializationContext ctxt)
-	throws IOException, JsonProcessingException {
-
-	MACAddress mac = 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);
-		mac = MACAddress.valueOf(value);
-	    }
-	}
-	return mac;
-    }
-}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/MACAddressSerializer.java b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/MACAddressSerializer.java
deleted file mode 100644
index 9c0e225..0000000
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/MACAddressSerializer.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package net.onrc.onos.ofcontroller.util.serializers;
-
-import java.io.IOException;
-
-import net.floodlightcontroller.util.MACAddress;
-
-import org.codehaus.jackson.JsonGenerator;
-import org.codehaus.jackson.JsonProcessingException;
-import org.codehaus.jackson.map.JsonSerializer;
-import org.codehaus.jackson.map.SerializerProvider;
-
-/**
- * Serialize a MAC address as a string.
- */
-public class MACAddressSerializer extends JsonSerializer<MACAddress> {
-
-    @Override
-    public void serialize(MACAddress mac, JsonGenerator jGen,
-			  SerializerProvider serializer)
-	throws IOException, JsonProcessingException {
-	jGen.writeStartObject();
-	jGen.writeStringField("value", mac.toString());
-	jGen.writeEndObject();
-    }
-}
