Index: trunk/psModules/src/detrend/pmOverscan.c
===================================================================
--- trunk/psModules/src/detrend/pmOverscan.c	(revision 23989)
+++ trunk/psModules/src/detrend/pmOverscan.c	(revision 38227)
@@ -295,5 +295,15 @@
 	psMetadataAddF32(hdu->header, PS_LIST_TAIL, "OVER_SIG", PS_META_REPLACE, "Overscan stdev", NAN);
 
-	(void)psBinaryOp(image, image, "-", psScalarAlloc((float)reduced, PS_TYPE_F32));
+	psScalar *reducedScalar = psScalarAlloc(reduced, PS_TYPE_F32);
+	(void)psBinaryOp (image, image, "-", , reducedScalar);
+
+	// subtract the measured value from each overscan region as well
+	iter = psListIteratorAlloc(overscans, PS_LIST_HEAD, false); // Iterator
+	overscan = NULL;   // Overscan image from iterator
+	while ((overscan = psListGetAndIncrement(iter))) {
+	  (void)psBinaryOp(overscan, overscan, "-", reducedScalar);
+	}
+	psFree(iter);
+
 	psFree(stats);
 	return true;
@@ -375,4 +385,23 @@
 	    }
 	}
+
+	// subtract from the overscan regions
+	{
+	  psListIterator *iter = psListIteratorAlloc(overscans, PS_LIST_HEAD, false); // Iterator
+	  psImage *overscan = NULL; // Overscan image from iterator
+	  while ((overscan = psListGetAndIncrement(iter))) {
+	    // the overscan and image might not be aligned.
+	    int diff = overscan->row0 - image->row0; // Offset between the two regions
+	    for (int i = PS_MAX(0,diff); i < PS_MIN(image->numRows, overscan->numRows + diff); i++) {
+	      int j = i - diff;
+	      // i is row on image
+	      // j is row on overscan
+	      for (int k = 0; i < overscan->numCols; k++) {
+		overscan->data.F32[j][k] -= reduced->data.F32[j];
+	      }
+	    }
+	  }
+	  psFree(iter);
+	}
 	psFree(reduced);
     } 
@@ -441,4 +470,24 @@
 	    }
 	}
+
+	// subtract from the overscan regions
+	{
+	  psListIterator *iter = psListIteratorAlloc(overscans, PS_LIST_HEAD, false); // Iterator
+	  psImage *overscan = NULL; // Overscan image from iterator
+	  while ((overscan = psListGetAndIncrement(iter))) {
+	    // the overscan and image might not be aligned.
+	    int diff = overscan->col0 - image->col0; // Offset between the two regions
+	    for (int i = PS_MAX(0,diff); i < PS_MIN(image->numCols, overscan->numCols + diff); i++) {
+	      int j = i - diff;
+	      // i is col on image
+	      // j is col on overscan
+	      for (int k = 0; i < overscan->numRows; k++) {
+		overscan->data.F32[k][j] -= reduced->data.F32[j];
+	      }
+	    }
+	  }
+	  psFree(iter);
+	}
+
 	psFree(reduced);
     }
