diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 6f707c64362b0cb6a8714a9d2ccc3b6059ac1afc..8210ba3395964f9ec9ae6ac3fcd3f929de5ec7f6 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -139,7 +139,7 @@ error *enqueue_wait_for_events(clobj_t _queue, const clobj_t *_wait_for,
                                uint32_t num_wait_for);
 error *enqueue_marker(clobj_t *event, clobj_t queue);
 error *enqueue_barrier(clobj_t queue);
-
+// enqueue_*_buffer*
 error *enqueue_read_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
                            void *buffer, size_t size, size_t device_offset,
                            const clobj_t *wait_for, uint32_t num_wait_for,
@@ -157,7 +157,11 @@ error *enqueue_map_buffer(clobj_t *_evt, clobj_t *mpa, clobj_t _queue,
                           clobj_t _mem, cl_map_flags flags, size_t offset,
                           size_t size, const clobj_t *_wait_for,
                           uint32_t num_wait_for, int block);
-
+error *enqueue_fill_buffer(clobj_t *_evt, clobj_t _queue, clobj_t _mem,
+                           void *pattern, size_t psize, size_t offset,
+                           size_t size, const clobj_t *_wait_for,
+                           uint32_t num_wait_for);
+// enqueue_*_image*
 error *enqueue_read_image(clobj_t *event, clobj_t queue, clobj_t mem,
                           size_t *origin, size_t *region, void *buffer,
                           size_t row_pitch, size_t slice_pitch,
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 2f5227834c7a5f452d912dd6e1f699ef24800e69..233e1a0336e7a4c1f6b3d7b74d4c65f5a54bca7c 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -711,7 +711,6 @@ class NannyEvent(Event):
 #   enqueue_read_buffer_rect
 #   enqueue_write_buffer_rect
 #   enqueue_copy_buffer_rect
-#   enqueue_fill_buffer
 #   get_image_format_channel_count
 #   get_image_format_dtype_size
 #   get_image_format_item_size
@@ -891,6 +890,15 @@ def enqueue_map_buffer(queue, buf, flags, offset, shape, dtype,
         }
     return np.asarray(map), event
 
+def _enqueue_fill_buffer(queue, mem, pattern, offset, size, wait_for=None):
+    c_pattern, psize, c_ref = _c_buffer_from_obj(pattern)
+    _event = _ffi.new('clobj_t*')
+    c_wait_for, num_wait_for = _clobj_list(wait_for)
+    _handle_error(_lib.enqueue_fill_buffer(
+        _event, queue.ptr, mem.ptr, c_pattern, psize, offset, size,
+        c_wait_for, num_wait_for))
+    return _create_instance(Event, ptr_event[0])
+
 # }}}
 
 
diff --git a/src/c_wrapper/wrap_cl.cpp b/src/c_wrapper/wrap_cl.cpp
index 894642d30bbca0b5b979b6cb7f0e1ea5bf2299de..e1796b2618120528e997f238bd0c09c6fdf98ac1 100644
--- a/src/c_wrapper/wrap_cl.cpp
+++ b/src/c_wrapper/wrap_cl.cpp
@@ -2559,6 +2559,26 @@ enqueue_map_buffer(clobj_t *_evt, clobj_t *map, clobj_t _queue, clobj_t _mem,
         });
 }
 
+error*
+enqueue_fill_buffer(clobj_t *_evt, clobj_t _queue, clobj_t _mem, void *pattern,
+                    size_t psize, size_t offset, size_t size,
+                    const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    auto queue = static_cast<command_queue*>(_queue);
+    auto mem = static_cast<memory_object_holder*>(_mem);
+    return c_handle_error([&] {
+            cl_event evt;
+            retry_mem_error<void>([&] {
+                    pyopencl_call_guarded(
+                        clEnqueueFillBuffer, queue->data(), mem->data(),
+                        pattern, psize, offset, size, num_wait_for,
+                        wait_for.get(), &evt);
+                });
+            *_evt = new_event(evt);
+        });
+}
+
 error*
 enqueue_read_image(clobj_t *_evt, clobj_t _queue, clobj_t _mem, size_t *origin,
                    size_t *region, void *buffer, size_t row_pitch,