diff --git a/hgext/zeroconf/__init__.py b/hgext/zeroconf/__init__.py
index 2b1226693c7060115256f45a8ead82ce7f24b5a8_aGdleHQvemVyb2NvbmYvX19pbml0X18ucHk=..23fc62e0a96000ef8eee951773d3a1170886de99_aGdleHQvemVyb2NvbmYvX19pbml0X18ucHk= 100644
--- a/hgext/zeroconf/__init__.py
+++ b/hgext/zeroconf/__init__.py
@@ -27,7 +27,7 @@
 import socket, time, os
 
 import Zeroconf
-from mercurial import ui, hg, encoding, util
+from mercurial import ui, hg, encoding, util, dispatch
 from mercurial import extensions
 from mercurial.hgweb import hgweb_mod
 from mercurial.hgweb import hgwebdir_mod
@@ -166,6 +166,18 @@
             return name.encode(encoding.encoding)
     return orig(source)
 
+def cleanupafterdispatch(orig, ui, options, cmd, cmdfunc):
+    try:
+        return orig(ui, options, cmd, cmdfunc)
+    finally:
+        # we need to call close() on the server to notify() the various
+        # threading Conditions and allow the background threads to exit
+        global server
+        if server:
+            server.close()
+
+extensions.wrapfunction(dispatch, '_runcommand', cleanupafterdispatch)
+
 extensions.wrapfunction(ui.ui, 'config', config)
 extensions.wrapfunction(ui.ui, 'configitems', configitems)
 extensions.wrapfunction(hg, 'defaultdest', defaultdest)