diff --git a/web/pingallm-local.py b/web/pingallm-local.py
new file mode 100755
index 0000000..c8609e7
--- /dev/null
+++ b/web/pingallm-local.py
@@ -0,0 +1,92 @@
+#! /usr/bin/env python
+import sys
+import time
+import os
+import re
+import json
+
+ping_cnt=3
+wait1=ping_cnt
+wait2=10
+
+CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
+
+def read_config():
+  global controllers, cluster_basename
+  f = open(CONFIG_FILE)
+  conf = json.load(f)
+  controllers = conf['controllers']
+  cluster_basename = conf['cluster_basename']
+  f.close()
+
+def do_pingall(nwid):
+  pid=os.getpid()
+  os.popen("rm -f /tmp/ping.*")
+
+  filename = sys.argv[1]
+  f = open(filename, 'r')
+  nr_ping = 0
+  fids=[]
+  for line in f:
+    if line[0] != "#":
+      fid=int(line.strip().split()[0])
+      logfile="/tmp/ping.%d" % (fid)
+      src_dpid=line.strip().split()[2]
+      dst_dpid=line.strip().split()[4]
+      src_nwid=int(src_dpid.split(':')[-2], 16)
+      dst_nwid=int(dst_dpid.split(':')[-2], 16)
+      src_hostid=int(src_dpid.split(':')[-1], 16)
+      dst_hostid=int(dst_dpid.split(':')[-1], 16)
+
+      if src_nwid == nwid:
+        cmd="echo \"Pingall flow %d : 192.168.%d.%d -> 192.168.%d.%d\" > %s" % (fid, src_nwid, src_hostid, dst_nwid, dst_hostid,logfile)
+        os.popen(cmd)
+#        cmd="ssh %s \'${HOME}/ONOS/test-network/mininet/mrun host%d \'ping -c %d -W 1 192.168.%d.%d\'\' >> %s 2>&1 &" % (controllers[src_nwid-1], src_hostid, ping_cnt, dst_nwid, dst_hostid,logfile)
+        cmd="${HOME}/ONOS/test-network/mininet/mrun host%d \'ping -c %d -W 1 192.168.%d.%d\' >> %s 2>&1 &" % (src_hostid, ping_cnt, dst_nwid, dst_hostid,logfile)
+        print cmd
+        result = os.popen(cmd).read()
+#        time.sleep(0.2)
+        fids.append(fid)
+        nr_ping = nr_ping + 1
+
+  f.close()
+  return fids
+
+def wait_ping_finish(nr_ping):
+  print "all pings started.. waiting for completion (%d sec)" % (wait1)
+  time.sleep(wait1)
+  cmd="cat /tmp/ping.* | grep \"packet loss\" |wc -l"
+  for i in range(wait2):
+    nr_done = int(os.popen(cmd).read())
+    if nr_done == nr_ping:
+      break
+    print "%d ping finished" % nr_done
+    time.sleep(1)
+  
+  return nr_done
+
+def report(fids, nr_done):
+  cmd='cat /tmp/ping.* | grep " 0% packet loss" |wc -l'
+  nr_success = int(os.popen('cat /tmp/ping.* | grep " 0% packet loss" |wc -l').read())
+  nr_incomplete = len(fids) - nr_done
+  nr_fail = nr_done - nr_success
+
+  print "Pingall Result: success %d fail %d incomplete %d" % (nr_success, nr_fail, nr_incomplete)
+  if nr_fail > 0 or nr_incomplete > 0:
+    for i in fids:
+      cmd="cat /tmp/ping.%d | head -n 1" % (i)
+      flow_desc = os.popen(cmd).read().strip()
+
+      cmd="cat /tmp/ping.%d | grep \"packet loss\"" % (i)
+      result = os.popen(cmd).read().strip()
+
+      if not re.search(" 0% packet loss", result):
+        print "flow # %d %s : %s" % (i, flow_desc, result)
+
+if __name__ == "__main__":
+  read_config()
+  hostname=os.popen('hostname').read().strip()
+  nwid=int(hostname.replace("%s" % cluster_basename, ""))
+  fids=do_pingall(nwid)
+  nr_done=wait_ping_finish(len(fids))
+  report(fids, nr_done)
