Index: trunk/psModules/src/concepts/pmConceptsUpdate.c
===================================================================
--- trunk/psModules/src/concepts/pmConceptsUpdate.c	(revision 11749)
+++ trunk/psModules/src/concepts/pmConceptsUpdate.c	(revision 12589)
@@ -25,41 +25,38 @@
         // Check for cell concepts updates
 
+	bool xStatus, yStatus; // Status of MD lookups
+	psImageBinning *binning = psImageBinningAlloc();
+	binning->nXbin = psMetadataLookupS32(&xStatus, cell->concepts, "CELL.XBIN");
+	binning->nYbin = psMetadataLookupS32(&yStatus, cell->concepts, "CELL.YBIN");
+	if (!xStatus || !yStatus) {
+	    // XXX should this be an error condition?
+	    psFree (binning);
+	    return true;
+	}
+	if (!binning->nXbin || !binning->nXbin) {
+	    // XXX should this be an error condition?
+	    psFree (binning);
+	    return true;
+	}
+
         // CELL.TRIMSEC needs to be updated for the binning
         if (psMetadataLookup(cell->concepts, "CELL.TRIMSEC.UPDATE")) {
-            bool xStatus, yStatus; // Status of MD lookups
-            int xBin = psMetadataLookupS32(&xStatus, cell->concepts, "CELL.XBIN");
-            int yBin = psMetadataLookupS32(&yStatus, cell->concepts, "CELL.YBIN");
-            if (xStatus && yStatus && xBin != 0 && yBin != 0) {
-                psRegion *trimsec = psMetadataLookupPtr(NULL, cell->concepts, "CELL.TRIMSEC"); // Trim section
-                trimsec->x0 /= xBin;
-                trimsec->x1 /= xBin;
-                trimsec->y0 /= yBin;
-                trimsec->y1 /= yBin;
-
-                psMetadataRemoveKey(cell->concepts, "CELL.TRIMSEC.UPDATE");
-            }
+	    psRegion *trimsec = psMetadataLookupPtr(NULL, cell->concepts, "CELL.TRIMSEC"); // Trim section
+	    *trimsec = psImageBinningSetRuffRegion (binning, *trimsec);
+	    psMetadataRemoveKey(cell->concepts, "CELL.TRIMSEC.UPDATE");
         }
 
         // CELL.BIASSEC needs to be updated for the binning
         if (psMetadataLookup(cell->concepts, "CELL.BIASSEC.UPDATE")) {
-            bool xStatus, yStatus; // Status of MD lookups
-            int xBin = psMetadataLookupS32(&xStatus, cell->concepts, "CELL.XBIN");
-            int yBin = psMetadataLookupS32(&yStatus, cell->concepts, "CELL.YBIN");
-            if (xStatus && yStatus && xBin != 0 && yBin != 0) {
-                psList *biassecs = psMetadataLookupPtr(NULL, cell->concepts, "CELL.BIASSEC"); // Bias sections
-                psListIterator *biassecsIter = psListIteratorAlloc(biassecs, PS_LIST_HEAD, true); // Iterator
-                psRegion *bias; // Bias region, from iteration
-                while ((bias = psListGetAndIncrement(biassecsIter))) {
-                    bias->x0 /= xBin;
-                    bias->x1 /= xBin;
-                    bias->y0 /= yBin;
-                    bias->y1 /= yBin;
-                }
-                psFree(biassecsIter);
-
-                psMetadataRemoveKey(cell->concepts, "CELL.BIASSEC.UPDATE");
-            }
+	    psList *biassecs = psMetadataLookupPtr(NULL, cell->concepts, "CELL.BIASSEC"); // Bias sections
+	    psListIterator *biassecsIter = psListIteratorAlloc(biassecs, PS_LIST_HEAD, true); // Iterator
+	    psRegion *biassec; // Bias region, from iteration
+	    while ((biassec = psListGetAndIncrement(biassecsIter))) {
+		*biassec = psImageBinningSetRuffRegion (binning, *biassec);
+	    }
+	    psFree(biassecsIter);
+	    psMetadataRemoveKey(cell->concepts, "CELL.BIASSEC.UPDATE");
         }
-
+	psFree (binning);
     }
 
