diff --git a/python/tools/scanner.py b/python/tools/scanner.py
index e9ebb1c430ef3c1a05b5df560b2dca24a6cbdef6..d85ee4c5e4362b1c58255323a24a7133395e3db8 100755
--- a/python/tools/scanner.py
+++ b/python/tools/scanner.py
@@ -20,6 +20,7 @@ from pprint import pprint
 from math import cos, sin, pi
 from urllib import request
 import gzip
+import asyncio
 
 sys.path.append('..')
 from opendht import *
@@ -96,6 +97,8 @@ all_lines = []
 
 plt.pause(2)
 
+loop = asyncio.get_event_loop()
+
 def step(cur_h, cur_depth):
     global done, all_nodes, all_lines
     done += 1
@@ -105,7 +108,7 @@ def step(cur_h, cur_depth):
     arc = ringx.add_patch(mpatches.Wedge([0.,0,], 1., a*180/pi, b*180/pi, fill=True, color="blue", alpha=0.5))
     lines = ringx.plot([0, cos(a)], [0, sin(a)], 'k-', lw=1.2)
     all_lines.extend(lines)
-    r.get(cur_h, gcb, lambda d, nodes: nextstep(cur_h, cur_depth, d, nodes, arc=arc, lines=lines))
+    r.get(cur_h, gcb, lambda d, nodes: loop.call_soon_threadsafe(nextstep, cur_h, cur_depth, d, nodes, arc, lines))
 
 def nextstep(cur_h, cur_depth, ok, nodes, arc=None, lines=[]):
     global done, all_nodes
@@ -239,6 +242,8 @@ def d(arg):
 
 while run:
     while run and done > 0:
+        loop.stop()
+        loop.run_forever()
         update_plot()
         plt.draw()
         plt.pause(.5)