diff --git a/TODOs b/TODOs
index ab94abae53e9e63a9236c8514b8b892521c78b81..22ae0413d64cfffc49e00acf09259bbab7eb7da2 100644
--- a/TODOs
+++ b/TODOs
@@ -13,7 +13,6 @@
 - _Program.compile
 - _Program.link
 - _Program.all_kernels
-- Kernel.get_arg_info
 - ?LocalMemory
 - get_apple_cgl_share_group
 - GLBuffer
diff --git a/pyopencl/c_wrapper/wrap_cl_core.h b/pyopencl/c_wrapper/wrap_cl_core.h
index 40ac1fc6086be15a21e01570a103ee15b5fc72de..f2b926039b9370e214d8a05b4de1f987aeead332 100644
--- a/pyopencl/c_wrapper/wrap_cl_core.h
+++ b/pyopencl/c_wrapper/wrap_cl_core.h
@@ -123,6 +123,8 @@ error *kernel__set_arg_buf(clobj_t kernel, cl_uint arg_index,
 error *kernel__get_work_group_info(clobj_t kernel,
                                    cl_kernel_work_group_info param,
                                    clobj_t device, generic_info *out);
+error *kernel__get_arg_info(clobj_t _knl, cl_uint idx,
+                            cl_kernel_arg_info param, generic_info *out);
 // Image
 error *create_image_2d(clobj_t *image, clobj_t context, cl_mem_flags flags,
                        cl_image_format *fmt, size_t width, size_t height,
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index d1fc6bee92a11c56bd940985acfcf681162160fa..ca7d20ef130375b3f328839243a1a420347651aa 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -910,6 +910,11 @@ class Kernel(_Common):
             self.ptr, param, device.ptr, info))
         return _generic_info_to_python(info)
 
+    def get_arg_info(self, idx, param):
+        info = _ffi.new('generic_info*')
+        _handle_error(_lib.kernel__get_arg_info(self.ptr, idx, param, info))
+        return _generic_info_to_python(info)
+
 # }}}
 
 
diff --git a/src/c_wrapper/kernel.cpp b/src/c_wrapper/kernel.cpp
index 7de0343abed37a2d56f692e11b1334f6e3e36e7b..3e94cdbfe704ac27dbda52628fbe0845ac4e9643 100644
--- a/src/c_wrapper/kernel.cpp
+++ b/src/c_wrapper/kernel.cpp
@@ -67,6 +67,26 @@ kernel::get_work_group_info(cl_kernel_work_group_info param,
     }
 }
 
+#if PYOPENCL_CL_VERSION >= 0x1020
+PYOPENCL_USE_RESULT generic_info
+kernel::get_arg_info(cl_uint idx, cl_kernel_arg_info param) const
+{
+    switch (param) {
+    case CL_KERNEL_ARG_ADDRESS_QUALIFIER:
+        return pyopencl_get_int_info(cl_kernel_arg_address_qualifier,
+                                     KernelArg, this, idx, param);
+    case CL_KERNEL_ARG_ACCESS_QUALIFIER:
+        return pyopencl_get_int_info(cl_kernel_arg_access_qualifier,
+                                     KernelArg, this, idx, param);
+    case CL_KERNEL_ARG_TYPE_NAME:
+    case CL_KERNEL_ARG_NAME:
+        return pyopencl_get_str_info(KernelArg, this, idx, param);
+    default:
+        throw clerror("Kernel.get_arg_info", CL_INVALID_VALUE);
+    }
+}
+#endif
+
 }
 
 // c wrapper
@@ -137,6 +157,18 @@ kernel__get_work_group_info(clobj_t _knl, cl_kernel_work_group_info param,
         });
 }
 
+#if PYOPENCL_CL_VERSION >= 0x1020
+error*
+kernel__get_arg_info(clobj_t _knl, cl_uint idx, cl_kernel_arg_info param,
+                     generic_info *out)
+{
+    auto knl = static_cast<kernel*>(_knl);
+    return c_handle_error([&] {
+            *out = knl->get_arg_info(idx, param);
+        });
+}
+#endif
+
 error*
 enqueue_nd_range_kernel(clobj_t *evt, clobj_t _queue, clobj_t _knl,
                         cl_uint work_dim, const size_t *global_work_offset,
diff --git a/src/c_wrapper/kernel.h b/src/c_wrapper/kernel.h
index fda782d048d370560672981abdc7256ea7656c6e..c297dae69e33eb5d4b2293e3cb6dfc6b3e8ce186 100644
--- a/src/c_wrapper/kernel.h
+++ b/src/c_wrapper/kernel.h
@@ -33,34 +33,10 @@ public:
     get_work_group_info(cl_kernel_work_group_info param,
                         const device *dev) const;
 
-    // #if PYOPENCL_CL_VERSION >= 0x1020
-    //       py::object get_arg_info(
-    //           cl_uint arg_index,
-    //           cl_kernel_arg_info param_name
-    //           ) const
-    //       {
-    //         switch (param_name)
-    //         {
-    // #define PYOPENCL_FIRST_ARG data(), arg_index // hackety hack
-    //           case CL_KERNEL_ARG_ADDRESS_QUALIFIER:
-    //             PYOPENCL_GET_INTEGRAL_INFO(KernelArg,
-    //                 PYOPENCL_FIRST_ARG, param_name,
-    //                 cl_kernel_arg_address_qualifier);
-
-    //           case CL_KERNEL_ARG_ACCESS_QUALIFIER:
-    //             PYOPENCL_GET_INTEGRAL_INFO(KernelArg,
-    //                 PYOPENCL_FIRST_ARG, param_name,
-    //                 cl_kernel_arg_access_qualifier);
-
-    //           case CL_KERNEL_ARG_TYPE_NAME:
-    //           case CL_KERNEL_ARG_NAME:
-    //             PYOPENCL_GET_STR_INFO(KernelArg, PYOPENCL_FIRST_ARG, param_name);
-    // #undef PYOPENCL_FIRST_ARG
-    //           default:
-    //             throw error("Kernel.get_arg_info", CL_INVALID_VALUE);
-    //         }
-    //       }
-    // #endif
+#if PYOPENCL_CL_VERSION >= 0x1020
+    PYOPENCL_USE_RESULT generic_info
+    get_arg_info(cl_uint idx, cl_kernel_arg_info param) const;
+#endif
 };
 
 extern template void print_clobj<kernel>(std::ostream&, const kernel*);