Was doing a callback while holding a lock, which was causing deadlock
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 d9b4725..c16ead6 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/proxyarp/ProxyArpManager.java
@@ -41,6 +41,7 @@
 import com.google.common.collect.SetMultimap;
 
 //TODO have L2 and also L3 mode, where it takes into account interface addresses
+//TODO REST API to inspect ARP table
 public class ProxyArpManager implements IProxyArpService, IOFMessageListener {
 	private static Logger log = LoggerFactory.getLogger(ProxyArpManager.class);
 	
@@ -306,14 +307,21 @@
 		Set<ArpRequest> requests = arpRequests.get(addr);
 		
 		//Synchronize on the Multimap while using an iterator for one of the sets
+		List<ArpRequest> requestsToSend = new ArrayList<ArpRequest>(requests.size());
 		synchronized (arpRequests) {
 			Iterator<ArpRequest> it = requests.iterator();
 			while (it.hasNext()) {
 				ArpRequest request = it.next();
 				it.remove();
-				request.dispatchReply(addr, arp.getSenderHardwareAddress());
+				//request.dispatchReply(addr, arp.getSenderHardwareAddress());
+				requestsToSend.add(request);
 			}
 		}
+		
+		//Don't hold an ARP lock while dispatching requests
+		for (ArpRequest request : requestsToSend) {
+			request.dispatchReply(addr, arp.getSenderHardwareAddress());
+		}
 	}
 
 	private synchronized byte[] lookupArpTable(byte[] ipAddress){