Index: trunk/psModules/src/camera/Makefile.am
===================================================================
--- trunk/psModules/src/camera/Makefile.am	(revision 19688)
+++ trunk/psModules/src/camera/Makefile.am	(revision 19695)
@@ -28,5 +28,6 @@
 	pmCellSquish.c \
 	pmReadoutStack.c \
-	pmReadoutFake.c
+	pmReadoutFake.c \
+	pmFPABin.c
 
 pkginclude_HEADERS = \
@@ -55,5 +56,6 @@
 	pmCellSquish.h \
 	pmReadoutStack.h \
-	pmReadoutFake.h
+	pmReadoutFake.h \
+	pmFPABin.h
 
 CLEANFILES = *~
Index: trunk/psModules/src/camera/pmFPABin.c
===================================================================
--- trunk/psModules/src/camera/pmFPABin.c	(revision 19695)
+++ trunk/psModules/src/camera/pmFPABin.c	(revision 19695)
@@ -0,0 +1,66 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <pslib.h>
+
+#include "pmFPA.h"
+#include "pmFPABin.h"
+
+bool pmReadoutRebin(pmReadout *out, const pmReadout *in, psMaskType maskVal, int xBin, int yBin)
+{
+    PM_ASSERT_READOUT_NON_NULL(out, false);
+    PM_ASSERT_READOUT_NON_NULL(in, false);
+
+    psImage *inImage = in->image, *inMask = in->mask; // Input image
+    int numColsIn = inImage->numCols, numRowsIn = inImage->numRows; // Size of input image
+
+    psImageBinning *binning = psImageBinningAlloc(); // Binning instructions
+    binning->nXbin = xBin;
+    binning->nYbin = yBin;
+    binning->nXfine = numColsIn;
+    binning->nYfine = numRowsIn;
+    psImageBinningSetRuffSize(binning, PS_IMAGE_BINNING_CENTER);
+
+    int numColsOut = binning->nXruff, numRowsOut = binning->nYruff; // Size of output image
+
+    // Output image
+    psImage *outImage = out->image = psImageRecycle(out->image,  numColsOut, numRowsOut, PS_TYPE_F32);
+
+    int yStart = psImageBinningGetFineY(binning, 0); // Starting input y for binning
+    for (int yOut = 0; yOut < numRowsOut; yOut++) {
+        int yStop = psImageBinningGetFineY(binning, yOut + 1); // Stopping input y for binning
+        int xStart = psImageBinningGetFineX(binning, 0); // Starting input x for binning
+        for (int xOut = 0; xOut < numColsOut; xOut++) {
+            int xStop = psImageBinningGetFineX(binning, xOut + 1); // Stopping input x for binning
+
+            float sum = 0.0;            // Sum of pixels
+            int numPix = 0;             // Number of pixels
+            for (int y = yStart; y < yStop; y++) {
+                for (int x = xStart; x < xStop; x++) {
+                    if (inMask && (inMask->data.PS_TYPE_MASK_DATA[y][x] & maskVal)) {
+                        continue;
+                    }
+                    sum += inImage->data.F32[y][x];
+                    numPix++;
+                }
+            }
+
+            if (numPix > 0) {
+                outImage->data.F32[yOut][xOut] = sum / numPix;
+            } else {
+                outImage->data.F32[yOut][xOut] = NAN;
+            }
+        }
+    }
+
+    psFree(binning);
+
+    out->data_exists = true;
+    if (out->parent) {
+        out->parent->data_exists = out->parent->parent->data_exists = true;
+    }
+
+    return true;
+}
Index: trunk/psModules/src/camera/pmFPABin.h
===================================================================
--- trunk/psModules/src/camera/pmFPABin.h	(revision 19695)
+++ trunk/psModules/src/camera/pmFPABin.h	(revision 19695)
@@ -0,0 +1,17 @@
+#ifndef PM_FPA_BIN_H
+#define PM_FPA_BIN_H
+
+#include <pslib.h>
+
+#include <pmFPA.h>
+
+/// Rebin a readout
+bool pmReadoutRebin(pmReadout *out,     ///< Output readout
+                    const pmReadout *in,///< Input readout
+                    psMaskType maskVal, ///< Value to mask
+                    int xBin, int yBin  ///< Binning factors in x and y
+    );
+
+
+
+#endif
Index: trunk/psModules/src/psmodules.h
===================================================================
--- trunk/psModules/src/psmodules.h	(revision 19688)
+++ trunk/psModules/src/psmodules.h	(revision 19695)
@@ -59,4 +59,5 @@
 #include <pmFPAUtils.h>
 #include <pmCellSquish.h>
+#include <pmFPABin.h>
 
 // the following headers are from psModule:detrend
