diff --git a/TODOs b/TODOs
index 22ae0413d64cfffc49e00acf09259bbab7eb7da2..df683851259b6d95ee2d1b7e69c50435c45b1114 100644
--- a/TODOs
+++ b/TODOs
@@ -5,8 +5,6 @@
 - enqueue_nd_range_kernel size/offset mess
 
 - CommandQueue.set_property
-- enqueue_migrate_mem_objects
-- enqueue_migrate_mem_objects_ext
 - _enqueue_copy_image_to_buffer
 - _enqueue_copy_buffer_to_image
 - _Program.create_with_built_in_kernels
diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index f2b926039b9370e214d8a05b4de1f987aeead332..c22738b8efc75a94a1cde096b923501d7ba9433d 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -170,6 +170,14 @@ 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);
+error *enqueue_migrate_mem_objects(clobj_t *evt, clobj_t _queue,
+                                   const clobj_t *_mem_obj, uint32_t,
+                                   cl_mem_migration_flags flags,
+                                   const clobj_t *_wait_for, uint32_t);
+error *enqueue_migrate_mem_object_ext(clobj_t *evt, clobj_t _queue,
+                                      const clobj_t *_mem_obj, uint32_t,
+                                      cl_mem_migration_flags_ext flags,
+                                      const clobj_t *_wait_for, uint32_t);
 // enqueue_*_buffer*
 error *enqueue_read_buffer(clobj_t *event, clobj_t queue, clobj_t mem,
                            void *buffer, size_t size, size_t device_offset,
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index ca7d20ef130375b3f328839243a1a420347651aa..7145b6de6ad61aca6be2d17c3e568d35544cebc6 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -1057,6 +1057,29 @@ def _enqueue_barrier(queue):
 
 # }}}
 
+# {{{ enqueue_migrate_mem_object*
+
+def enqueue_migrate_mem_objects(queue, mem_objects, flags, wait_for=None):
+    _event = _ffi.new('clobj_t*')
+    c_wait_for, num_wait_for = _clobj_list(wait_for)
+    c_mem_objs, num_mem_objs = _clobj_list(mem_objects)
+    _handle_error(_lib.enqueue_migrate_mem_objects(
+        _event, queue.ptr, c_mem_objs, num_mem_objs, flags,
+        c_wait_for, num_wait_for))
+    return Event._create(_event[0])
+
+
+def enqueue_migrate_mem_object_ext(queue, mem_objects, flags, wait_for=None):
+    _event = _ffi.new('clobj_t*')
+    c_wait_for, num_wait_for = _clobj_list(wait_for)
+    c_mem_objs, num_mem_objs = _clobj_list(mem_objects)
+    _handle_error(_lib.enqueue_migrate_mem_object_ext(
+        _event, queue.ptr, c_mem_objs, num_mem_objs, flags,
+        c_wait_for, num_wait_for))
+    return Event._create(_event[0])
+
+# }}}
+
 # {{{ _enqueue_wait_for_events
 
 def _enqueue_wait_for_events(queue, wait_for=None):
@@ -1093,7 +1116,7 @@ def _enqueue_write_buffer(queue, mem, hostbuf, device_offset=0,
 
 
 def _enqueue_copy_buffer(queue, src, dst, byte_count=-1, src_offset=0,
-        dst_offset=0, wait_for=None):
+                         dst_offset=0, wait_for=None):
     ptr_event = _ffi.new('clobj_t*')
     c_wait_for, num_wait_for = _clobj_list(wait_for)
     _handle_error(_lib.enqueue_copy_buffer(
diff --git a/src/c_wrapper/memory_object.cpp b/src/c_wrapper/memory_object.cpp
index 103de78a4dd91f643802a77b08e54ac9cad3c24e..4670a4a5adb5abf5b0a1162de7cb090cf8918bcd 100644
--- a/src/c_wrapper/memory_object.cpp
+++ b/src/c_wrapper/memory_object.cpp
@@ -1,5 +1,7 @@
 #include "memory_object.h"
 #include "context.h"
+#include "event.h"
+#include "command_queue.h"
 #include "clhelper.h"
 
 namespace pyopencl {
@@ -88,3 +90,52 @@ memory_object__get_host_array(clobj_t _obj, void **hostptr, size_t *size)
                                   size_arg(*size), nullptr);
         });
 }
+
+#if PYOPENCL_CL_VERSION >= 0x1020
+error*
+enqueue_migrate_mem_objects(clobj_t *evt, clobj_t _queue,
+                            const clobj_t *_mem_obj, uint32_t num_mem_obj,
+                            cl_mem_migration_flags flags,
+                            const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    const auto mem_obj = buf_from_class<memory_object>(_mem_obj, num_mem_obj);
+    auto queue = static_cast<command_queue*>(_queue);
+    return c_handle_retry_mem_error([&] {
+            pyopencl_call_guarded(clEnqueueMigrateMemObjects, queue,
+                                  mem_obj, flags, wait_for, event_out(evt));
+        });
+}
+#endif
+
+#ifdef cl_ext_migrate_memobject
+error*
+enqueue_migrate_mem_object_ext(clobj_t *evt, clobj_t _queue,
+                               const clobj_t *_mem_obj, uint32_t num_mem_obj,
+                               cl_mem_migration_flags_ext flags,
+                               const clobj_t *_wait_for, uint32_t num_wait_for)
+{
+    const auto wait_for = buf_from_class<event>(_wait_for, num_wait_for);
+    const auto mem_obj = buf_from_class<memory_object>(_mem_obj, num_mem_obj);
+    auto queue = static_cast<command_queue*>(_queue);
+    return c_handle_error([&] {
+#if PYOPENCL_CL_VERSION >= 0x1020
+            // {{{ get platform
+            cl_device_id dev;
+            pyopencl_call_guarded(clGetCommandQueueInfo, queue, CL_QUEUE_DEVICE,
+                                  size_arg(dev), nullptr);
+            cl_platform_id plat;
+            pyopencl_call_guarded(clGetDeviceInfo, dev, CL_DEVICE_PLATFORM,
+                                  size_arg(plat), nullptr);
+            // }}}
+#endif
+            auto clEnqueueMigrateMemObjectEXT =
+                pyopencl_get_ext_fun(plat, clEnqueueMigrateMemObjectEXT);
+            retry_mem_error([&] {
+                    pyopencl_call_guarded(clEnqueueMigrateMemObjectsEXT, queue,
+                                          mem_obj, flags, wait_for,
+                                          event_out(evt));
+                });
+        });
+}
+#endif
diff --git a/src/c_wrapper/memory_object.h b/src/c_wrapper/memory_object.h
index 650de5b8edee2c11d9fdc63c6309e688b0c34c40..65228f9f64d3b561be4760c07a6be83bec5bd410 100644
--- a/src/c_wrapper/memory_object.h
+++ b/src/c_wrapper/memory_object.h
@@ -53,74 +53,6 @@ public:
 #endif
 };
 
-// #if PYOPENCL_CL_VERSION >= 0x1020
-//   PYOPENCL_INLINE
-//   event *enqueue_migrate_mem_objects(
-//       command_queue &cq,
-//       py::object py_mem_objects,
-//       cl_mem_migration_flags flags,
-//       py::object py_wait_for)
-//   {
-//     PYOPENCL_PARSE_WAIT_FOR;
-
-//     std::vector<cl_mem> mem_objects;
-//     PYTHON_FOREACH(mo, py_mem_objects)
-//       mem_objects.push_back(py::extract<memory_object &>(mo)().data());
-
-//     cl_event evt;
-//     PYOPENCL_RETRY_IF_MEM_ERROR(
-//       PYOPENCL_CALL_GUARDED(clEnqueueMigrateMemObjects, (
-//             cq.data(),
-//             mem_objects.size(), mem_objects.empty( ) ? nullptr : &mem_objects.front(),
-//             flags,
-//             PYOPENCL_WAITLIST_ARGS, &evt
-//             ));
-//       );
-//     PYOPENCL_RETURN_NEW_EVENT(evt);
-//   }
-// #endif
-
-// #ifdef cl_ext_migrate_memobject
-//   PYOPENCL_INLINE
-//   event *enqueue_migrate_mem_object_ext(
-//       command_queue &cq,
-//       py::object py_mem_objects,
-//       cl_mem_migration_flags_ext flags,
-//       py::object py_wait_for)
-//   {
-//     PYOPENCL_PARSE_WAIT_FOR;
-
-// #if PYOPENCL_CL_VERSION >= 0x1020
-//     // {{{ get platform
-//     cl_device_id dev;
-//     PYOPENCL_CALL_GUARDED(clGetCommandQueueInfo, (cq.data(), CL_QUEUE_DEVICE,
-//           sizeof(dev), &dev, nullptr));
-//     cl_platform_id plat;
-//     PYOPENCL_CALL_GUARDED(clGetDeviceInfo, (cq.data(), CL_DEVICE_PLATFORM,
-//           sizeof(plat), &plat, nullptr));
-//     // }}}
-// #endif
-
-//     PYOPENCL_GET_EXT_FUN(plat,
-//         clEnqueueMigrateMemObjectEXT, enqueue_migrate_fn);
-
-//     std::vector<cl_mem> mem_objects;
-//     PYTHON_FOREACH(mo, py_mem_objects)
-//       mem_objects.push_back(py::extract<memory_object &>(mo)().data());
-
-//     cl_event evt;
-//     PYOPENCL_RETRY_IF_MEM_ERROR(
-//       PYOPENCL_CALL_GUARDED(enqueue_migrate_fn, (
-//             cq.data(),
-//             mem_objects.size(), mem_objects.empty( ) ? nullptr : &mem_objects.front(),
-//             flags,
-//             PYOPENCL_WAITLIST_ARGS, &evt
-//             ));
-//       );
-//     PYOPENCL_RETURN_NEW_EVENT(evt);
-//   }
-// #endif
-
 // }}}
 
 }