diff --git a/python/dune/codegen/options.py b/python/dune/codegen/options.py
index 18fbebab787e6c470fe4672786a72433331d5260..40f2d1a520ca5506604d8f5ec98709d692b75fc3 100644
--- a/python/dune/codegen/options.py
+++ b/python/dune/codegen/options.py
@@ -108,6 +108,10 @@ class CodegenFormOptionsArray(ImmutableRecord):
     control_variable = CodegenOption(default=None, helpstr="Name of control variable in UFL file")
     block_preconditioner_diagonal = CodegenOption(default=False, helpstr="Whether this operator should implement the diagonal part of a block preconditioner")
     block_preconditioner_offdiagonal = CodegenOption(default=False, helpstr="Whether this operator should implement the off-diagonal part of a block preconditioner")
+    enable_volume = CodegenOption(default=True, helpstr="Whether to assemble volume integrals")
+    enable_skeleton = CodegenOption(default=True, helpstr="Whether to assemble skeleton integrals")
+    enable_boundary = CodegenOption(default=True, helpstr="Whether to assemble boundary integrals")
+
 
 # Until more sophisticated logic is needed, we keep the actual option data in this module
 _global_options = CodegenGlobalOptionsArray()
diff --git a/python/dune/codegen/pdelab/localoperator.py b/python/dune/codegen/pdelab/localoperator.py
index 3b8b8f9cb2100762768d839a2dbbaba263784973..12793f96977e46ccb252285454f11344810892bc 100644
--- a/python/dune/codegen/pdelab/localoperator.py
+++ b/python/dune/codegen/pdelab/localoperator.py
@@ -776,6 +776,15 @@ def local_operator_default_settings(operator, form):
                    .format(rf), classtag="operator")
 
 
+def measure_is_enabled(measure):
+    option_dict = {"cell": "enable_volume",
+                   "interior_facet": "enable_skeleton",
+                   "exterior_facet": "enable_boundary",
+                   }
+
+    return get_form_option(option_dict[measure])
+
+
 def generate_residual_kernels(form, original_form):
     if not get_form_option("generate_residuals"):
         return {}
@@ -787,6 +796,10 @@ def generate_residual_kernels(form, original_form):
         # Generate the necessary residual methods
         for measure in set(i.integral_type() for i in form.integrals()):
             logger.info("generate_residual_kernels: measure {}".format(measure))
+
+            if not measure_is_enabled(measure):
+                continue
+
             with global_context(integral_type=measure):
                 from dune.codegen.pdelab.signatures import assembler_routine_name
                 with global_context(kernel=assembler_routine_name()):
@@ -897,6 +910,9 @@ def generate_jacobian_kernels(form, original_form):
                     if get_form_option("sumfact_regular_jacobians"):
                         set_form_option("sumfact", False)
                 for measure in set(i.integral_type() for i in jacform.integrals()):
+                    if not measure_is_enabled(measure):
+                        continue
+
                     logger.info("generate_jacobian_kernels: measure {}".format(measure))
                     with global_context(integral_type=measure):
                         from dune.codegen.pdelab.signatures import assembler_routine_name
@@ -930,6 +946,9 @@ def generate_control_kernels(forms):
 
         # Generate the necessary residual methods
         for measure in set(i.integral_type() for form in forms for i in form.integrals()):
+            if not measure_is_enabled(measure):
+                continue
+
             logger.info("generate_control_kernels: measure {}".format(measure))
             with global_context(integral_type=measure):
                 from dune.codegen.pdelab.signatures import assembler_routine_name