diff --git a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDevice.java b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDevice.java
index 546ec64..d94eb1f 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDevice.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/OnosDevice.java
@@ -81,7 +81,8 @@
     // ************
     // Constructors
     // ************
-    
+     protected OnosDevice() {}
+     
     /**
      * Create a new entity
      * 
diff --git a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
index 294e1a5..1eb7750 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/forwarding/Forwarding.java
@@ -6,6 +6,7 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -20,20 +21,27 @@
 import net.floodlightcontroller.util.MACAddress;
 import net.onrc.onos.datagrid.IDatagridService;
 import net.onrc.onos.datagrid.IEventChannel;
+import net.onrc.onos.datagrid.IEventChannelListener;
+import net.onrc.onos.intent.Intent;
+import net.onrc.onos.intent.IntentMap;
+import net.onrc.onos.intent.IntentOperation;
+import net.onrc.onos.intent.IntentOperationList;
+import net.onrc.onos.intent.PathIntent;
+import net.onrc.onos.intent.ShortestPathIntent;
+import net.onrc.onos.intent.Intent.IntentState;
+import net.onrc.onos.intent.runtime.IPathCalcRuntimeService;
+import net.onrc.onos.intent.runtime.IntentStateList;
 import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceService;
 import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService;
+import net.onrc.onos.ofcontroller.networkgraph.Device;
+import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
+import net.onrc.onos.ofcontroller.networkgraph.LinkEvent;
+import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
+import net.onrc.onos.ofcontroller.networkgraph.Switch;
 import net.onrc.onos.ofcontroller.proxyarp.BroadcastPacketOutNotification;
 import net.onrc.onos.ofcontroller.proxyarp.IProxyArpService;
-import net.onrc.onos.ofcontroller.proxyarp.PacketOutNotification;
-import net.onrc.onos.ofcontroller.util.CallerId;
-import net.onrc.onos.ofcontroller.util.DataPath;
 import net.onrc.onos.ofcontroller.util.Dpid;
-import net.onrc.onos.ofcontroller.util.FlowEntry;
-import net.onrc.onos.ofcontroller.util.FlowEntryMatch;
-import net.onrc.onos.ofcontroller.util.FlowId;
 import net.onrc.onos.ofcontroller.util.FlowPath;
-import net.onrc.onos.ofcontroller.util.FlowPathType;
-import net.onrc.onos.ofcontroller.util.FlowPathUserState;
 import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
 import net.onrc.onos.packet.Ethernet;
@@ -54,35 +62,34 @@
 import com.google.common.collect.ListMultimap;
 
 public class Forwarding implements IOFMessageListener, IFloodlightModule,
-									IForwardingService {
+									IForwardingService, IEventChannelListener<Long, IntentStateList> {
 	private final static Logger log = LoggerFactory.getLogger(Forwarding.class);
    
-	private final int IDLE_TIMEOUT = 5; // seconds
-	private final int HARD_TIMEOUT = 0; // seconds
 	private final int SLEEP_TIME_FOR_DB_DEVICE_INSTALLED = 100; // milliseconds
 	private final static int NUMBER_OF_THREAD_FOR_EXECUTOR = 1;
 	
 	private final static ScheduledExecutorService executor = Executors.newScheduledThreadPool(NUMBER_OF_THREAD_FOR_EXECUTOR);
 	
-	private final CallerId callerId = new CallerId("Forwarding");
+	private final String callerId = "Forwarding";
 	
 	private IFloodlightProviderService floodlightProvider;
 	private IFlowPusherService flowPusher;
 	private IDatagridService datagrid;
-	//
-	// TODO: Using PacketOutNotification as both the key and the
-	// value is a hack that should be removed when this module is
-	// refactored.
-	//
-	private IEventChannel<PacketOutNotification, PacketOutNotification> eventChannel;
-	private static final String PACKET_OUT_CHANNEL_NAME = "onos.packet_out";
+
+	private IEventChannel<Long, BroadcastPacketOutNotification> eventChannel;
+	private static final String SINGLE_PACKET_OUT_CHANNEL_NAME = "onos.forwarding.packet_out";
 
 	private IControllerRegistryService controllerRegistryService;
 	
+	private INetworkGraphService networkGraphService;
+	private NetworkGraph networkGraph;
+	private IPathCalcRuntimeService pathRuntime;
+	private IntentMap intentMap;
+	
 	// TODO it seems there is a Guava collection that will time out entries.
 	// We should see if this will work here.
 	private Map<Path, PushedFlow> pendingFlows;
-	private ListMultimap<Long, PacketToPush> waitingPackets;
+	private ListMultimap<String, PacketToPush> waitingPackets;
 	
 	private final Object lock = new Object();
 	
@@ -97,12 +104,12 @@
 	}
 	
 	private class PushedFlow {
-		public final long flowId;
+		public final String intentId;
 		public boolean installed = false;
 		public short firstOutPort;
 		
-		public PushedFlow(long flowId) {
-			this.flowId = flowId;
+		public PushedFlow(String flowId) {
+			this.intentId = flowId;
 		}
 	}
 	
@@ -162,8 +169,11 @@
 				new ArrayList<Class<? extends IFloodlightService>>();
 		dependencies.add(IFloodlightProviderService.class);
 		dependencies.add(IFlowPusherService.class);
+		dependencies.add(IControllerRegistryService.class);	
 		dependencies.add(IOnosDeviceService.class);
-		dependencies.add(IControllerRegistryService.class);
+		dependencies.add(IDatagridService.class);
+		dependencies.add(INetworkGraphService.class);
+		dependencies.add(IPathCalcRuntimeService.class);
 		// We don't use the IProxyArpService directly, but reactive forwarding
 		// requires it to be loaded and answering ARP requests
 		dependencies.add(IProxyArpService.class);
@@ -177,6 +187,8 @@
 		flowPusher = context.getServiceImpl(IFlowPusherService.class);
 		datagrid = context.getServiceImpl(IDatagridService.class);
 		controllerRegistryService = context.getServiceImpl(IControllerRegistryService.class);
+		networkGraphService = context.getServiceImpl(INetworkGraphService.class);
+        pathRuntime = context.getServiceImpl(IPathCalcRuntimeService.class);
 		
 		floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
 
@@ -186,14 +198,13 @@
 	
 	@Override
 	public void startUp(FloodlightModuleContext context) {
-		//
-		// TODO: Using PacketOutNotification as both the key and the
-		// value is a hack that should be removed when this module is
-		// refactored.
-		//
-		eventChannel = datagrid.createChannel(PACKET_OUT_CHANNEL_NAME,
-						      PacketOutNotification.class,
-						      PacketOutNotification.class);
+
+		eventChannel = datagrid.createChannel(SINGLE_PACKET_OUT_CHANNEL_NAME,
+								Long.class,
+						      BroadcastPacketOutNotification.class);
+		networkGraph = networkGraphService.getNetworkGraph();
+		intentMap = pathRuntime.getPathIntents();
+		datagrid.addListener("onos.pathintent_state", this, Long.class, IntentStateList.class);
 	}
 
 	@Override
@@ -248,17 +259,13 @@
 			log.trace("Sending broadcast packet to other ONOS instances");
 		}
 
-		PacketOutNotification key =
+		//We don't use address information, so 0 is put into the third argument.
+		BroadcastPacketOutNotification key =
 		    new BroadcastPacketOutNotification(
 						       eth.serialize(),
-						       null, sw.getId(),
+						       0, sw.getId(),
 						       pi.getInPort());
-		//
-		// TODO: Using PacketOutNotification as both the key and the
-		// value is a hack that should be removed when this module is
-		// refactored.
-		//
-		eventChannel.addTransientEntry(key, key);
+		eventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
 	}
 	
 	private void handlePacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth){
@@ -268,25 +275,18 @@
 				HexString.toHexString(eth.getDestinationMACAddress()); 
 		
 		//FIXME getDeviceByMac() is a blocking call, so it may be better way to handle it to avoid the condition.
-		// TODO: Fix the code below after deviceStorage was removed
-		/*
-		try{	
-			IDeviceObject deviceObject = deviceStorage.getDeviceByMac(
-				destinationMac);
-			if (deviceObject == null) {
-				log.debug("No device entry found for {}",
-						destinationMac);
+		Device deviceObject = networkGraph.getDeviceByMac(MACAddress.valueOf(destinationMac));
 
-				//Device is not in the DB, so wait it until the device is added.
-				executor.schedule(new WaitDeviceArp(sw, pi, eth), SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, TimeUnit.MILLISECONDS);
-				return;
-			}
+		if (deviceObject == null) {
+			log.debug("No device entry found for {}",
+					destinationMac);
 
-			continueHandlePacketIn(sw, pi, eth, deviceObject);
-		} finally {
-			deviceStorage.rollback();
+			//Device is not in the DB, so wait it until the device is added.
+			executor.schedule(new WaitDeviceArp(sw, pi, eth), SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, TimeUnit.MILLISECONDS);
+			return;
 		}
-		*/
+
+		continueHandlePacketIn(sw, pi, eth, deviceObject);
 	}
 	
 	private class WaitDeviceArp implements Runnable {
@@ -303,44 +303,35 @@
 
 		@Override
 		public void run() {
-			// TODO: Fix the code below after deviceStorage was removed
-			/*
-			try {
-				IDeviceObject deviceObject = deviceStorage.getDeviceByMac(HexString.toHexString(eth.getDestinationMACAddress()));
-					if(deviceObject == null){
-						log.debug("wait {}ms and device was not found. Send broadcast packet and the thread finish.", SLEEP_TIME_FOR_DB_DEVICE_INSTALLED);
-						handleBroadcast(sw, pi, eth);
-						return;
-					}
-					log.debug("wait {}ms and device {} was found, continue",SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, deviceObject.getMACAddress());
-					continueHandlePacketIn(sw, pi, eth, deviceObject);
-			} finally {
-				deviceStorage.rollback();
-			}
-			*/
+			Device deviceObject = networkGraph.getDeviceByMac(MACAddress.valueOf(eth.getDestinationMACAddress()));
+				if(deviceObject == null){
+					log.debug("wait {}ms and device was not found. Send broadcast packet and the thread finish.", SLEEP_TIME_FOR_DB_DEVICE_INSTALLED);
+					handleBroadcast(sw, pi, eth);
+					return;
+				}
+				log.debug("wait {}ms and device {} was found, continue",SLEEP_TIME_FOR_DB_DEVICE_INSTALLED, deviceObject.getMacAddress());
+				continueHandlePacketIn(sw, pi, eth, deviceObject);
 		}
 	}
 
-	// TODO: Fix the code below because IDeviceObject was removed
-	/*
-	private void continueHandlePacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth, IDeviceObject deviceObject) {
-		log.debug("Start continuehandlePacketIn");
+	private void continueHandlePacketIn(IOFSwitch sw, OFPacketIn pi, Ethernet eth, Device deviceObject) {
 
-		Iterator<IPortObject> ports = deviceObject.getAttachedPorts().iterator();	
+		log.debug("Start continuehandlePacketIn");
+		
+		//Iterator<IPortObject> ports = deviceObject.getAttachedPorts().iterator();	
+		Iterator<net.onrc.onos.ofcontroller.networkgraph.Port> ports = deviceObject.getAttachmentPoints().iterator();	
 		if (!ports.hasNext()) {
 			log.debug("No attachment point found for device {} - broadcasting packet", 
-					deviceObject.getMACAddress());
+					deviceObject.getMacAddress());
 			handleBroadcast(sw, pi, eth);
 			return;	
 		}
 
-
 		//This code assumes the device has only one port. It should be problem.
-		IPortObject portObject = ports.next();
-
-		short destinationPort = portObject.getNumber();
-		ISwitchObject switchObject = portObject.getSwitch();
-		long destinationDpid = HexString.toLong(switchObject.getDPID());
+		net.onrc.onos.ofcontroller.networkgraph.Port portObject = ports.next();
+		short destinationPort = portObject.getNumber().shortValue();
+		Switch switchObject = portObject.getSwitch();
+		long destinationDpid = switchObject.getDpid();
 		
 		// TODO SwitchPort, Dpid and Port should probably be immutable
 		SwitchPort srcSwitchPort = new SwitchPort(
@@ -351,21 +342,18 @@
 		MACAddress srcMacAddress = MACAddress.valueOf(eth.getSourceMACAddress());
 		MACAddress dstMacAddress = MACAddress.valueOf(eth.getDestinationMACAddress());
 		
-		FlowPath flowPath;
-		
 		synchronized (lock) {
 			//TODO check concurrency
 			Path pathspec = new Path(srcMacAddress, dstMacAddress);	
-			
 			PushedFlow existingFlow = pendingFlows.get(pathspec);
 
 			//A path is installed side by side to reduce a path timeout and a wrong state.
 			if (existingFlow != null) {
 				// We've already start to install a flow for this pair of MAC addresses
 				if(log.isDebugEnabled()) {
-					log.debug("Found existing the same pathspec {}, Flow ID is {}", 
+					log.debug("Found existing the same pathspec {}, intent ID is {}", 
 							pathspec, 
-							HexString.toHexString(existingFlow.flowId));
+							existingFlow.intentId);
 				}
 				
 				OFPacketOut po = constructPacketOut(pi, sw);
@@ -378,42 +366,44 @@
 					// Flow has been sent to the switches so it is safe to
 					// send a packet out now
 
-					//
-					// TODO: The getFlow() call below needs
-					// to be updated to the new Path Intent
-					// framework.
-					//
-					// FlowPath flow = datagrid.getFlow(new FlowId(existingFlow.flowId));
-					FlowPath flow = null;
-					FlowEntry flowEntryForThisSwitch = null;
+					Intent intent = intentMap.getIntent(existingFlow.intentId);
+					PathIntent pathIntent = null;
+					if(intent instanceof PathIntent) {
+						pathIntent = (PathIntent)intent;
+					} else {
+						log.debug("Intent {} is not PathIntent. Return.", intent.getId());
+						return;
+					}
 					
-					if (flow != null) {
-						for (FlowEntry flowEntry : flow.flowEntries()) {
-							if (flowEntry.dpid().equals(new Dpid(sw.getId()))) {
-								flowEntryForThisSwitch = flowEntry;
-								break;
-							}
+					Boolean isflowEntryForThisSwitch = false;		
+					net.onrc.onos.ofcontroller.networkgraph.Path path = pathIntent.getPath();
+
+					for(Iterator<LinkEvent> i = path.iterator(); i.hasNext();) {
+						LinkEvent le = (LinkEvent)i.next();
+						if(le.getSrc().dpid == sw.getId()) {
+							log.debug("src {} dst {}", le.getSrc(), le.getDst());
+							isflowEntryForThisSwitch = true;
+							break;
 						}
 					}
 					
-					if (flowEntryForThisSwitch == null) {
+					if (isflowEntryForThisSwitch == false) {
 						// If we don't find a flow entry for that switch, then we're
 						// in the middle of a rerouting (or something's gone wrong). 
 						// This packet will be dropped as a victim of the rerouting.
-						log.debug("Dropping packet on flow {} between {}-{}, flow path {}",
-								new Object[] {new FlowId(existingFlow.flowId),
-								srcMacAddress, dstMacAddress, flow});
-					}
-					else {
-						log.debug("Sending packet out from sw {}, outport{}", sw, flowEntryForThisSwitch.outPort().value());
-						sendPacketOut(sw, po, flowEntryForThisSwitch.outPort().value());
+						log.debug("Dropping packet on flow {} between {}-{}",
+								existingFlow.intentId,
+								srcMacAddress, dstMacAddress);
+					} else {
+						log.debug("Sending packet out from sw {}, outport{}", sw, existingFlow.firstOutPort);
+						sendPacketOut(sw, po, existingFlow.firstOutPort);
 					}
 				}
 				else {
 					// Flow path has not yet been installed to switches so save the
 					// packet out for later
-					log.debug("Put a packet into the waitng list. flowId {}", Long.toHexString(existingFlow.flowId));
-					waitingPackets.put(existingFlow.flowId, new PacketToPush(po, sw.getId()));
+					log.debug("Put a packet into the waitng list. flowId {}", existingFlow.intentId);
+					waitingPackets.put(existingFlow.intentId, new PacketToPush(po, sw.getId()));
 				}
 				return;
 			}
@@ -421,42 +411,25 @@
 			log.debug("Adding new flow between {} at {} and {} at {}",
 					new Object[]{srcMacAddress, srcSwitchPort, dstMacAddress, dstSwitchPort});
 			
-			DataPath datapath = new DataPath();
-			datapath.setSrcPort(srcSwitchPort);
-			datapath.setDstPort(dstSwitchPort);
-			
-			flowPath = new FlowPath();
-			flowPath.setInstallerId(new CallerId(callerId));
-	
-			flowPath.setFlowPathType(FlowPathType.FP_TYPE_SHORTEST_PATH);
-			flowPath.setFlowPathUserState(FlowPathUserState.FP_USER_ADD);
-			flowPath.setFlowEntryMatch(new FlowEntryMatch());
-			flowPath.setIdleTimeout(IDLE_TIMEOUT);
-			flowPath.setHardTimeout(HARD_TIMEOUT);
-			flowPath.flowEntryMatch().enableSrcMac(srcMacAddress);
-			flowPath.flowEntryMatch().enableDstMac(dstMacAddress);
-			flowPath.flowEntryMatch().enableEthernetFrameType(Ethernet.TYPE_IPv4);
-			flowPath.setDataPath(datapath);
-
-			FlowId flowId = new FlowId(controllerRegistryService.getNextUniqueId());
-			
-			flowPath.setFlowId(flowId);
+			String intentId = callerId + ":" + controllerRegistryService.getNextUniqueId();
+	        IntentOperationList operations = new IntentOperationList();
+	        ShortestPathIntent intent = new ShortestPathIntent(intentId,
+	    			sw.getId(), pi.getInPort(), srcMacAddress.toLong(),
+	    			destinationDpid, destinationPort, dstMacAddress.toLong());
+	        IntentOperation.Operator operator = IntentOperation.Operator.ADD;
+	        operations.add(operator, intent);
+	        pathRuntime.executeIntentOperations(operations);
 
 			OFPacketOut po = constructPacketOut(pi, sw);
 			
 			// Add to waiting lists
-			pendingFlows.put(pathspec, new PushedFlow(flowId.value()));
-			log.debug("Put a Path {} in the pending flow, Flow ID {}", pathspec, flowId);
-			waitingPackets.put(flowId.value(), new PacketToPush(po, sw.getId()));
+			pendingFlows.put(pathspec, new PushedFlow(intentId));
+			log.debug("Put a Path {} in the pending flow, intent ID {}", pathspec, intentId);
+			waitingPackets.put(intentId, new PacketToPush(po, sw.getId()));
 			log.debug("Put a Packet in the wating list. related pathspec {}", pathspec);
+			
 		}
-
-		log.debug("Adding forward {} to {}. Flow ID {}", new Object[] {
-				srcMacAddress, dstMacAddress, flowPath.flowId()});
-		// TODO: Add the flow by using the new Path Intent framework
-		// flowService.addFlow(flowPath);
 	}
-	*/
 
 	private OFPacketOut constructPacketOut(OFPacketIn pi, IOFSwitch sw) {	
 		OFPacketOut po = new OFPacketOut();
@@ -479,94 +452,84 @@
 
 	@Override
 	public void flowsInstalled(Collection<FlowPath> installedFlowPaths) {
-		for (FlowPath flowPath : installedFlowPaths) {
-			flowInstalled(flowPath);
-		}
 	}
 	
 	@Override
 	public void flowRemoved(FlowPath removedFlowPath) {
-		if(log.isDebugEnabled()){
-			log.debug("Flow {} was removed", removedFlowPath.flowId());
+	}
+	
+	public void flowRemoved(PathIntent removedIntent) {
+		if(log.isTraceEnabled()){
+			log.trace("Path {} was removed", removedIntent.getParentIntent().getId());
 		}
 
-
-		if (!removedFlowPath.installerId().equals(callerId)) {
-			// Not our flow path, ignore
-			return;
-		}
-
-		MACAddress srcMacAddress = removedFlowPath.flowEntryMatch().srcMac();
-		MACAddress dstMacAddress = removedFlowPath.flowEntryMatch().dstMac();
-		
+		ShortestPathIntent spfIntent = (ShortestPathIntent) removedIntent.getParentIntent();
+		MACAddress srcMacAddress = MACAddress.valueOf(spfIntent.getSrcMac());
+		MACAddress dstMacAddress = MACAddress.valueOf(spfIntent.getDstMac());
 		Path removedPath = new Path(srcMacAddress, dstMacAddress);
 		
 		synchronized (lock) {
 			// There *shouldn't* be any packets queued if the flow has 
 			// just been removed. 
-			List<PacketToPush> packets = waitingPackets.removeAll(removedFlowPath.flowId().value());
+			List<PacketToPush> packets = waitingPackets.removeAll(spfIntent.getId());
 			if (!packets.isEmpty()) {
-				log.warn("Removed flow {} has packets queued.",  removedFlowPath.flowId());
+				log.warn("Removed flow {} has packets queued.",  spfIntent.getId());
 			}
 			pendingFlows.remove(removedPath);
-			log.debug("Removed from the pendingFlow: Path {}, Flow ID {}", removedPath, removedFlowPath.flowId());
+			log.debug("Removed from the pendingFlow: Path {}, Flow ID {}", removedPath, spfIntent.getId());
 		}
 	}
-
-	private void flowInstalled(FlowPath installedFlowPath) {	
-		log.debug("Flow {} was installed", installedFlowPath.flowId());
-		
-		if (!installedFlowPath.installerId().equals(callerId)) {
-			// Not our flow path, ignore
-			return;
-		}	
-
-		if(installedFlowPath.flowEntries().isEmpty()){
-			//If there is no flowEntry, ignore
-			log.warn("There is no flowEntry in the installedFlowPath id {}.return.", installedFlowPath.flowId());
-			return;
+	
+	private void flowInstalled(PathIntent installedPath) {	
+		if(log.isTraceEnabled()){
+			log.trace("Path {} was installed", installedPath.getParentIntent().getId());
 		}
 		
-		MACAddress srcMacAddress = installedFlowPath.flowEntryMatch().srcMac();
-		MACAddress dstMacAddress = installedFlowPath.flowEntryMatch().dstMac();
-		Path installedPath = new Path(srcMacAddress, dstMacAddress);
+		ShortestPathIntent spfIntent = (ShortestPathIntent) installedPath.getParentIntent();
+		MACAddress srcMacAddress = MACAddress.valueOf(spfIntent.getSrcMac());
+		MACAddress dstMacAddress = MACAddress.valueOf(spfIntent.getDstMac());
+		Path path = new Path(srcMacAddress, dstMacAddress);
+		log.debug("Path spec {}", path);
 		
 		// TODO waiting packets should time out. We could request a path that
 		// can't be installed right now because of a network partition. The path
 		// may eventually be installed, but we may have received thousands of 
 		// packets in the meantime and probably don't want to send very old packets.
 		
-		List<PacketToPush> packets;
-		Short outPort = installedFlowPath.flowEntries().get(0).outPort().value();
-
-		PushedFlow existingFlow;
+		List<PacketToPush> packets = null;
+		net.onrc.onos.ofcontroller.networkgraph.Path graphPath = installedPath.getPath();
+		
+		log.debug("path{}", graphPath);
+		Short outPort = graphPath.get(0).getSrc().getNumber().shortValue();
+	
+		PushedFlow existingFlow = null;
 		
 		synchronized (lock) {
-			existingFlow = pendingFlows.get(installedPath);
+			existingFlow = pendingFlows.get(path);
 
 			if (existingFlow != null) {
 			    existingFlow.installed = true;
 			    existingFlow.firstOutPort = outPort;
 			} else {
-				log.debug("ExistingFlow {} is null", installedPath);
+				log.debug("ExistingFlow {} is null", path);
 				return;
 			}
 
 			//Check both existing flow are installed status.
 			if(existingFlow.installed){
-				packets = waitingPackets.removeAll(existingFlow.flowId);
+				packets = waitingPackets.removeAll(existingFlow.intentId);
 				if(log.isDebugEnabled()){
 					log.debug("removed my packets {} to push from waitingPackets. outPort {} size {}",
-							Long.toHexString(existingFlow.flowId), existingFlow.firstOutPort, packets.size());
+							existingFlow.intentId, existingFlow.firstOutPort, packets.size());
 				}
 			}else{
 				log.debug("Forward or reverse flows hasn't been pushed yet. return");	
 				return;
 			}
 		}
-
+		
 		for (PacketToPush packet : packets) {
-			log.debug("Start packetToPush to sw {}, outPort {}", packet.dpid, existingFlow.firstOutPort);
+			log.debug("Start packetToPush to sw {}, outPort {}, path {}", packet.dpid, existingFlow.firstOutPort, path);
 			IOFSwitch sw = floodlightProvider.getSwitches().get(packet.dpid);
 			sendPacketOut(sw, packet.packet, existingFlow.firstOutPort);
 		}
@@ -581,4 +544,47 @@
 		flowPusher.add(sw, po);
 	}
 
+	@Override
+	public void entryAdded(IntentStateList value) {
+		entryUpdated(value);
+		
+	}
+
+	@Override
+	public void entryRemoved(IntentStateList value) {
+		//no-op
+	}
+
+	@Override
+	public void entryUpdated(IntentStateList value) {
+		for (Entry<String, IntentState> entry: value.entrySet()) {
+			log.debug("path intent key {}, value {}", entry.getKey(), entry.getValue());
+			PathIntent pathIntent = (PathIntent) intentMap.getIntent(entry.getKey());
+			if (pathIntent == null)
+				continue;
+			
+			if (!(pathIntent.getParentIntent() instanceof ShortestPathIntent))
+				continue;
+
+			IntentState state = entry.getValue();
+			switch (state) {
+				case INST_REQ:
+					break;
+				case INST_ACK:
+					flowInstalled(pathIntent);
+					break;
+				case INST_NACK:
+					break;
+				case DEL_REQ:
+					break;
+				case DEL_ACK:
+					flowRemoved(pathIntent);
+					break;
+				case DEL_PENDING:
+					break;
+				default:
+					break;
+				}
+		}
+	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java
index 48d04e0..081101e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ArpReplyNotification.java
@@ -1,7 +1,6 @@
 package net.onrc.onos.ofcontroller.proxyarp;
 
 import java.io.Serializable;
-import java.net.InetAddress;
 
 import net.floodlightcontroller.util.MACAddress;
 
@@ -13,15 +12,16 @@
 
     private static final long serialVersionUID = 1L;
 
-    private InetAddress targetAddress;
+    private int targetAddress;
     private MACAddress targetMacAddress;
 
+    protected ArpReplyNotification() {}
     /**
      * Class constructor.
      * @param targetAddress IP address received from the ARP reply
      * @param targetMacAddress MAC address received from the ARP reply
      */
-    public ArpReplyNotification(InetAddress targetAddress,
+    public ArpReplyNotification(int targetAddress,
             MACAddress targetMacAddress) {
         this.targetAddress = targetAddress;
         this.targetMacAddress = targetMacAddress;
@@ -31,7 +31,7 @@
      * Returns the IP address of the ARP reply.
      * @return the IP address
      */
-    public InetAddress getTargetAddress() {
+    public int getTargetAddress() {
         return targetAddress;
     }
 
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java
index 22fe965..387414b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/BroadcastPacketOutNotification.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.ofcontroller.proxyarp;
 
-import java.net.InetAddress;
+
 
 // TODO This class is too generic to be handled by ProxyArpService.
 // TODO The generic broadcast packet shouldn't contain an IP address which is
@@ -16,10 +16,16 @@
 
     private static final long serialVersionUID = 1L;
 
-    private final InetAddress address;
+    private final int address;
     private final long inSwitch;
     private final short inPort;
 
+    protected BroadcastPacketOutNotification() {
+    	super();
+        this.address = -1;
+        this.inSwitch = -1;
+        this.inPort = -1;
+    }
     /**
      * Class constructor.
      *
@@ -32,7 +38,7 @@
      * @param inPort
      *        port number of the receiving port
      */
-    public BroadcastPacketOutNotification(byte[] packet, InetAddress address,
+    public BroadcastPacketOutNotification(byte[] packet, int address,
             long inSwitch, short inPort) {
         super(packet);
 
@@ -40,7 +46,7 @@
         this.inSwitch = inSwitch;
         this.inPort = inPort;
     }
-
+    
     /**
      * Get the dpid of the switch the packet was received on.
      *
@@ -65,7 +71,7 @@
      * @return the target IP address for ARP packets, or null if the packet is
      *         not an ARP packet
      */
-    public InetAddress getTargetAddress() {
+    public int getTargetAddress() {
         return address;
     }
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java
index a201939..fb550cb 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/PacketOutNotification.java
@@ -8,16 +8,20 @@
  * abstract base class that will be subclassed by specific types of
  * notifications.
  */
-public abstract class PacketOutNotification implements Serializable {
+public abstract class PacketOutNotification implements Serializable{
 
     private static final long serialVersionUID = 1L;
 
     protected final byte[] packet;
-
+    
     /**
      * Class constructor.
      * @param packet the packet data to send in the packet-out
      */
+    public PacketOutNotification() {
+    	packet = null;
+    }
+    
     public PacketOutNotification(byte[] packet) {
         this.packet = packet;
     }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
index d235c37..942194b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -2,6 +2,7 @@
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -26,7 +27,14 @@
 import net.onrc.onos.datagrid.IEventChannelListener;
 import net.onrc.onos.ofcontroller.bgproute.Interface;
 import net.onrc.onos.ofcontroller.core.config.IConfigInfoService;
+import net.onrc.onos.ofcontroller.devicemanager.IOnosDeviceService;
 import net.onrc.onos.ofcontroller.flowprogrammer.IFlowPusherService;
+import net.onrc.onos.ofcontroller.networkgraph.Device;
+import net.onrc.onos.ofcontroller.networkgraph.INetworkGraphService;
+import net.onrc.onos.ofcontroller.networkgraph.NetworkGraph;
+import net.onrc.onos.ofcontroller.networkgraph.Switch;
+import net.onrc.onos.ofcontroller.util.Dpid;
+import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
 import net.onrc.onos.packet.ARP;
 import net.onrc.onos.packet.Ethernet;
@@ -58,91 +66,135 @@
 
     private IFloodlightProviderService floodlightProvider;
     private IDatagridService datagrid;
-    private IEventChannel<PacketOutNotification, PacketOutNotification> packetOutEventChannel;
-    private IEventChannel<ArpReplyNotification, ArpReplyNotification> arpReplyEventChannel;
-    private static final String PACKET_OUT_CHANNEL_NAME = "onos.packet_out";
+    private IEventChannel<Long, ArpReplyNotification> arpReplyEventChannel;
+    private IEventChannel<Long, BroadcastPacketOutNotification> broadcastPacketOutEventChannel;
+    private IEventChannel<Long, SinglePacketOutNotification> singlePacketOutEventChannel;
     private static final String ARP_REPLY_CHANNEL_NAME = "onos.arp_reply";
-    private PacketOutEventHandler packetOutEventHandler =
-	new PacketOutEventHandler();
-    private ArpReplyEventHandler arpReplyEventHandler =
-	new ArpReplyEventHandler();
+    private static final String BROADCAST_PACKET_OUT_CHANNEL_NAME = "onos.broadcast_packet_out";
+    private static final String SINGLE_PACKET_OUT_CHANNEL_NAME = "onos.single_packet_out";
+    private ArpReplyEventHandler arpReplyEventHandler = new ArpReplyEventHandler();
+    private BroadcastPacketOutEventHandler broadcastPacketOutEventHandler = new BroadcastPacketOutEventHandler();  
+    private SinglePacketOutEventHandler singlePacketOutEventHandler = new SinglePacketOutEventHandler();
 
     private IConfigInfoService configService;
     private IRestApiService restApi;
     private IFlowPusherService flowPusher;
+    
+	private INetworkGraphService networkGraphService;
+	private NetworkGraph networkGraph;
+	private IOnosDeviceService onosDeviceService;
 
     private short vlan;
     private static final short NO_VLAN = 0;
 
     private SetMultimap<InetAddress, ArpRequest> arpRequests;
 
-    //
-    // TODO: Using PacketOutNotification as both the key and the
-    // value is a hack that should be removed when this module is
-    // refactored.
-    //
-    private class PacketOutEventHandler implements
-	IEventChannelListener<PacketOutNotification, PacketOutNotification> {
-	@Override
-	public void entryAdded(PacketOutNotification packetOutNotification) {
-	    if (packetOutNotification instanceof SinglePacketOutNotification) {
-		SinglePacketOutNotification notification =
-		    (SinglePacketOutNotification) packetOutNotification;
-		sendArpRequestOutPort(notification.packet,
-				      notification.getOutSwitch(),
-				      notification.getOutPort());
+    private class BroadcastPacketOutEventHandler implements
+    IEventChannelListener<Long, BroadcastPacketOutNotification> {
 
-		// set timestamp
-		InetAddress addr = notification.getTargetAddress();
-		if (addr != null) {
-		    for (ArpRequest request : arpRequests.get(addr)) {
-			request.setRequestTime();
-		    }
+		@Override
+		public void entryAdded(BroadcastPacketOutNotification value) {
+			if(log.isTraceEnabled()) {
+				log.trace("entryAdded ip{}, sw {}, port {}, packet {}", value.getTargetAddress(), value.getInSwitch(), value.getInPort(), value.packet.length);
+			}
+			BroadcastPacketOutNotification notification = (BroadcastPacketOutNotification) value;
+			broadcastArpRequestOutMyEdge(notification.packet,
+						     notification.getInSwitch(),
+						     notification.getInPort());
+		
+			// set timestamp
+			ByteBuffer buffer = ByteBuffer.allocate(4);
+			buffer.putInt(notification.getTargetAddress());
+			InetAddress addr = null;
+			try {
+				addr = InetAddress.getByAddress(buffer.array());
+			} catch (UnknownHostException e) {
+				log.error("Exception:", e);
+			}
+			
+			if (addr != null) {
+			    for (ArpRequest request : arpRequests.get(addr)) {
+			    	request.setRequestTime();
+			    }
+			}			
 		}
-	    } else if (packetOutNotification instanceof BroadcastPacketOutNotification) {
-		BroadcastPacketOutNotification notification =
-		    (BroadcastPacketOutNotification) packetOutNotification;
-		broadcastArpRequestOutMyEdge(notification.packet,
-					     notification.getInSwitch(),
-					     notification.getInPort());
-
-		// set timestamp
-		InetAddress addr = notification.getTargetAddress();
-		if (addr != null) {
-		    for (ArpRequest request : arpRequests.get(addr)) {
-			request.setRequestTime();
-		    }
+		
+		@Override
+		public void entryUpdated(BroadcastPacketOutNotification value) {
+			log.debug("entryUpdated");
+		    // TODO: For now, entryUpdated() is processed as entryAdded()
+		    entryAdded(value);
 		}
-	    } else {
-		log.warn("Unknown packet out notification received");
-	    }
-	}
-
-	@Override
-	public void entryUpdated(PacketOutNotification packetOutNotification) {
-	    // TODO: For now, entryUpdated() is processed as entryAdded()
-	    entryAdded(packetOutNotification);
-	}
-
-	@Override
-	public void entryRemoved(PacketOutNotification packetOutNotification) {
-	    // TODO: Not implemented. Revisit when this module is refactored
-	}
+		
+		@Override
+		public void entryRemoved(BroadcastPacketOutNotification value) {
+			log.debug("entryRemoved");
+		    // TODO: Not implemented. Revisit when this module is refactored
+		}
+    }
+    
+    private class SinglePacketOutEventHandler implements
+		IEventChannelListener<Long, SinglePacketOutNotification> {
+		@Override
+		public void entryAdded(SinglePacketOutNotification packetOutNotification) {
+			log.debug("entryAdded");
+			SinglePacketOutNotification notification =
+			    (SinglePacketOutNotification) packetOutNotification;
+			sendArpRequestOutPort(notification.packet,
+					      notification.getOutSwitch(),
+					      notification.getOutPort());
+	
+			// set timestamp
+			ByteBuffer buffer = ByteBuffer.allocate(4);
+			buffer.putInt(notification.getTargetAddress());
+			InetAddress addr = null;
+			try {
+				addr = InetAddress.getByAddress(buffer.array());
+			} catch (UnknownHostException e) {
+				log.error("Exception:", e);
+			}
+			
+			if (addr != null) {
+			    for (ArpRequest request : arpRequests.get(addr)) {
+			    	request.setRequestTime();
+			    }
+			}		
+		}
+	
+		@Override
+		public void entryUpdated(SinglePacketOutNotification packetOutNotification) {
+			log.debug("entryUpdated");
+		    // TODO: For now, entryUpdated() is processed as entryAdded()
+		    entryAdded(packetOutNotification);
+		}
+	
+		@Override
+		public void entryRemoved(SinglePacketOutNotification packetOutNotification) {
+			log.debug("entryRemoved");
+		    // TODO: Not implemented. Revisit when this module is refactored
+		}
     }
 
-    //
-    // TODO: Using ArpReplyNotification as both the key and the
-    // value is a hack that should be removed when this module is
-    // refactored.
-    //
     private class ArpReplyEventHandler implements
-	IEventChannelListener<ArpReplyNotification, ArpReplyNotification> {
+	IEventChannelListener<Long, ArpReplyNotification> {
+    	
 	@Override
 	public void entryAdded(ArpReplyNotification arpReply) {
-	    log.debug("Received ARP reply notification for {}",
-		      arpReply.getTargetAddress());
-	    sendArpReplyToWaitingRequesters(arpReply.getTargetAddress(),
-					    arpReply.getTargetMacAddress());
+	    log.debug("Received ARP reply notification for ip {}, mac {}",
+	    		arpReply.getTargetAddress(), arpReply.getTargetMacAddress());
+		ByteBuffer buffer = ByteBuffer.allocate(4);
+		buffer.putInt(arpReply.getTargetAddress());
+		InetAddress addr = null;
+		try {
+			addr = InetAddress.getByAddress(buffer.array());
+		} catch (UnknownHostException e) {
+			log.error("Exception:", e);
+		}
+	   
+		if(addr != null) {
+			sendArpReplyToWaitingRequesters(addr,
+				    arpReply.getTargetMacAddress());
+		}
 	}
 
 	@Override
@@ -209,6 +261,10 @@
             ProxyArpManager.this.sendArpReply(arpRequest, dpid, port,
                     macAddress);
         }
+        
+		public ARP getArpRequest() {
+			return arpRequest;
+		}
     }
 
     @Override
@@ -236,17 +292,20 @@
         dependencies.add(IDatagridService.class);
         dependencies.add(IConfigInfoService.class);
         dependencies.add(IFlowPusherService.class);
+        dependencies.add(INetworkGraphService.class);
+        dependencies.add(IOnosDeviceService.class);
         return dependencies;
     }
 
     @Override
     public void init(FloodlightModuleContext context) {
-        this.floodlightProvider = context
-                .getServiceImpl(IFloodlightProviderService.class);
-        this.datagrid = context.getServiceImpl(IDatagridService.class);
+        this.floodlightProvider = context.getServiceImpl(IFloodlightProviderService.class); 
         this.configService = context.getServiceImpl(IConfigInfoService.class);
         this.restApi = context.getServiceImpl(IRestApiService.class);
+        this.datagrid = context.getServiceImpl(IDatagridService.class);
         this.flowPusher = context.getServiceImpl(IFlowPusherService.class);
+        this.networkGraphService = context.getServiceImpl(INetworkGraphService.class);
+        this.onosDeviceService = context.getServiceImpl(IOnosDeviceService.class);
 
         // arpCache = new ArpCache();
 
@@ -262,22 +321,24 @@
 
         restApi.addRestletRoutable(new ArpWebRoutable());
         floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this);
-
+		networkGraph = networkGraphService.getNetworkGraph();
+		
 	//
 	// Event notification setup: channels and event handlers
-	//
-	//
-	// TODO: Using PacketOutNotification or ArpReplyNotification as both
-	// the key and the value is a hack that should be removed when this
-	// module is refactored.
-	//
-	packetOutEventChannel = datagrid.addListener(PACKET_OUT_CHANNEL_NAME,
-						     packetOutEventHandler,
-						     PacketOutNotification.class,
-						     PacketOutNotification.class);
+	//	
+	broadcastPacketOutEventChannel = datagrid.addListener(BROADCAST_PACKET_OUT_CHANNEL_NAME,
+			     broadcastPacketOutEventHandler,
+			     Long.class,
+			     BroadcastPacketOutNotification.class);
+	
+	singlePacketOutEventChannel = datagrid.addListener(SINGLE_PACKET_OUT_CHANNEL_NAME,
+			     singlePacketOutEventHandler,
+			     Long.class,
+			     SinglePacketOutNotification.class);
+	
 	arpReplyEventChannel = datagrid.addListener(ARP_REPLY_CHANNEL_NAME,
 						    arpReplyEventHandler,
-						    ArpReplyNotification.class,
+						    Long.class,
 						    ArpReplyNotification.class);
 
         Timer arpTimer = new Timer("arp-processing");
@@ -313,19 +374,17 @@
                     log.debug("Cleaning expired ARP request for {}", entry
                             .getKey().getHostAddress());
 
-                    // If the ARP request is expired and then delete the device
-                    // TODO check whether this is OK from this thread
-                    // TODO: Fix the code below after deviceStorage was removed
-                    /*
-                    IDeviceObject targetDevice =
-                    		deviceStorage.getDeviceByIP(InetAddresses.coerceToInteger(entry.getKey()));
-                    if (targetDevice != null) {
-                    	deviceStorage.removeDevice(targetDevice);
-                    	if (log.isDebugEnabled()) {
-                    		log.debug("RemoveDevice: {} due to no have not recieve the ARP reply", targetDevice);
-                    	}
-                    }
-                    */
+					// If the ARP request is expired and then delete the device
+					// TODO check whether this is OK from this thread
+					HostArpRequester requester = (HostArpRequester) request.requester;
+					ARP req = requester.getArpRequest();
+					Device targetDev = networkGraph.getDeviceByMac(MACAddress.valueOf(req.getTargetHardwareAddress()));
+					if(targetDev != null) {
+						onosDeviceService.deleteOnosDeviceByMac(MACAddress.valueOf(req.getTargetHardwareAddress()));
+						if (log.isDebugEnabled()) {
+							log.debug("RemoveDevice: {} due to no have not recieve the ARP reply", targetDev.getMacAddress());
+						}
+					}
 
                     it.remove();
 
@@ -434,90 +493,79 @@
 
         // MACAddress macAddress = arpCache.lookup(target);
 
-        arpRequests.put(
-                target,
-                new ArpRequest(new HostArpRequester(arp, sw.getId(), pi
-                        .getInPort()), false));
+		arpRequests.put(target, new ArpRequest(
+				new HostArpRequester(arp, sw.getId(), pi.getInPort()), false));
+		
+		Device targetDevice = networkGraph.getDeviceByMac(MACAddress.valueOf(arp.getTargetHardwareAddress()));
 
-        // TODO: Fix the code below after deviceStorage was removed
-        /*
-        IDeviceObject targetDevice =
-        		deviceStorage.getDeviceByIP(InetAddresses.coerceToInteger(target));
-        */
+		if (targetDevice == null) {
+			if (log.isTraceEnabled()) {
+				log.trace("No device info found for {} - broadcasting",
+						target.getHostAddress());
+			}
+			
+			// We don't know the device so broadcast the request out
+			BroadcastPacketOutNotification key =
+					new BroadcastPacketOutNotification(eth.serialize(),
+							ByteBuffer.wrap(arp.getTargetProtocolAddress()).getInt(), sw.getId(), pi.getInPort());
+			log.debug("broadcastPacketOutEventChannel mac {}, ip {}, dpid {}, port {}, paket {}", eth.getSourceMAC().toLong(), 
+					ByteBuffer.wrap(arp.getTargetProtocolAddress()).getInt(), sw.getId(), pi.getInPort(), eth.serialize().length);
+			broadcastPacketOutEventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
+		}
+		else {
+			// Even if the device exists in our database, we do not reply to
+			// the request directly, but check whether the device is still valid
+			MACAddress macAddress = MACAddress.valueOf(arp.getTargetHardwareAddress());
 
-        // TODO: Fix the code below after deviceStorage was removed
-        /*
-        if (targetDevice == null) {
-        	if (log.isTraceEnabled()) {
-        		log.trace("No device info found for {} - broadcasting",
-        				target.getHostAddress());
-        	}
+			if (log.isTraceEnabled()) {
+				log.trace("The target Device Record in DB is: {} => {} from ARP request host at {}/{}",
+						new Object [] {
+						inetAddressToString(arp.getTargetProtocolAddress()),
+						macAddress,
+						HexString.toHexString(sw.getId()), pi.getInPort()});
+			}
 
-        	// We don't know the device so broadcast the request out
-		PacketOutNotification key =
-		    new BroadcastPacketOutNotification(eth.serialize(),
-        					target, sw.getId(),
-						pi.getInPort());
-        	packetOutEventChannel.addTransientEntry(key, key);
-        }
-        else {
-        	// Even if the device exists in our database, we do not reply to
-        	// the request directly, but check whether the device is still valid
-        	MACAddress macAddress = MACAddress.valueOf(targetDevice.getMACAddress());
+			// sendArpReply(arp, sw.getId(), pi.getInPort(), macAddress);
 
-        	if (log.isTraceEnabled()) {
-        		log.trace("The target Device Record in DB is: {} => {} from ARP request host at {}/{}",
-        				new Object [] {
-        				inetAddressToString(arp.getTargetProtocolAddress()),
-        				macAddress,
-        				HexString.toHexString(sw.getId()), pi.getInPort()});
-        	}
+			Iterable<net.onrc.onos.ofcontroller.networkgraph.Port> outPorts = targetDevice.getAttachmentPoints();
 
-        	// sendArpReply(arp, sw.getId(), pi.getInPort(), macAddress);
+			if (!outPorts.iterator().hasNext()){
+				if (log.isTraceEnabled()) {
+					log.trace("Device {} exists but is not connected to any ports" + 
+							" - broadcasting", macAddress);
+				}
+				
+//				BroadcastPacketOutNotification key =
+//						new BroadcastPacketOutNotification(eth.serialize(), 
+//								target, sw.getId(), pi.getInPort());
+//				broadcastPacketOutEventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
+			} 
+			else {
+				for (net.onrc.onos.ofcontroller.networkgraph.Port portObject : outPorts) {
+					//long outSwitch = 0;
+					//short outPort = 0;
 
-        	Iterable<IPortObject> outPorts = targetDevice.getAttachedPorts();
-
-        	if (!outPorts.iterator().hasNext()){
-        		if (log.isTraceEnabled()) {
-        			log.trace("Device {} exists but is not connected to any ports" +
-        					" - broadcasting", macAddress);
-        		}
-			PacketOutNotification key =
-			    new BroadcastPacketOutNotification(eth.serialize(),
-					target, sw.getId(),
-					pi.getInPort());
-			packetOutEventChannel.addTransientEntry(key, key);
-        	}
-        	else {
-        		for (IPortObject portObject : outPorts) {
-        			//long outSwitch = 0;
-        			//short outPort = 0;
-
-        			// if (!portObject.getLinkedPorts().iterator().hasNext()) {
-        			//	outPort = portObject.getNumber();
-        			// }
-        			if (portObject.getLinkedPorts().iterator().hasNext()) {
-        				continue;
-        			}
-
-        			short outPort = portObject.getNumber();
-        			ISwitchObject outSwitchObject = portObject.getSwitch();
-        			long outSwitch = HexString.toLong(outSwitchObject.getDPID());
-
-        			if (log.isTraceEnabled()) {
-        				log.trace("Probing device {} on port {}/{}",
-        						new Object[] {macAddress,
-        						HexString.toHexString(outSwitch), outPort});
-        			}
-
-				PacketOutNotification key =
-        				new SinglePacketOutNotification(eth.serialize(),
-						target, outSwitch, outPort);
-				packetOutEventChannel.addTransientEntry(key, key);
-        		}
-        	}
-        }
-        */
+					if(portObject.getOutgoingLink() != null || portObject.getIncomingLink() != null) {
+						continue;
+					}
+					
+					short outPort = portObject.getNumber().shortValue();
+					Switch outSwitchObject = portObject.getSwitch();
+					long outSwitch = outSwitchObject.getDpid();
+					
+					if (log.isTraceEnabled()) {
+						log.trace("Probing device {} on port {}/{}", 
+								new Object[] {macAddress, 
+								HexString.toHexString(outSwitch), outPort});
+					}
+					
+					SinglePacketOutNotification key =
+						    new SinglePacketOutNotification(eth.serialize(), 
+						    		ByteBuffer.wrap(target.getAddress()).getInt(), outSwitch, outPort);
+					singlePacketOutEventChannel.addTransientEntry(eth.getDestinationMAC().toLong(), key);
+				}
+			}
+		}
     }
 
     // Not used because device manager currently updates the database
@@ -613,16 +661,15 @@
         }
 
         // sendArpRequestToSwitches(ipAddress, eth.serialize());
-	PacketOutNotification key =
-	    new SinglePacketOutNotification(eth.serialize(), ipAddress,
-					    intf.getDpid(), intf.getPort());
-	packetOutEventChannel.addTransientEntry(key, key);
+		SinglePacketOutNotification key =
+		    new SinglePacketOutNotification(eth.serialize(), ByteBuffer.wrap(ipAddress.getAddress()).getInt(),
+						    intf.getDpid(), intf.getPort());
+		singlePacketOutEventChannel.addTransientEntry(MACAddress.valueOf(senderMacAddress).toLong(), key);
     }
-
-    private void sendArpRequestToSwitches(InetAddress dstAddress,
-            byte[] arpRequest) {
-        sendArpRequestToSwitches(dstAddress, arpRequest, 0,
-                OFPort.OFPP_NONE.getValue());
+    
+    private void sendArpRequestToSwitches(InetAddress dstAddress, byte[] arpRequest) {
+    		sendArpRequestToSwitches(dstAddress, arpRequest, 0,
+    		OFPort.OFPP_NONE.getValue());
     }
 
     private void sendArpRequestToSwitches(InetAddress dstAddress,
@@ -672,9 +719,10 @@
 
         MACAddress mac = new MACAddress(arp.getSenderHardwareAddress());
 
-	ArpReplyNotification key =
-	    new ArpReplyNotification(targetAddress, mac);
-	arpReplyEventChannel.addTransientEntry(key, key);
+		ArpReplyNotification key =
+		    new ArpReplyNotification(ByteBuffer.wrap(targetAddress.getAddress()).getInt(), mac);
+		log.debug("ArpReplyNotification ip {}, mac{}", ByteBuffer.wrap(targetAddress.getAddress()).getInt(), mac);
+		arpReplyEventChannel.addTransientEntry(mac.toLong(), key);
     }
 
     private void broadcastArpRequestOutMyEdge(byte[] arpRequest, long inSwitch,
@@ -689,30 +737,27 @@
 
             List<OFAction> actions = new ArrayList<OFAction>();
 
-            // TODO: Fix the code below after topoSwitchService was removed
-            /*
-            Iterable<IPortObject> ports
-            	= topoSwitchService.getPortsOnSwitch(sw.getStringId());
-            if (ports == null) {
-            	continue;
-            }
-
-            for (IPortObject portObject : ports) {
-            	if (!portObject.getLinkedPorts().iterator().hasNext()) {
-            		short portNumber = portObject.getNumber();
-
-            		if (sw.getId() == inSwitch && portNumber == inPort) {
-            			// This is the port that the ARP message came in,
-            			// so don't broadcast out this port
-            			continue;
-            		}
-
-            		switchPorts.add(new SwitchPort(new Dpid(sw.getId()),
-            				new Port(portNumber)));
-            		actions.add(new OFActionOutput(portNumber));
-            	}
-            }
-            */
+			Switch graphSw = networkGraph.getSwitch(sw.getId());
+			Collection<net.onrc.onos.ofcontroller.networkgraph.Port> ports = graphSw.getPorts();
+			
+			if (ports == null) {
+				continue;
+			}
+			
+			for (net.onrc.onos.ofcontroller.networkgraph.Port portObject : ports) {
+				if (portObject.getOutgoingLink() == null && portObject.getNumber() > 0) {
+					Long portNumber = portObject.getNumber();
+					
+					if (sw.getId() == inSwitch && portNumber.shortValue() == inPort) {
+						// This is the port that the ARP message came in,
+						// so don't broadcast out this port
+						continue;
+					}		
+					switchPorts.add(new SwitchPort(new Dpid(sw.getId()), 
+							new net.onrc.onos.ofcontroller.util.Port(portNumber.shortValue())));
+					actions.add(new OFActionOutput(portNumber.shortValue()));
+				}
+			}
 
             po.setActions(actions);
             short actionsLength = (short) (actions.size() * OFActionOutput.MINIMUM_LENGTH);
@@ -853,31 +898,6 @@
         return new ArrayList<String>();
     }
 
-    /*
-    @Override
-    public void arpRequestNotification(ArpMessage arpMessage) {
-    	log.debug("Received ARP notification from other instances");
-
-    	switch (arpMessage.getType()){
-    	case REQUEST:
-    		if(arpMessage.getOutSwitch() == -1 || arpMessage.getOutPort() == -1){
-    			broadcastArpRequestOutMyEdge(arpMessage.getPacket(),
-    					arpMessage.getInSwitch(), arpMessage.getInPort());
-    		}else{
-    			sendArpRequestOutPort(arpMessage.getPacket(),arpMessage.getOutSwitch(),arpMessage.getOutPort());
-    			log.debug("OutSwitch in ARP request message is: {}; " +
-    			"OutPort in ARP request message is: {}",arpMessage.getOutSwitch(),arpMessage.getOutPort());
-    		}
-    		break;
-    	case REPLY:
-    		log.debug("Received ARP reply notification for {}",
-    				arpMessage.getAddress());
-    		sendArpReplyToWaitingRequesters(arpMessage.getAddress(),arpMessage.getMAC());
-    		break;
-    	}
-    }
-    */
-
     private void sendArpReplyToWaitingRequesters(InetAddress address,
             MACAddress mac) {
         log.debug("Sending ARP reply for {} to requesters",
@@ -899,6 +919,7 @@
             }
         }
 
+        //TODO here, comment outed from long time ago. I will check if we need it later.
         /*IDeviceObject deviceObject = deviceStorage.getDeviceByIP(
         		InetAddresses.coerceToInteger(address));
 
@@ -912,4 +933,4 @@
             request.dispatchReply(address, mac);
         }
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java
index ab9a9b5..62d8086 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/SinglePacketOutNotification.java
@@ -1,6 +1,6 @@
 package net.onrc.onos.ofcontroller.proxyarp;
 
-import java.net.InetAddress;
+
 
 // TODO This class is too generic to be handled by ProxyArpService.
 /**
@@ -10,7 +10,7 @@
 
     private static final long serialVersionUID = 1L;
 
-    private final InetAddress address;
+    private final int address;
     private final long outSwitch;
     private final short outPort;
 
@@ -21,7 +21,7 @@
      * @param outSwitch the dpid of the switch to send the packet on
      * @param outPort the port number of the port to send the packet out
      */
-    public SinglePacketOutNotification(byte[] packet, InetAddress address,
+    public SinglePacketOutNotification(byte[] packet, int address,
             long outSwitch, short outPort) {
         super(packet);
 
@@ -51,7 +51,7 @@
      * @return the target IP address for ARP packets, or null if the packet is
      *         not an ARP packet
      */
-    public InetAddress getTargetAddress() {
+    public int getTargetAddress() {
         return address;
     }
 }
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
index 42a3a4d..9425b7e 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/util/serializers/KryoFactory.java
@@ -3,7 +3,9 @@
 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.intent.ConstrainedShortestPathIntent;
 import net.onrc.onos.intent.ErrorIntent;
@@ -13,12 +15,17 @@
 import net.onrc.onos.intent.PathIntent;
 import net.onrc.onos.intent.ShortestPathIntent;
 import net.onrc.onos.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.proxyarp.ArpReplyNotification;
+import net.onrc.onos.ofcontroller.proxyarp.BroadcastPacketOutNotification;
+import net.onrc.onos.ofcontroller.proxyarp.PacketOutNotification;
+import net.onrc.onos.ofcontroller.proxyarp.SinglePacketOutNotification;
 import net.onrc.onos.ofcontroller.util.CallerId;
 import net.onrc.onos.ofcontroller.util.DataPath;
 import net.onrc.onos.ofcontroller.util.DataPathEndpoints;
@@ -47,6 +54,12 @@
 
 
 
+
+
+
+
+
+
 import com.esotericsoftware.kryo.Kryo;
 
 /**
@@ -208,6 +221,13 @@
 	// 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;
     }
