diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 04c6267aedb372befef912d8048d85e431433d95..84da8e4229718589b84d83cd27194ee676244980 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -126,6 +126,9 @@ error *enqueue_nd_range_kernel(clobj_t *event, clobj_t queue,
                                const size_t *global_work_size,
                                const size_t *local_work_size,
                                const clobj_t *wait_for, uint32_t num_wait_for);
+error *enqueue_task(clobj_t *_evt, clobj_t _queue, clobj_t _knl,
+                    const clobj_t *_wait_for, uint32_t num_wait_for);
+
 error *enqueue_marker_with_wait_list(clobj_t *event, clobj_t queue,
                                      const clobj_t *wait_for,
                                      uint32_t num_wait_for);
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index b802c6b7eb488bf92d44cd5afad3a6c6ad2b8a98..835a7027f62149f733032dfb94ad39b32f9061c0 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -718,16 +718,15 @@ class NannyEvent(Event):
 #   get_image_format_channel_count
 #   get_image_format_dtype_size
 #   get_image_format_item_size
-#   enqueue_task
 
 # }}}
 
 
 # {{{ enqueue_nd_range_kernel
 
-def enqueue_nd_range_kernel(queue, kernel,
-        global_work_size, local_work_size, global_work_offset=None,
-        wait_for=None, g_times_l=False):
+def enqueue_nd_range_kernel(queue, kernel, global_work_size, local_work_size,
+                            global_work_offset=None, wait_for=None,
+                            g_times_l=False):
 
     work_dim = len(global_work_size)
 
@@ -772,6 +771,17 @@ def enqueue_nd_range_kernel(queue, kernel,
 
 # }}}
 
+# {{{ enqueue_task
+
+def enqueue_task(queue, kernel, wait_for=None):
+    _event = _ffi.new('clobj_t*')
+    c_wait_for, num_wait_for = _clobj_list(wait_for)
+    _handle_error(_lib.enqueue_task(
+        _event, queue.ptr, kernel.ptr, c_wait_for, num_wait_for))
+    return _create_instance(Event, ptr_event[0])
+
+# }}}
+
 # {{{ _enqueue_marker_*
 
 def _enqueue_marker_with_wait_list(queue, wait_for=None):
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index eca8f5991b8452b4fbc5124f0fd25dd7a3e024c8..3f7fa288fb012e827d6777719aeb25ff2a39187b 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -2370,6 +2370,24 @@ enqueue_nd_range_kernel(clobj_t *_evt, clobj_t _queue, clobj_t _knl,
         });
 }
 
+error*
+enqueue_task(clobj_t *_evt, clobj_t _queue, clobj_t _knl,
+             const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    auto queue = static_cast<command_queue*>(_queue);
+    auto knl = static_cast<kernel*>(_knl);
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    return c_handle_error([&] {
+            cl_event evt;
+            retry_mem_error<void>([&] {
+                    pyopencl_call_guarded(
+                        clEnqueueTask, queue->data(), knl->data(),
+                        num_wait_for, wait_for.get(), &evt);
+                });
+            *_evt = new_event(evt);
+        });
+}
+
 #if PYOPENCL_CL_VERSION >= 0x1020
 error*
 enqueue_marker_with_wait_list(clobj_t *_evt, clobj_t _queue,