diff --git a/src/calng/AgipdCorrection.py b/src/calng/AgipdCorrection.py
index c9442d4b0c7bc1ac9e0ac0c330a549eaca17f8e5..70fca7bf34df21dd53f4b042c2ff1eabfa53051e 100644
--- a/src/calng/AgipdCorrection.py
+++ b/src/calng/AgipdCorrection.py
@@ -153,6 +153,20 @@ class AgipdCorrection(BaseCorrection):
                 .reconfigurable()
                 .commit()
             )
+        (
+            STRING_ELEMENT(expected)
+            .key("corrections.badPixelMaskValue")
+            .displayedName("Bad pixel masking value")
+            .description(
+                "Any pixels masked by the bad pixel mask will have their value "
+                "replaced with this. Note that this setting is evaluated as a string; "
+                "use float('nan') to get NaN value."
+            )
+            .assignmentOptional()
+            .defaultValue("float('nan')")
+            .reconfigurable()
+            .commit()
+        )
 
     @property
     def input_data_shape(self):
@@ -177,7 +191,11 @@ class AgipdCorrection(BaseCorrection):
     def __init__(self, config):
         # TODO: different gpu runner for fixed gain mode
         self.gain_mode = AgipdGainMode[config.get("gainMode")]
-        self._gpu_runner_init_args = {"gain_mode": self.gain_mode}
+        self.bad_pixel_mask_value = eval(config.get("corrections.badPixelMaskValue"))
+        self._gpu_runner_init_args = {
+            "gain_mode": self.gain_mode,
+            "bad_pixel_mask_value": self.bad_pixel_mask_value,
+        }
 
         super().__init__(config)
         self._output_transpose = {
@@ -389,6 +407,11 @@ class AgipdCorrection(BaseCorrection):
             for path in config.getPaths()
         ):
             self._has_updated_bad_pixel_selection = False
+        if config.has("corrections.badPixelMaskValue"):
+            self.bad_pixel_mask_value = eval(
+                config.get("corrections.badPixelMaskValue")
+            )
+            self.gpu_runner.set_bad_pixel_mask_value(self.bad_pixel_mask_value)
 
     def postReconfigure(self):
         super().postReconfigure()
@@ -405,4 +428,6 @@ class AgipdCorrection(BaseCorrection):
 
         if not self._has_updated_bad_pixel_selection:
             self._update_bad_pixel_selection()
-            self.gpu_runner.override_bad_pixel_flags_to_use(self._override_bad_pixel_flags)
+            self.gpu_runner.override_bad_pixel_flags_to_use(
+                self._override_bad_pixel_flags
+            )
diff --git a/src/calng/agipd_gpu.py b/src/calng/agipd_gpu.py
index 60d0cd1c0e0a0c0fb537922817942083d9a5ecd5..b8fbc6c7876d3ac678b1e927d55f841ce64a2720 100644
--- a/src/calng/agipd_gpu.py
+++ b/src/calng/agipd_gpu.py
@@ -36,7 +36,7 @@ class AgipdGpuRunner(base_gpu.BaseGpuRunner):
         output_transpose=(1, 2, 0),  # default: memorycells-fast
         input_data_dtype=cupy.uint16,
         output_data_dtype=cupy.float32,
-        bad_pixel_mask_value=cupy.float32(cupy.nan),
+        bad_pixel_mask_value=cupy.nan,
         gain_mode=AgipdGainMode.ADAPTIVE_GAIN,
     ):
         self.gain_mode = gain_mode
@@ -70,7 +70,7 @@ class AgipdGpuRunner(base_gpu.BaseGpuRunner):
         self.md_additional_offset_gpu = cupy.zeros(self.map_shape, dtype=cupy.float32)
         self.rel_gain_xray_map_gpu = cupy.ones(self.map_shape, dtype=cupy.float32)
         self.bad_pixel_map_gpu = cupy.zeros(self.gm_map_shape, dtype=cupy.uint32)
-        self.bad_pixel_mask_value = bad_pixel_mask_value  # TODO: make this configurable
+        self.set_bad_pixel_mask_value(bad_pixel_mask_value)
 
         self.update_block_size((1, 1, 64))
 
@@ -212,6 +212,9 @@ class AgipdGpuRunner(base_gpu.BaseGpuRunner):
             f"Percentage of bad pixels now: {cupy.count_nonzero(self.bad_pixel_map_gpu) / self.bad_pixel_map_gpu.size * 100:.02f}"
         )
 
+    def set_bad_pixel_mask_value(self, mask_value):
+        self.bad_pixel_mask_value = cupy.float32(mask_value)
+
     def flush_buffers(self):
         self.offset_map_gpu.fill(0)
         self.rel_gain_pc_map_gpu.fill(1)