Index: trunk/ppImage/src/ppImage.h
===================================================================
--- trunk/ppImage/src/ppImage.h	(revision 24891)
+++ trunk/ppImage/src/ppImage.h	(revision 24892)
@@ -37,4 +37,5 @@
     bool doShutter;                     // Shutter correction
     bool doFlat;                        // Flat-field normalisation
+    bool doPattern;                     // Pattern noise subtraction
     bool doFringe;                      // Fringe subtraction
     bool doPhotom;                      // Source identification and photometry
@@ -44,5 +45,5 @@
     bool doStats;                       // call ppStats on the image
     bool checkCTE;                      // measure pixel-based variance
-    bool applyParity;			// Apply Cell parities
+    bool applyParity;                   // Apply Cell parities
 
     bool doCrosstalkMeasure;            // measure crosstalk signal
@@ -93,4 +94,11 @@
     float fringeKeep;                   // Fringe keep fraction
 
+    // Pattern noise subtraction
+    int patternOrder;                   // Polynomial order
+    int patternIter;                    // Clipping iterations
+    float patternRej;                   // Clipping threshold
+    psStatsOptions patternMean;         // Statistic for mean
+    psStatsOptions patternStdev;        // Statistic for stdev
+
     int remnanceSize;                   // Size for remnance detection
     float remnanceThresh;               // Threshold for remnance detection
Index: trunk/ppImage/src/ppImageDetrendReadout.c
===================================================================
--- trunk/ppImage/src/ppImageDetrendReadout.c	(revision 24891)
+++ trunk/ppImage/src/ppImageDetrendReadout.c	(revision 24892)
@@ -126,12 +126,10 @@
     // Pattern noise correction
     if (options->doPattern) {
-        if (!pmPatternRow(input, options->patternOrder, 
-options->patternIter, options->patternRej, options->patternMean, 
-options->patternStdev)) {
-                psFree(detview);
-                return false;
-            }
-        }
-
+        if (!pmPatternRow(input, options->patternOrder, options->patternIter, options->patternRej,
+                          options->patternMean, options->patternStdev)) {
+            psFree(detview);
+            return false;
+        }
+    }
 
     // Normalization by a single (known) constant
Index: trunk/ppImage/src/ppImageOptions.c
===================================================================
--- trunk/ppImage/src/ppImageOptions.c	(revision 24891)
+++ trunk/ppImage/src/ppImageOptions.c	(revision 24892)
@@ -31,4 +31,5 @@
     options->doShutter       = false;   // Shutter correction
     options->doFlat          = false;   // Flat-field normalisation
+    options->doPattern       = false;   // Pattern noise subtraction
     options->doFringe        = false;   // Fringe subtraction
     options->doPhotom        = false;   // Source identification and photometry
@@ -86,4 +87,12 @@
     options->fringeIter      = 0;       // Fringe iterations
     options->fringeKeep      = 1.0;     // Fringe keep fraction
+
+    // Pattern noise values
+
+    options->patternOrder    = 0;       // Polynomial order
+    options->patternIter     = 0;       // Clipping iterations
+    options->patternRej      = NAN;     // Clipping rejection threshold
+    options->patternMean     = PS_STAT_NONE; // Statistic for mean
+    options->patternStdev    = PS_STAT_NONE; // Statistic for standard deviation
 
     // Remnance values
@@ -225,4 +234,5 @@
     options->doFringe = psMetadataLookupBool(NULL, recipe, "FRINGE");
     options->doShutter = psMetadataLookupBool(NULL, recipe, "SHUTTER");
+    options->doPattern = psMetadataLookupBool(NULL, recipe, "PATTERN");
 
     options->doStats = false;
@@ -298,4 +308,11 @@
     options->fringeKeep = psMetadataLookupF32(NULL, recipe, "FRINGE.KEEP");
 
+    // Pattern noise
+    options->patternOrder = psMetadataLookupS32(NULL, recipe, "PATTERN.ORDER");
+    options->patternIter = psMetadataLookupS32(NULL, recipe, "PATTERN.ITER");
+    options->patternRej = psMetadataLookupF32(NULL, recipe, "PATTERN.REJ");
+    options->patternMean = psStatsOptionFromString(psMetadataLookupStr(NULL, recipe, "PATTERN.MEAN"));
+    options->patternStdev = psStatsOptionFromString(psMetadataLookupStr(NULL, recipe, "PATTERN.STDEV"));
+
     // Remnance options
     options->remnanceSize = psMetadataLookupF32(NULL, recipe, "REMNANCE.SIZE");
