diff --git a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpPeer.java b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpPeer.java
index 7425a07..e98c3e8 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpPeer.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpPeer.java
@@ -2,8 +2,6 @@
 
 import java.net.InetAddress;
 
-import net.floodlightcontroller.util.MACAddress;
-
 import org.codehaus.jackson.annotate.JsonProperty;
 
 import com.google.common.net.InetAddresses;
@@ -11,7 +9,6 @@
 public class BgpPeer {
 	private String interfaceName;
 	private InetAddress ipAddress;
-	private MACAddress macAddress;
 	
 	public String getInterfaceName() {
 		return interfaceName;
@@ -30,13 +27,4 @@
 	public void setIpAddress(String ipAddress) {
 		this.ipAddress = InetAddresses.forString(ipAddress);
 	}
-	
-	public MACAddress getMacAddress() {
-		return macAddress;
-	}
-	
-	@JsonProperty("macAddress")
-	public void setMacAddress(String macAddress) {
-		this.macAddress = MACAddress.valueOf(macAddress);
-	}
 }
diff --git a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
index 7ceb3f3..9936cb7 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/bgproute/BgpRoute.java
@@ -126,8 +126,6 @@
 	protected ArrayList<LDUpdate> linkUpdates;
 	protected SingletonTask topologyChangeDetectorTask;
 	
-	//protected HashMap<InetAddress, RibUpdate> prefixesWaitingOnArp;
-	//protected HashMap<InetAddress, PathUpdate> pathsWaitingOnArp;
 	protected SetMultimap<InetAddress, RibUpdate> prefixesWaitingOnArp;
 	protected SetMultimap<InetAddress, PathUpdate> pathsWaitingOnArp;
 	
@@ -406,6 +404,7 @@
 
 	}
 	
+	//TODO once the Ptree is object oriented this can go
 	private String getPrefixFromPtree(PtreeNode node){
         InetAddress address = null;
         try {
@@ -466,7 +465,6 @@
 			
 			node.rib = rib;
 			
-			//prefixAdded(node);
 			addPrefixFlows(p, rib);
 		} 
 	}
@@ -495,7 +493,6 @@
 		node.rib = update.getRibEntry();
 
 		//Push flows for the new <prefix, nexthop>
-		//prefixAdded(node);
 		addPrefixFlows(prefix, update.getRibEntry());
 	}
 	
@@ -512,16 +509,12 @@
 		 * in a non-null node with a null rib. Only a non-null node with a non-null
 		 * rib is an actual prefix in the Ptree.
 		 */
-		//if (node != null && node.rib != null){
-			//prefixDeleted(node);
-		//}
 
 		if (node != null && node.rib != null) {
 			if (update.getRibEntry().equals(node.rib)) {
 				node.rib = null;
 				ptree.delReference(node);
 				
-				//prefixDeleted(update);
 				deletePrefixFlows(update.getPrefix());
 			}
 		}
@@ -529,23 +522,16 @@
 	
 	//TODO compatibility layer, used by beginRouting()
 	public void prefixAdded(PtreeNode node) {
-		//String strPrefix = getPrefixFromPtree(node);
-		
 		Prefix prefix = null;
 		try {
 			prefix = new Prefix(node.key, node.rib.masklen);
 		} catch (UnknownHostException e) {
 			log.error(" ", e);
 		}
-		
-		//RibUpdate update = new RibUpdate(Operation.UPDATE, prefix, node.rib);
-		
-		//addPrefixFlows(update);
-		
+
 		addPrefixFlows(prefix, node.rib);
 	}
 
-	//private void addPrefixFlows(RibUpdate update) {
 	private void addPrefixFlows(Prefix prefix, Rib rib) {
 		if (!topologyReady){
 			return;
@@ -557,8 +543,6 @@
 		//to protect against the prefix getting deleted while where trying to add it
 
 		log.debug("New prefix {} added, next hop {}, routerId {}", 
-				//new Object[] {update.getPrefix(), update.getRibEntry().nextHop.getHostAddress(), 
-				//update.getRibEntry().routerId.getHostAddress()});
 				new Object[] {prefix, rib.nextHop.getHostAddress(),
 				rib.routerId.getHostAddress()});
 		
@@ -567,7 +551,6 @@
 		//mac address is by learning. 
 		//The next hop is not necessarily the peer, and the peer's attachment
 		//point is not necessarily the next hop's attachment point.
-		//BgpPeer peer = bgpPeers.get(update.getRibEntry().nextHop);
 		BgpPeer peer = bgpPeers.get(rib.nextHop);
 		
 		if (peer == null){
@@ -577,7 +560,6 @@
 			//The other scenario is this is a route server route. In that
 			//case the next hop is not in our configuration
 			log.error("Couldn't find next hop router in router {} in config",
-					//update.getRibEntry().nextHop.getHostAddress());
 					rib.nextHop.getHostAddress());
 			return; //just quit out here? This is probably a configuration error
 		}
@@ -632,13 +614,8 @@
 	        match.setDataLayerType(Ethernet.TYPE_IPv4);
 	        match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_TYPE);
 	        
-	        //match.setDataLayerSource(ingressRouter.getRouterMac().toBytes());
-	        //match.setDataLayerSource(peer.getMacAddress().toBytes());
-	        //match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_SRC);
-
 	        InetAddress address = null;
 	        try {
-	        	//address = InetAddress.getByAddress(update.getPrefix().getAddress());
 	        	address = InetAddress.getByAddress(prefix.getAddress());
 			} catch (UnknownHostException e1) {
 				//Should never happen is the reverse conversion has already been done
@@ -646,16 +623,13 @@
 				return;
 			}
 	        
-	        //match.setFromCIDR(address.getHostAddress() + "/" + node.rib.masklen, OFMatch.STR_NW_DST);
 	        match.setFromCIDR(address.getHostAddress() + "/" + 
-	        		//update.getPrefix().getPrefixLength(), OFMatch.STR_NW_DST);
 	        		prefix.getPrefixLength(), OFMatch.STR_NW_DST);
 	        fm.setMatch(match);
 	        
 	        //Set up MAC rewrite action
 	        OFActionDataLayerDestination macRewriteAction = new OFActionDataLayerDestination();
 	        //TODO the peer's mac address is not necessarily the next hop's...
-	        //macRewriteAction.setDataLayerAddress(peer.getMacAddress().toBytes());
 	        macRewriteAction.setDataLayerAddress(peerMacAddress);
 	        
 	        //Set up output action
@@ -680,7 +654,6 @@
             }
             
             //TODO if prefix Added/Deleted are synchronized this shouldn't have to be
-            //pushedFlows.put(update.getPrefix(), new PushedFlowMod(sw.getId(), fm));
             pushedFlows.put(prefix, new PushedFlowMod(sw.getId(), fm));
             
             List<OFMessage> msglist = new ArrayList<OFMessage>();
@@ -696,27 +669,19 @@
 	
 	//TODO test next-hop changes
 	//TODO check delete/add synchronization
-	
-	/*
-	private void prefixDeleted(RibUpdate update) {
-		deletePrefix(update.getPrefix());
-	}
-	*/
 		
 	private void deletePrefixFlows(Prefix prefix) {
 		if (!topologyReady) {
 			return;
 		}
 		
-		//log.debug("In prefixDeleted for {}", update.getPrefix());
-		log.debug("In prefixDeleted for {}", prefix);
+		log.debug("In deletePrefixFlows for {}", prefix);
 		
 		/*for (Map.Entry<Prefix, PushedFlowMod> entry : pushedFlows.entries()) {
 			log.debug("Pushed flow: {} => {}", entry.getKey(), entry.getValue());
 		}*/
 		
 		Collection<PushedFlowMod> pushedFlowMods 
-				//= pushedFlows.removeAll(update.getPrefix());
 				= pushedFlows.removeAll(prefix);
 		
 		for (PushedFlowMod pfm : pushedFlowMods) {
@@ -750,86 +715,6 @@
 		}
 	}
 	
-	/*public void prefixDeleted(PtreeNode node) {
-		if (!topologyReady) {
-			return;
-		}
-		
-		String prefix = getPrefixFromPtree(node);
-		
-		log.debug("Prefix {} deleted, next hop {}", 
-				prefix, node.rib.nextHop.toString());
-		
-		//Remove MAC rewriting flows from other border switches
-		BgpPeer peer = bgpPeers.get(node.rib.nextHop);
-		if (peer == null){
-			//either a router server route or local route. Can't handle right now
-			return;
-		}
-		
-		Interface peerInterface = interfaces.get(peer.getInterfaceName());
-		
-		for (Interface srcInterface : interfaces.values()) {
-			if (srcInterface == peerInterface) {
-				continue;
-			}
-			
-			//Set up the flow mod
-			OFFlowMod fm =
-	                (OFFlowMod) floodlightProvider.getOFMessageFactory()
-	                                              .getMessage(OFType.FLOW_MOD);
-			
-	        fm.setIdleTimeout((short)0)
-	        .setHardTimeout((short)0)
-	        .setBufferId(OFPacketOut.BUFFER_ID_NONE)
-	        .setCookie(MAC_RW_COOKIE)
-	        .setCommand(OFFlowMod.OFPFC_DELETE)
-	        .setOutPort(OFPort.OFPP_NONE)
-	        .setPriority(SDNIP_PRIORITY)
-	        .setLengthU(OFFlowMod.MINIMUM_LENGTH);
-	        		//+ OFActionDataLayerDestination.MINIMUM_LENGTH
-	        		//+ OFActionOutput.MINIMUM_LENGTH);
-	        
-	        OFMatch match = new OFMatch();
-	        match.setDataLayerType(Ethernet.TYPE_IPv4);
-	        match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_TYPE);
-	        
-	        //match.setDataLayerSource(ingressRouter.getRouterMac().toBytes());
-	        //match.setDataLayerSource(peer.getMacAddress().toBytes());
-	        //match.setWildcards(match.getWildcards() & ~OFMatch.OFPFW_DL_SRC);
-	        
-	        InetAddress address = null;
-	        try {
-				address = InetAddress.getByAddress(node.key);
-			} catch (UnknownHostException e1) {
-				//Should never happen is the reverse conversion has already been done
-				log.error("Malformed IP address");
-				return;
-			}
-	        
-	        match.setFromCIDR(address.getHostAddress() + "/" + node.rib.masklen, OFMatch.STR_NW_DST);
-	        fm.setMatch(match);
-	        
-	        //Write to switch
-	        IOFSwitch sw = floodlightProvider.getSwitches()
-	        		.get(srcInterface.getDpid());
-	        
-            if (sw == null){
-            	log.warn("Switch not found when pushing flow mod");
-            	continue;
-            }
-            
-            List<OFMessage> msglist = new ArrayList<OFMessage>();
-            msglist.add(fm);
-            try {
-				sw.write(msglist, null);
-				sw.flush();
-			} catch (IOException e) {
-				log.error("Failure writing flow mod", e);
-			}
-		}
-	}*/
-	
 	/*
 	 * On startup we need to calculate a full mesh of paths between all gateway
 	 * switches
@@ -877,7 +762,6 @@
 				return; // just quit here?
 			}
 			
-			//install flows
 			installPath(shortestPath.flowEntries(), dstMacAddress);
 		}
 	}
@@ -1083,7 +967,7 @@
 		Set<RibUpdate> prefixesToPush = prefixesWaitingOnArp.removeAll(ipAddress);
 		
 		for (RibUpdate update : prefixesToPush) {
-			//These must always be adds
+			//These will always be adds
 			log.debug("Pushing prefix {} next hop {}", update.getPrefix(), 
 					update.getRibEntry().nextHop.getHostAddress());
 			addPrefixFlows(update.getPrefix(), update.getRibEntry());
diff --git a/src/main/java/net/onrc/onos/ofcontroller/bgproute/PathUpdate.java b/src/main/java/net/onrc/onos/ofcontroller/bgproute/PathUpdate.java
index 61d50a4..1d2a47b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/bgproute/PathUpdate.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/bgproute/PathUpdate.java
@@ -9,25 +9,14 @@
 
 public class PathUpdate {
 
-	//private Set<Interface> srcInterfaces;
 	private Interface dstInterface;
 	private InetAddress dstIpAddress;
 	
-	public PathUpdate(//Collection<Interface> srcInterfaces, 
-			Interface dstInterface, InetAddress dstIpAddress) {
+	public PathUpdate(Interface dstInterface, InetAddress dstIpAddress) {
 		this.dstInterface = dstInterface;
 		this.dstIpAddress = dstIpAddress;
-
-		//this.srcInterfaces = new HashSet<Interface>(srcInterfaces.size());
-		//for (Interface intf : srcInterfaces) {
-		//	this.srcInterfaces.add(intf);
-		//}
 	}
 
-	//public Set<Interface> getSrcInterfaces() {
-	//	return Collections.unmodifiableSet(srcInterfaces);
-	//}
-
 	public Interface getDstInterface() {
 		return dstInterface;
 	}
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 112fb98..f56934d 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -43,26 +43,22 @@
 	
 	private final long ARP_ENTRY_TIMEOUT = 600000; //ms (== 10 mins)
 	
-	private final long ARP_REQUEST_TIMEOUT_THREAD_PERIOD = 60000; //ms (== 1 min) 
+	private final long ARP_TIMER_PERIOD = 60000; //ms (== 1 min) 
 			
 	protected IFloodlightProviderService floodlightProvider;
 	protected ITopologyService topology;
 	protected IDeviceService devices;
 	
 	protected Map<InetAddress, ArpTableEntry> arpTable;
-	
-	//protected ConcurrentHashMap<InetAddress, Set<ArpRequest>> arpRequests;
-	//protected ConcurrentHashMap<InetAddress, ArpRequest> arpRequests;
+
 	protected SetMultimap<InetAddress, ArpRequest> arpRequests;
 	
 	private class ArpRequest {
-		//private Set<IArpRequester> requesters;
 		private IArpRequester requester;
 		private boolean retry;
 		private long requestTime;
 		
 		public ArpRequest(IArpRequester requester, boolean retry){
-			//this.requesters = new HashSet<IArpRequester>();
 			this.requester = requester;
 			this.retry = retry;
 			this.requestTime = System.currentTimeMillis();
@@ -74,13 +70,6 @@
 			this.requestTime = System.currentTimeMillis();
 		}
 		
-		/*
-		public synchronized void addRequester(IArpRequester requester){
-			requestTime = System.currentTimeMillis();
-			requesters.add(requester);
-		}
-		*/
-		
 		public boolean isExpired() {
 			return (System.currentTimeMillis() - requestTime) 
 					> IProxyArpService.ARP_REQUEST_TIMEOUT;
@@ -94,11 +83,6 @@
 			log.debug("Dispatching reply for {} to {}", ipAddress.getHostAddress(), 
 					requester);
 			requester.arpResponse(ipAddress, replyMacAddress);
-			/*
-			for (IArpRequester requester : requesters){
-				requester.arpResponse(ipAddress, replyMacAddress);
-			}
-			*/
 		}
 	}
 	
@@ -109,100 +93,68 @@
 		this.devices = devices;
 		
 		arpTable = new HashMap<InetAddress, ArpTableEntry>();
-		//arpRequests = new ConcurrentHashMap<InetAddress, Set<ArpRequest>>();
-		//arpRequests = new ConcurrentHashMap<InetAddress, ArpRequest>();
+
 		arpRequests = Multimaps.synchronizedSetMultimap(
 				HashMultimap.<InetAddress, ArpRequest>create());
 		
-		Timer arpRequestTimeoutTimer = new Timer();
-		arpRequestTimeoutTimer.scheduleAtFixedRate(new TimerTask() {
+		Timer arpTimer = new Timer();
+		arpTimer.scheduleAtFixedRate(new TimerTask() {
 			@Override
 			public void run() {
-				/*
-				synchronized (arpRequests) {
-					log.debug("Current have {} outstanding requests", 
-							arpRequests.size());
-					
-					Iterator<Map.Entry<InetAddress, ArpRequest>> it 
-							= arpRequests.entrySet().iterator();
-					
-					while (it.hasNext()){
-						Map.Entry<InetAddress, ArpRequest> entry
-								= it.next();
-						
-						if (entry.getValue().isExpired()){
-							log.debug("Cleaning expired ARP request for {}", 
-									entry.getKey().getHostAddress());
-							it.remove();
-						}
-					}
-				}
-				*/
-				
-				//List<ArpRequest> retryList = new ArrayList<ArpRequest>();
-				SetMultimap<InetAddress, ArpRequest> retryList 
-						= HashMultimap.<InetAddress, ArpRequest>create();
-				
-				//Have to synchronize externally on the Multimap while using an iterator.
-				//But because we're using a synchronizedMultiMap we don't have to
-				//synchronize when adding.
-				synchronized (arpRequests) {
-					log.debug("Current have {} outstanding requests", 
-							arpRequests.size());
-					
-					Iterator<Map.Entry<InetAddress, ArpRequest>> it 
-						= arpRequests.entries().iterator();
-					
-					while (it.hasNext()) {
-						Map.Entry<InetAddress, ArpRequest> entry
-								= it.next();
-						ArpRequest request = entry.getValue();
-						if (request.isExpired()) {
-							log.debug("Cleaning expired ARP request for {}", 
-									entry.getKey().getHostAddress());
-							//TODO retry here? Caller should specify whether we retry or not
-							//because we obviously won't retry received packets, only
-							//requests from other app modules.
-							it.remove();
-							
-							//retryList.add(new ArpRequest(request));
-							if (request.shouldRetry()) {
-								retryList.put(entry.getKey(), request);
-							}
-						}
-					}
-				}
-				
-				for (Map.Entry<InetAddress, Collection<ArpRequest>> entry 
-						: retryList.asMap().entrySet()) {
-					
-					InetAddress address = entry.getKey();
-					
-					log.debug("Resending ARP request for {}", address.getHostAddress());
-					
-					sendArpRequestForAddress(address);
-					
-					for (ArpRequest request : entry.getValue()) {
-						arpRequests.put(address, new ArpRequest(request));
-					}
-				}
+				doPeriodicArpProcessing();
 			}
-		}, 0, ARP_REQUEST_TIMEOUT_THREAD_PERIOD);
+		}, 0, ARP_TIMER_PERIOD);
 	}
 	
-	private void storeRequester(InetAddress address, IArpRequester requester, 
-			boolean retry) {
-		arpRequests.put(address, new ArpRequest(requester, retry));
-		/*
+	/*
+	 * Function that runs periodically to manage the asynchronous request mechanism.
+	 * It basically cleans up old ARP requests if we don't get a response for them.
+	 * The caller can designate that a request should be retried indefinitely, and
+	 * this task will handle that as well.
+	 */
+	private void doPeriodicArpProcessing() {
+		SetMultimap<InetAddress, ArpRequest> retryList 
+				= HashMultimap.<InetAddress, ArpRequest>create();
+
+		//Have to synchronize externally on the Multimap while using an iterator,
+		//even though it's a synchronizedMultimap
 		synchronized (arpRequests) {
-			if (arpRequests.get(address) == null) {
-				arpRequests.put(address, new ArpRequest());
+			log.debug("Current have {} outstanding requests", 
+					arpRequests.size());
+			
+			Iterator<Map.Entry<InetAddress, ArpRequest>> it 
+				= arpRequests.entries().iterator();
+			
+			while (it.hasNext()) {
+				Map.Entry<InetAddress, ArpRequest> entry
+						= it.next();
+				ArpRequest request = entry.getValue();
+				if (request.isExpired()) {
+					log.debug("Cleaning expired ARP request for {}", 
+							entry.getKey().getHostAddress());
+		
+					it.remove();
+					
+					if (request.shouldRetry()) {
+						retryList.put(entry.getKey(), request);
+					}
+				}
 			}
-			ArpRequest request = arpRequests.get(address);
-							
-			request.addRequester(requester);
 		}
-		*/
+		
+		for (Map.Entry<InetAddress, Collection<ArpRequest>> entry 
+				: retryList.asMap().entrySet()) {
+			
+			InetAddress address = entry.getKey();
+			
+			log.debug("Resending ARP request for {}", address.getHostAddress());
+			
+			sendArpRequestForAddress(address);
+			
+			for (ArpRequest request : entry.getValue()) {
+				arpRequests.put(address, new ArpRequest(request));
+			}
+		}
 	}
 	
 	@Override
@@ -270,9 +222,6 @@
 				return;
 			}
 			
-			//storeRequester(target, new HostArpRequester(this, arp, sw.getId(), 
-			//		pi.getInPort()));
-			
 			boolean shouldBroadcastRequest = false;
 			synchronized (arpRequests) {
 				if (!arpRequests.containsKey(target)) {
@@ -290,7 +239,6 @@
 		else {
 			//We know the address, so send a reply
 			log.debug("Sending reply of {}", MACAddress.valueOf(mac).toString());
-			//sendArpReply(arp, pi, mac, sw);
 			sendArpReply(arp, sw.getId(), pi.getInPort(), mac);
 		}
 	}
@@ -322,32 +270,6 @@
 				request.dispatchReply(addr, arp.getSenderHardwareAddress());
 			}
 		}
-		/*
-		ArpRequest request = null;
-		synchronized (arpRequests) {
-			request = arpRequests.get(addr);
-			if (request != null) {
-				arpRequests.remove(addr);
-			}
-		}
-		if (request != null && !request.isExpired()) {
-			request.dispatchReply(addr, arp.getSenderHardwareAddress());
-		}
-		*/
-		
-		/*
-		Set<ArpRequest> requests = arpRequests.get(addr);
-		if (requests != null){
-			
-			synchronized (requests) {
-				for (ArpRequest request : requests) {
-					if (!request.isExpired()){
-						request.getRequester().arpResponse(
-								arp.getSenderHardwareAddress());
-					}
-				}
-			}
-		}*/
 	}
 
 	private synchronized byte[] lookupArpTable(byte[] ipAddress){
@@ -429,7 +351,6 @@
 		broadcastArpRequestOutEdge(eth.serialize(), 0, OFPort.OFPP_NONE.getValue());
 	}
 	
-	//private void broadcastArpRequestOutEdge(OFPacketIn pi, long inSwitch, short inPort){
 	private void broadcastArpRequestOutEdge(byte[] arpRequest, long inSwitch, short inPort) {
 		for (IOFSwitch sw : floodlightProvider.getSwitches().values()){
 			Collection<Short> enabledPorts = sw.getEnabledPortNumbers();
@@ -457,7 +378,7 @@
 				}
 				
 				actions.add(new OFActionOutput(portNum));
-				log.debug("Broadcasting out {}/{}", HexString.toHexString(sw.getId()), portNum);
+				//log.debug("Broadcasting out {}/{}", HexString.toHexString(sw.getId()), portNum);
 			}
 			
 			po.setActions(actions);
@@ -479,14 +400,12 @@
 	}
 	
 	public void sendArpReply(ARP arpRequest, long dpid, short port, byte[] targetMac) {
-	//private void sendArpReply(ARP arpRequest, OFPacketIn pi, byte[] macRequested, IOFSwitch sw){
 		ARP arpReply = new ARP();
 		arpReply.setHardwareType(ARP.HW_TYPE_ETHERNET)
 			.setProtocolType(ARP.PROTO_TYPE_IP)
 			.setHardwareAddressLength((byte)Ethernet.DATALAYER_ADDRESS_LENGTH)
 			.setProtocolAddressLength((byte)4) //can't find the constant anywhere
 			.setOpCode(ARP.OP_REPLY)
-			//.setSenderHardwareAddress(macRequested)
 			.setSenderHardwareAddress(targetMac)
 			.setSenderProtocolAddress(arpRequest.getTargetProtocolAddress())
 			.setTargetHardwareAddress(arpRequest.getSenderHardwareAddress())
@@ -494,13 +413,11 @@
 		
 		Ethernet eth = new Ethernet();
 		eth.setDestinationMACAddress(arpRequest.getSenderHardwareAddress())
-			//.setSourceMACAddress(macRequested)
 			.setSourceMACAddress(targetMac)
 			.setEtherType(Ethernet.TYPE_ARP)
 			.setPayload(arpReply);
 		
 		List<OFAction> actions = new ArrayList<OFAction>();
-		//actions.add(new OFActionOutput(pi.getInPort()));
 		actions.add(new OFActionOutput(port));
 		
 		OFPacketOut po = new OFPacketOut();
@@ -552,14 +469,8 @@
 	@Override
 	public void sendArpRequest(InetAddress ipAddress, IArpRequester requester,
 			boolean retry) {
-		/*
-		byte[] lookupMac;
-		if ((lookupMac = lookupArpTable(ipAddress.getAddress())) == null) {
-			return lookupMac;
-		}
-		*/
-		
-		storeRequester(ipAddress, requester, retry);
+		arpRequests.put(ipAddress, new ArpRequest(requester, retry));
+		//storeRequester(ipAddress, requester, retry);
 		
 		sendArpRequestForAddress(ipAddress);
 	}
