Index: trunk/ppSim/src/ppSimBadPixels.c
===================================================================
--- trunk/ppSim/src/ppSimBadPixels.c	(revision 15602)
+++ trunk/ppSim/src/ppSimBadPixels.c	(revision 20910)
@@ -9,4 +9,11 @@
 
 #include "ppSim.h"
+
+// Mode for bad pixels
+typedef enum {
+    BADPIX_ERROR,                       // Error: mode not set
+    BADPIX_RANDOM,                      // Random values for bad pixels
+    BADPIX_NAN,                         // NAN values for bad pixels
+} badpixMode;
 
 
@@ -46,4 +53,25 @@
     }
 
+    int size = psMetadataLookupS32(&mdok, recipe, "BADPIX.SIZE"); // (Half-)size of bad pixels
+    if (!mdok) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "BADPIX.SIZE not set.");
+        return false;
+    }
+
+    psString modeString = psMetadataLookupStr(&mdok, recipe, "BADPIX.MODE"); // Mode for bad pixels
+    if (!mdok) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "BADPIX.MODE not set.");
+        return false;
+    }
+    badpixMode mode = BADPIX_ERROR;
+    if (strcmp(modeString, "RANDOM") == 0) {
+        mode = BADPIX_RANDOM;
+    } else if (strcmp(modeString, "NAN") == 0) {
+        mode = BADPIX_NAN;
+    } else {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "BADPIX.MODE not recognised.");
+        return false;
+    }
+
     psRandom *pseudoRNG = psRandomAlloc(PS_RANDOM_TAUS, seed); // Pseudo-random number generator
 
@@ -52,7 +80,22 @@
 
     for (int y = 0; y < numRows; y++) {
+        int vMin = PS_MAX(y - size, 0), vMax = PS_MIN(y + size, numRows - 1); // Extent of CR
         for (int x = 0; x < numCols; x++) {
             if (psRandomUniform(pseudoRNG) < frac) {
-                image->data.F32[y][x] *= psRandomGaussian(rng);
+                int uMin = PS_MAX(x - size, 0), uMax = PS_MIN(x + size, numCols - 1); // Extent of CR
+                for (int v = vMin; v <= vMax; v++) {
+                    for (int u = uMin; u <= uMax; u++) {
+                        switch (mode) {
+                          case BADPIX_RANDOM:
+                            image->data.F32[v][u] *= psRandomGaussian(rng);
+                            break;
+                          case BADPIX_NAN:
+                            image->data.F32[v][u] = NAN;
+                            break;
+                          default:
+                            psAbort("Unrecognised mode: %x", mode);
+                        }
+                    }
+                }
             }
         }
