diff --git a/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java b/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
index cd4fa0d..22a564b 100644
--- a/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
+++ b/src/main/java/net/onrc/onos/core/devicemanager/OnosDeviceManager.java
@@ -42,173 +42,174 @@
 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;
+        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 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;
+    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;
+    private class OnosDeviceUpdate implements IUpdate {
+        private OnosDevice device;
+        private OnosDeviceUpdateType type;
 
-		public OnosDeviceUpdate(OnosDevice device, OnosDeviceUpdateType type) {
-			this.device = device;
-			this.type = 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 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 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 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 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;
+    @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);
+            Ethernet eth = IFloodlightProviderService.bcStore.
+                    get(cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD);
 
-			return processPacketIn(sw, pi, eth);
-		}
+            return processPacketIn(sw, pi, eth);
+        }
 
-		return Command.CONTINUE;
-	}
+        return Command.CONTINUE;
+    }
 
-	private Command processPacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth) {
-        long dpid =sw.getId();
+    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;
+        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 ((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;
+        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());
+        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);
-			        	}
-			        }
+    //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);
-		     }
-		}
-	}
+                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
@@ -223,9 +224,9 @@
         } else if (eth.getPayload() instanceof IPv4) {
             IPv4 ipv4 = (IPv4) eth.getPayload();
             if (ipv4.getPayload() instanceof UDP) {
-                UDP udp = (UDP)ipv4.getPayload();
+                UDP udp = (UDP) ipv4.getPayload();
                 if (udp.getPayload() instanceof DHCP) {
-                    DHCP dhcp = (DHCP)udp.getPayload();
+                    DHCP dhcp = (DHCP) udp.getPayload();
                     if (dhcp.getOpCode() == DHCP.OPCODE_REPLY) {
                         return ipv4.getSourceAddress();
                     }
@@ -237,14 +238,15 @@
 
     /**
      * 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
+     * @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) {
+                                                 long swdpid,
+                                                 short port) {
         byte[] dlAddrArr = eth.getSourceMACAddress();
         long dlAddr = Ethernet.toLong(dlAddrArr);
 
@@ -255,106 +257,106 @@
         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());
+                ((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 Collection<Class<? extends IFloodlightService>> getModuleServices() {
+        List<Class<? extends IFloodlightService>> services =
+                new ArrayList<Class<? extends IFloodlightService>>();
+        services.add(IOnosDeviceService.class);
+        return services;
+    }
 
     @Override
-	public void deleteOnosDevice(OnosDevice dev) {
-	    Long mac = dev.getMacAddress().toLong();
-	    eventChannel.removeEntry(mac);
-	    floodlightProvider.publishUpdate(new OnosDeviceUpdate(dev, OnosDeviceUpdateType.DELETE));
-	}
-    
+    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 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));
-	}
+    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 entryAdded(OnosDevice dev) {
-	    Long mac = dev.getMacAddress().toLong();
-	    mapDevice.put(mac, dev);
-	    log.debug("Device added: device mac {}", mac);
-	}
+    @Override
+    public void init(FloodlightModuleContext context)
+            throws FloodlightModuleException {
+        floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class);
+        executor.scheduleAtFixedRate(new CleanDevice(), 30, CLEANUP_SECOND, TimeUnit.SECONDS);
 
-	@Override
-	public void entryRemoved(OnosDevice dev) {
-	    Long mac = dev.getMacAddress().toLong();
-	    mapDevice.remove(mac);
-	    log.debug("Device removed: device mac {}", mac);
-	}
+        deviceListeners = new CopyOnWriteArrayList<IOnosDeviceListener>();
+        datagrid = context.getServiceImpl(IDatagridService.class);
+        networkGraphService = context.getServiceImpl(INetworkGraphService.class);
+        networkGraph = networkGraphService.getNetworkGraph();
+    }
 
-	@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 startUp(FloodlightModuleContext context) {
+        floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
+        eventChannel = datagrid.addListener(DEVICE_CHANNEL_NAME, this,
+                Long.class,
+                OnosDevice.class);
+    }
 
-	@Override
-	public void addOnosDeviceListener(IOnosDeviceListener listener) {
-		deviceListeners.add(listener);
-	}
+    @Override
+    public void deleteOnosDevice(OnosDevice dev) {
+        Long mac = dev.getMacAddress().toLong();
+        eventChannel.removeEntry(mac);
+        floodlightProvider.publishUpdate(new OnosDeviceUpdate(dev, OnosDeviceUpdateType.DELETE));
+    }
 
-	@Override
-	public void deleteOnosDeviceListener(IOnosDeviceListener listener) {
-		deviceListeners.remove(listener);
-	}
+    @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);
+    }
 }
