diff --git a/doc/runtime.rst b/doc/runtime.rst
index 52d2a5210888e0a2f5c17e8ce22d552358436cf3..eafdeecaaa47d32e5caeed47e45a0f54bf9bea06 100644
--- a/doc/runtime.rst
+++ b/doc/runtime.rst
@@ -278,6 +278,14 @@ Command Queues and Events
     .. automethod:: from_int_ptr
     .. autoattribute:: int_ptr
 
+    .. method:: set_callback(type, cb)
+
+        Add the callback *cb* with signature ``cb(status)`` to the callback
+        queue for the event status *type* (one of the values of
+        :class:`command_execution_status`, except :attr:`command_execution_status.QUEUED`).
+
+        See the OpenCL specification for restrictions on what *cb* may and may not do.
+
     |comparable|
 
 .. function:: wait_for_events(events)
diff --git a/examples/demo.py b/examples/demo.py
index 8fcdd5b4291dcd8c848a15885e39d718f99bc222..b6a1693901dc6e9675082e348c9fdb76818bed49 100644
--- a/examples/demo.py
+++ b/examples/demo.py
@@ -1,8 +1,7 @@
-from __future__ import absolute_import
-from __future__ import print_function
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 
+from __future__ import absolute_import, print_function
 import numpy as np
 import pyopencl as cl
 
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 24a1ac5ceb4573d8dd0042696da731adc230422f..f1dcf81de857300de3aab3de2808348a0bbfaabb 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -1096,9 +1096,9 @@ class Event(_Common):
     def wait(self):
         _handle_error(_lib.event__wait(self.ptr))
 
-    def set_callback(self, _type, cb, *args, **kwargs):
+    def set_callback(self, _type, cb):
         def _func(status):
-            cb(status, *args, **kwargs)
+            cb(status)
         _handle_error(_lib.event__set_callback(self.ptr, _type,
                                                _ffi.new_handle(_func)))
 
diff --git a/test/test_wrapper.py b/test/test_wrapper.py
index 61c6d45a50d715aa11c686b6acd98a63c4e35390..23d26aef5cec512a0767c24b5f487abb9838f873 100644
--- a/test/test_wrapper.py
+++ b/test/test_wrapper.py
@@ -787,6 +787,52 @@ def test_program_valued_get_info(ctx_factory):
     knl.program.binaries[0]
 
 
+def test_event_set_callback(ctx_factory):
+    ctx = ctx_factory()
+    queue = cl.CommandQueue(ctx)
+
+    if ctx._get_cl_version() < (1, 1):
+        pytest.skip("OpenCL 1.1 or newer required fro set_callback")
+
+    a_np = np.random.rand(50000).astype(np.float32)
+    b_np = np.random.rand(50000).astype(np.float32)
+
+    got_called = []
+
+    def cb(status):
+        got_called.append(status)
+
+    mf = cl.mem_flags
+    a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
+    b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)
+
+    prg = cl.Program(ctx, """
+    __kernel void sum(__global const float *a_g, __global const float *b_g,
+        __global float *res_g) {
+      int gid = get_global_id(0);
+      res_g[gid] = a_g[gid] + b_g[gid];
+    }
+    """).build()
+
+    res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
+
+    uevt = cl.UserEvent(ctx)
+
+    evt = prg.sum(queue, a_np.shape, None, a_g, b_g, res_g, wait_for=[uevt])
+
+    evt.set_callback(cl.command_execution_status.COMPLETE, cb)
+
+    uevt.set_status(cl.command_execution_status.COMPLETE)
+
+    queue.finish()
+
+    # yuck
+    from time import sleep
+    sleep(0.1)
+
+    assert got_called
+
+
 if __name__ == "__main__":
     # make sure that import failures get reported, instead of skipping the tests.
     import pyopencl  # noqa