diff --git a/pyopencl/__init__.py b/pyopencl/__init__.py
index b6e5ea835f0ef4cc9676cce67b6998b204bc0231..0c3df5f952567d087a4b531ed0f17b3d69a14186 100644
--- a/pyopencl/__init__.py
+++ b/pyopencl/__init__.py
@@ -675,10 +675,15 @@ def _add_functionality():
             prg = prg._get_prg()
 
         kernel_old_init(self, prg, name)
+
+        self._setup(prg)
+
+    def kernel__setup(self, prg):
         self._source = getattr(prg, "_source", None)
 
         self._generate_naive_call()
         self._wg_info_cache = {}
+        return self
 
     def kernel_get_work_group_info(self, param, device):
         try:
@@ -993,6 +998,7 @@ def _add_functionality():
                 *args, **kwargs)
 
     Kernel.__init__ = kernel_init
+    Kernel._setup = kernel__setup
     Kernel.get_work_group_info = kernel_get_work_group_info
     Kernel._set_set_args_body = kernel__set_set_args_body
     Kernel._generate_buffer_arg_setter = kernel__generate_buffer_arg_setter
diff --git a/pyopencl/cffi_cl.py b/pyopencl/cffi_cl.py
index 5cef0a0f8e27001479fd5d3a3a36f0e6e0f1b319..5194f0b1715e902e4afd1b541b027e950f383a65 100644
--- a/pyopencl/cffi_cl.py
+++ b/pyopencl/cffi_cl.py
@@ -1045,7 +1045,11 @@ class _Program(_Common):
         knls = _CArray(_ffi.new('clobj_t**'))
         _handle_error(_lib.program__all_kernels(
             self.ptr, knls.ptr, knls.size))
-        return [Kernel._create(knls.ptr[0][i]) for i in range(knls.size[0])]
+        return [
+                Kernel
+                ._create(knls.ptr[0][i])
+                ._setup(self)
+                for i in range(knls.size[0])]
 
 # }}}