diff --git a/.test-conda-env-py3-requirements.txt b/.test-conda-env-py3-requirements.txt
index 01f08662149acd51177b1f4c3a96d873555a5a9e..45c20c1f8b09a6a20cc232eb0e1ce05eb69aa403 100644
--- a/.test-conda-env-py3-requirements.txt
+++ b/.test-conda-env-py3-requirements.txt
@@ -1,3 +1,3 @@
-git+https://github.com/inducer/boxtree
+git+https://gitlab.tiker.net/inducer/boxtree
 git+https://github.com/inducer/pymbolic
 git+https://github.com/inducer/loopy
diff --git a/requirements.txt b/requirements.txt
index 6690e3d9651bad06a8fd28e444167fe03bbb119f..1e86e61017a9f70631b25ba46ad808e16f0b715e 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,6 +3,6 @@ sympy==1.0
 git+https://github.com/inducer/pymbolic
 git+https://github.com/inducer/islpy
 git+https://github.com/inducer/pyopencl
-git+https://github.com/inducer/boxtree
+git+https://gitlab.tiker.net/inducer/boxtree
 git+https://github.com/inducer/loopy
 git+https://github.com/inducer/pyfmmlib
diff --git a/sumpy/fmm.py b/sumpy/fmm.py
index 36b073779498a5768e72ebc4e85a66b4b061e9b4..ed2a1e4bd35b07c4bb1f601c6b850044fdf5539a 100644
--- a/sumpy/fmm.py
+++ b/sumpy/fmm.py
@@ -449,8 +449,7 @@ class SumpyExpansionWrangler(object):
         return local_exps
 
     def eval_multipoles(self,
-            level_start_target_box_nrs,
-            target_boxes, source_boxes_by_level, mpole_exps):
+            target_boxes_by_source_level, source_boxes_by_level, mpole_exps):
         pot = self.output_zeros()
 
         kwargs = self.kernel_extra_kwargs.copy()
@@ -458,8 +457,9 @@ class SumpyExpansionWrangler(object):
 
         wait_for = mpole_exps.events
 
+        has_evt = False
         for isrc_level, ssn in enumerate(source_boxes_by_level):
-            if len(target_boxes) == 0:
+            if len(target_boxes_by_source_level[isrc_level]) == 0:
                 continue
 
             m2p = self.code.m2p(self.level_orders[isrc_level])
@@ -473,7 +473,7 @@ class SumpyExpansionWrangler(object):
                     src_expansions=source_mpoles_view,
                     src_base_ibox=source_level_start_ibox,
 
-                    target_boxes=target_boxes,
+                    target_boxes=target_boxes_by_source_level[isrc_level],
                     source_box_starts=ssn.starts,
                     source_box_lists=ssn.lists,
                     centers=self.tree.box_centers,
@@ -485,14 +485,16 @@ class SumpyExpansionWrangler(object):
 
                     **kwargs)
 
+            has_evt = True
             wait_for = [evt]
 
             for pot_i, pot_res_i in zip(pot, pot_res):
                 assert pot_i is pot_res_i
 
-        for pot_i in pot:
-            # Intentionally only adding the last event.
-            pot_i.add_event(evt)
+        if has_evt:
+            for pot_i in pot:
+                # Intentionally only adding the last event.
+                pot_i.add_event(evt)
 
         return pot