diff --git a/pyopencl/scan.py b/pyopencl/scan.py
index 02679a3122f9662b67175a48db948b23329aa2a1..169070a061953047f0c0a1a0aecaa8eff17f34c5 100644
--- a/pyopencl/scan.py
+++ b/pyopencl/scan.py
@@ -364,31 +364,6 @@ void ${name_prefix}_final_update(
 
 
 
-def _div_ceil(nr, dr):
-    return (nr + dr -1) // dr
-
-
-def _uniform_interval_splitting(n, granularity, max_intervals):
-    grains  = _div_ceil(n, granularity)
-
-    # one grain per interval
-    if grains <= max_intervals:
-        return granularity, grains
-
-    # ensures that:
-    #     num_intervals * interval_size is >= n
-    #   and
-    #     (num_intervals - 1) * interval_size is < n
-
-    grains_per_interval = _div_ceil(grains, max_intervals)
-    interval_size = grains_per_interval * granularity
-    num_intervals = _div_ceil(n, interval_size)
-
-    return interval_size, num_intervals
-
-
-
-
 if _CL_MODE:
     class _ScanKernelBase(object):
         def __init__(self, ctx, dtype,
@@ -475,7 +450,8 @@ if _CL_MODE:
             unit_size  = self.scan_wg_size * self.scan_wg_seq_batches
             max_groups = 3*max(dev.max_compute_units for dev in self.devices)
 
-            interval_size, num_groups = _uniform_interval_splitting(
+            from pytools import uniform_interval_splitting
+            interval_size, num_groups = uniform_interval_splitting(
                     n, unit_size, max_groups);
 
             block_results = allocator(self.dtype.itemsize*num_groups)
@@ -576,7 +552,8 @@ else:
             max_groups = 3*dev.get_attribute(
                     driver.device_attribute.MULTIPROCESSOR_COUNT)
 
-            interval_size, num_groups = _uniform_interval_splitting(
+            from pytools import uniform_interval_splitting
+            interval_size, num_groups = uniform_interval_splitting(
                     n, unit_size, max_groups);
 
             block_results = allocator(self.dtype.itemsize*num_groups)
diff --git a/setup.py b/setup.py
index 0baf6f13e4c44f17b08f251746bd6cdeefd0ae92..68d51a08b2d9e1cf1cb180ce2cc6f4e582a7e492 100644
--- a/setup.py
+++ b/setup.py
@@ -166,8 +166,8 @@ def main():
             packages=["pyopencl"],
 
             install_requires=[
-                "pytools>=7",
-                "py>=1.0.2",
+                "pytools>=2011.2",
+                "pytest>=2",
                 "decorator>=3.2.0",
                 # "Mako>=0.3.6",
                 ],