diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py
index d117daf5109324a88b7c3a6c08bf2d9961ae3ae4..6eef793c7cf8294e7f8fad11a0757d59898d7ac7 100644
--- a/loopy/codegen/__init__.py
+++ b/loopy/codegen/__init__.py
@@ -456,7 +456,10 @@ def generate_code_v2(kernel):
             allow_complex=allow_complex,
             var_name_generator=kernel.get_var_name_generator(),
             is_generating_device_code=False,
-            gen_program_name=kernel.name,
+            gen_program_name=(
+                kernel.target.host_program_name_prefix
+                + kernel.name
+                + kernel.target.host_program_name_suffix),
             schedule_index_end=len(kernel.schedule))
 
     from loopy.codegen.result import generate_host_or_device_program
diff --git a/loopy/codegen/device_mapping.py b/loopy/codegen/device_mapping.py
index af6f9712a73da22cdc461a76444adaf0dd4b9e6e..2ea3831694418e0b13323c2bc6da64bfe3cf7e7c 100644
--- a/loopy/codegen/device_mapping.py
+++ b/loopy/codegen/device_mapping.py
@@ -37,7 +37,9 @@ def map_schedule_onto_host_or_device(kernel):
     from functools import partial
     kernel_name_gen = partial(
             kernel.get_var_name_generator(),
-            kernel.name + kernel.target.device_program_name_suffix)
+            kernel.target.device_program_name_prefix
+            + kernel.name
+            + kernel.target.device_program_name_suffix)
 
     from loopy.schedule import (
         RunInstruction, EnterLoop, LeaveLoop, Barrier,
diff --git a/loopy/compiled.py b/loopy/compiled.py
index 3ef3ee27dd77daff398303a1715882199b8ec6d4..4111b8f530cbc4c8e7fb8d79aabf005a44924574 100644
--- a/loopy/compiled.py
+++ b/loopy/compiled.py
@@ -542,8 +542,10 @@ def generate_arg_setup(gen, kernel, implemented_data_info, options):
 # }}}
 
 
-def generate_invoker(kernel, implemented_data_info, host_code):
+def generate_invoker(kernel, codegen_result):
     options = kernel.options
+    implemented_data_info = codegen_result.implemented_data_info
+    host_code = codegen_result.host_code()
 
     system_args = [
             "_lpy_cl_kernels", "queue", "allocator=None", "wait_for=None",
@@ -580,7 +582,7 @@ def generate_invoker(kernel, implemented_data_info, host_code):
 
     gen("_lpy_evt = {kernel_name}({args})"
             .format(
-                kernel_name=kernel.name,
+                kernel_name=codegen_result.host_program.name,
                 args=", ".join(
                     ["_lpy_cl_kernels", "queue"]
                     + args
@@ -754,11 +756,7 @@ class CompiledKernel:
                 kernel=kernel,
                 cl_kernels=cl_kernels,
                 implemented_data_info=codegen_result.implemented_data_info,
-                invoker=generate_invoker(
-                    kernel,
-                    codegen_result.implemented_data_info,
-                    codegen_result.host_code(),
-                    ))
+                invoker=generate_invoker(kernel, codegen_result))
 
     # {{{ debugging aids
 
diff --git a/loopy/target/__init__.py b/loopy/target/__init__.py
index b20967f67dac4482ddd3a0a148e35f6e9d744be8..3ec3a50b11f72a2975ac4366d495326bfcb69b37 100644
--- a/loopy/target/__init__.py
+++ b/loopy/target/__init__.py
@@ -81,7 +81,9 @@ class TargetBase(object):
 
     # }}}
 
+    host_program_name_prefix = ""
     host_program_name_suffix = "_outer"
+    device_program_name_prefix = ""
     device_program_name_suffix = ""
 
     def split_kernel_at_global_barriers(self):
diff --git a/loopy/target/pyopencl.py b/loopy/target/pyopencl.py
index 7939dc764114387a2d1f2a10bf361fd7d06c13ba..a0f0767880ac62d57aad7d327364df0f871b68cc 100644
--- a/loopy/target/pyopencl.py
+++ b/loopy/target/pyopencl.py
@@ -269,6 +269,9 @@ class PyOpenCLTarget(OpenCLTarget):
     warnings) and support for complex numbers.
     """
 
+    host_program_name_prefix = "_lpy_host_"
+    host_program_name_suffix = ""
+
     def __init__(self, device=None, pyopencl_module_name="_lpy_cl"):
         # This ensures the dtype registry is populated.
         import pyopencl.tools  # noqa
diff --git a/loopy/version.py b/loopy/version.py
index 627329e2c54a62ed2af6358f1d7e94fd7e9624c5..7aaa9ca7929dc8102ab94382e9cb9627c847dba6 100644
--- a/loopy/version.py
+++ b/loopy/version.py
@@ -32,4 +32,4 @@ except ImportError:
 else:
     _islpy_version = islpy.version.VERSION_TEXT
 
-DATA_MODEL_VERSION = "v29-islpy%s" % _islpy_version
+DATA_MODEL_VERSION = "v31-islpy%s" % _islpy_version