diff --git a/tests/test_imagewrapper.py b/tests/test_imagewrapper.py
index f733ff4a2990d6b3a8168b0da1bfbce055cd2b63..cbb2a2753e2fd0f2712189e4ac6f7f01ae0187ae 100644
--- a/tests/test_imagewrapper.py
+++ b/tests/test_imagewrapper.py
@@ -9,6 +9,7 @@ from __future__ import print_function
 
 import              collections
 import              random
+import              time
 import itertools as it
 import numpy     as np
 import nibabel   as nib
@@ -192,6 +193,7 @@ def applyCoverage(wrapper, coverage):
         sliceobjs.append(vol)
 
         wrapper[tuple(sliceobjs)]
+        _ImageWraper_busy_wait(wrapper)
 
     # Check that the image wrapper
     # has covered what we just told
@@ -557,7 +559,16 @@ def test_calcExpansion(niters):
             _test_expansion(coverage, slices, vols, exps)
 
 
-def test_ImageWrapper_read(niters, seed):
+def _ImageWraper_busy_wait(wrapper, v=0):
+    tt = wrapper.getTaskThread()
+    if tt is not None:
+        tt.waitUntilIdle()
+
+def test_ImageWrapper_read_threaded(niters, seed):
+    _test_ImageWrapper_read(niters, seed, True)
+def test_ImageWrapper_read_unthreaded(niters, seed):
+    _test_ImageWrapper_read(niters, seed, False) 
+def _test_ImageWrapper_read(niters, seed, threaded):
 
     for _ in range(niters):
 
@@ -581,7 +592,9 @@ def test_ImageWrapper_read(niters, seed):
                               np.max(data[..., vol])))
 
         img     = nib.Nifti1Image(data, np.eye(4))
-        wrapper = imagewrap.ImageWrapper(img, loadData=False)
+        wrapper = imagewrap.ImageWrapper(img,
+                                         loadData=False,
+                                         threaded=threaded)
 
         # We're going to access data volumes 
         # through the image wrapper with a
@@ -604,6 +617,8 @@ def test_ImageWrapper_read(niters, seed):
                 if len(data.shape) >= 3: wrapper[..., vol]
                 else:                    wrapper[:, vol, 0]
 
+                _ImageWraper_busy_wait(wrapper, vol)
+
                 # The current known data range
                 # should be the min/max of
                 # all acccessed volumes so far
@@ -615,8 +630,11 @@ def test_ImageWrapper_read(niters, seed):
                 if j < nvols - 1: assert not wrapper.covered
                 else:             assert     wrapper.covered
 
-
-def test_ImageWrapper_write_out(niters, seed):
+def test_ImageWrapper_write_out_threaded(niters, seed):
+    _test_ImageWrapper_write_out(niters, seed, True)
+def test_ImageWrapper_write_out_unthreaded(niters, seed):
+    _test_ImageWrapper_write_out(niters, seed, False)
+def _test_ImageWrapper_write_out(niters, seed, threaded):
     # This is HORRIBLE
 
     loop = 0
@@ -644,7 +662,7 @@ def test_ImageWrapper_write_out(niters, seed):
         cov = random_coverage(shape, vol_limit=1)
 
         img     = nib.Nifti1Image(data, np.eye(4))
-        wrapper = imagewrap.ImageWrapper(img)
+        wrapper = imagewrap.ImageWrapper(img, threaded=threaded)
         applyCoverage(wrapper, cov)
         clo, chi = wrapper.dataRange
 
@@ -725,6 +743,7 @@ def test_ImageWrapper_write_out(niters, seed):
                 oldCov = wrapper.coverage(0)
 
                 wrapper[tuple(sliceobjs)] = newData
+                _ImageWraper_busy_wait(wrapper)
 
                 expLo, expHi = coverageDataRange(img.get_data(), cov, slices)
                 newLo, newHi = wrapper.dataRange
@@ -750,8 +769,12 @@ def test_ImageWrapper_write_out(niters, seed):
                 assert np.isclose(newHi, expHi)
             # print('--------------')
 
-            
-def test_ImageWrapper_write_in_overlap(niters, seed):
+
+def test_ImageWrapper_write_in_overlap_threaded(niters, seed):
+    _test_ImageWrapper_write_in_overlap(niters, seed, True)
+def test_ImageWrapper_write_in_overlap_unthreaded(niters, seed):
+    _test_ImageWrapper_write_in_overlap(niters, seed, False) 
+def _test_ImageWrapper_write_in_overlap(niters, seed, threaded):
 
     # Generate a bunch of random coverages
     for _ in range(niters):
@@ -814,7 +837,7 @@ def test_ImageWrapper_write_in_overlap(niters, seed):
                     rhi = rlo
 
                 img     = nib.Nifti1Image(np.copy(data), np.eye(4))
-                wrapper = imagewrap.ImageWrapper(img)
+                wrapper = imagewrap.ImageWrapper(img, threaded=threaded)
                 applyCoverage(wrapper, cov)
 
                 newData = np.linspace(rlo, rhi, np.prod(sliceshape))
@@ -840,6 +863,7 @@ def test_ImageWrapper_write_in_overlap(niters, seed):
                 expHi = expData[expCovSlice].max()
 
                 wrapper[tuple(sliceobjs)] = newData
+                _ImageWraper_busy_wait(wrapper)
 
                 newCov       = wrapper.coverage(0)
                 newLo, newHi = wrapper.dataRange
@@ -856,8 +880,12 @@ def test_ImageWrapper_write_in_overlap(niters, seed):
                 assert np.isclose(newLo, expLo)
                 assert np.isclose(newHi, expHi)
 
-            
-def test_ImageWrapper_write_different_volume(niters, seed):
+
+def test_ImageWrapper_write_different_volume_threaded(niters, seed):
+    _test_ImageWrapper_write_different_volume(niters, seed, True)
+def test_ImageWrapper_write_different_volume_unthreaded(niters, seed):
+    _test_ImageWrapper_write_different_volume(niters, seed, False)
+def _test_ImageWrapper_write_different_volume(niters, seed, threaded):
 
     for _ in range(niters):
 
@@ -977,7 +1005,7 @@ def test_ImageWrapper_write_different_volume(niters, seed):
             for rlo, rhi, (elo, ehi) in zip(loRanges, hiRanges, expected):
 
                 img     = nib.Nifti1Image(np.copy(data), np.eye(4))
-                wrapper = imagewrap.ImageWrapper(img)
+                wrapper = imagewrap.ImageWrapper(img, threaded=threaded)
                 applyCoverage(wrapper, cov)
 
                 oldLo, oldHi = wrapper.dataRange
@@ -990,6 +1018,7 @@ def test_ImageWrapper_write_different_volume(niters, seed):
                     ehi = max(newData.max(), oldHi) 
 
                 wrapper[tuple(sliceobjs)] = newData
+                _ImageWraper_busy_wait(wrapper)
 
                 newLo, newHi = wrapper.dataRange