diff --git a/pyopencl/array.py b/pyopencl/array.py
index 6223f57cc67d62182051df17fd5f40a4aca48def..4ef896c5923af10c296fc69968da2c64db719dd2 100644
--- a/pyopencl/array.py
+++ b/pyopencl/array.py
@@ -1154,6 +1154,12 @@ class Array(object):
 
     # }}}
 
+    def finish(self):
+        # undoc
+        if self.events:
+            cl.wait_for_events(self.events)
+            del self.events[:]
+
     # {{{ views
 
     def reshape(self, *shape, **kwargs):
@@ -1214,12 +1220,6 @@ class Array(object):
 
     # }}}
 
-    def finish(self):
-        # undoc
-        if self.events:
-            cl.wait_for_events(self.events)
-            del self.events[:]
-
     def map_to_host(self, queue=None, flags=None, is_blocking=True, wait_for=None):
         """If *is_blocking*, return a :class:`numpy.ndarray` corresponding to the
         same memory as *self*.
@@ -1344,11 +1344,15 @@ class Array(object):
                 shape=tuple(new_shape),
                 strides=tuple(new_strides))
 
-    def setitem(self, subscript, value, queue=None):
+    def setitem(self, subscript, value, queue=None, wait_for=None):
         """Like :meth:`__setitem__`, but with the ability to specify
-        a *queue* for execution.
+        a *queue* and *wait_for*.
 
         .. versionadded:: 2013.1
+
+        .. versionchanged:: 2013.2
+
+            Added *wait_for*.
         """
 
         if isinstance(subscript, Array):
@@ -1362,7 +1366,8 @@ class Array(object):
                 raise NotImplementedError(
                         "fancy indexing into a multi-d array is supported")
 
-            multi_put([value], subscript, out=[self], queue=self.queue)
+            multi_put([value], subscript, out=[self], queue=self.queue,
+                    wait_for=wait_for)
             return
 
         queue = queue or self.queue or value.queue
@@ -1373,7 +1378,7 @@ class Array(object):
             if subarray.shape == value.shape and subarray.strides == value.strides:
                 self.events.append(
                         cl.enqueue_copy(queue, subarray.base_data,
-                            value, device_offset=subarray.offset))
+                            value, device_offset=subarray.offset, wait_for=wait_for))
                 return
             else:
                 value = to_device(queue, value, self.allocator)
@@ -1389,11 +1394,11 @@ class Array(object):
                 raise ValueError("cannot assign between arrays of "
                         "differing strides")
 
-            self._copy(subarray, value, queue=queue)
+            self._copy(subarray, value, queue=queue, wait_for=wait_for)
 
         else:
             # Let's assume it's a scalar
-            subarray.fill(value, queue=queue)
+            subarray.fill(value, queue=queue, wait_for=wait_for)
 
     def __setitem__(self, subscript, value):
         """Set the slice of *self* identified *subscript* to *value*.