Renamed devicemanager, flowprogrammer, linkdiscovery and util packages

net.onrc.onos.ofcontroller.devicemanager.* => net.onrc.onos.core.devicemanager.*
net.onrc.onos.ofcontroller.flowprogrammer.* => net.onrc.onos.core.flowprogrammer.*
net.onrc.onos.ofcontroller.linkdiscovery.* => net.onrc.onos.core.linkdiscovery.*
net.onrc.onos.ofcontroller.util.* => net.onrc.onos.core.util.*

Change-Id: Iaa865af552e8fb3a589e73d006569ac79f5a0f08
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();
-    }
-}