Index: trunk/ppImage/src/ppImageLoop.c
===================================================================
--- trunk/ppImage/src/ppImageLoop.c	(revision 9871)
+++ trunk/ppImage/src/ppImageLoop.c	(revision 9952)
@@ -6,4 +6,5 @@
 #include "ppImage.h"
 #include "ppImageDetrendFringe.h"
+
 
 bool ppImageLoop (pmConfig *config, ppImageOptions *options) {
@@ -45,30 +46,8 @@
         if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
 
-        const char *chipName = psMetadataLookupStr(NULL, chip->concepts, "CHIP.NAME"); // Name of chip
-        psArray *fringeRef = NULL;      // Array of array of fringe statistics for reference --- for each cell
-        psArray *fringeSci = NULL;      // Array of fringe statistics for science --- for each cell
-        if (options->doFringe) {
-            fringeRef = psArrayAlloc(chip->cells->n);
-            fringeSci = psArrayAlloc(chip->cells->n);
-        }
-
         while ((cell = pmFPAviewNextCell (view, input->fpa, 1)) != NULL) {
             psLogMsg ("ppImageLoop", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process);
             if (!cell->process || !cell->file_exists) { continue; }
             if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
-            const char *cellName = psMetadataLookupStr(NULL, cell->concepts, "CELL.NAME"); // Name of cell
-
-            if (options->doFringe) {
-                pmFPAfile *fringeFile = psMetadataLookupPtr(&status, config->files, "PPIMAGE.FRINGE");
-                if (!status || !fringeFile) {
-                    psErrorStackPrint(stderr, "Can't find fringe data!\n");
-                    exit(EXIT_FAILURE);
-                }
-
-                psString fringeExt = NULL; // Fringe extension name
-                psStringAppend(&fringeExt, "FRINGE_%s_%s", chipName, cellName);
-                fringeRef->data[view->cell] = pmFringesReadFits(NULL, fringeFile->fits, fringeExt);
-                psFree(fringeExt);
-            }
 
             // process each of the readouts
@@ -80,17 +59,13 @@
                 if (!ppImageDetrendReadout (config, options, view)) return false;
 
-                if (options->doFringe) {
-                    ppImageDetrendFringeMeasure((pmFringeStats**)(&fringeSci->data[view->cell]),
-                                                fringeRef->data[view->cell], readout, options);
-                }
             }
         }
 
         // Solve the fringe system
-        pmFringeScale *fringeSoln = NULL; // Solution for the fringes
         if (options->doFringe) {
-            fringeSoln = ppImageDetrendFringeSolve(fringeSci, fringeRef, options);
-            psFree(fringeSci);
-            psFree(fringeRef);
+            pmChip *fringe = pmFPAfileThisChip(config->files, view, "PPIMAGE.FRINGE");
+            if (!ppImageDetrendFringeSolve(chip, fringe, options)) {
+                return false;
+            }
         }
 
@@ -103,8 +78,6 @@
             if (options->doFringe) {
                 psTrace("ppImage", 3, "Applying fringe correction...\n");
-                bool mdok;                          // Status of MD lookup
-                pmFPAfile *fringeFile = psMetadataLookupPtr(&mdok, config->files, "PPIMAGE.FRINGE");
-                pmCell *fringeCell = pmFPAviewThisCell(view, fringeFile->fpa);
-                psImage *fringe = ppImageDetrendFringeGenerate(cell, fringeCell, fringeSoln);
+                pmCell *fringeCell = pmFPAfileThisCell(config->files, view, "PPIMAGE.FRINGE");
+                psImage *fringe = ppImageDetrendFringeGenerate(cell, fringeCell);
                 while ((readout = pmFPAviewNextReadout (view, input->fpa, 1)) != NULL) {
                     if (!readout->data_exists) { continue; }
@@ -125,5 +98,4 @@
             if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
         }
-        psFree(fringeSoln);
 
         ppImageMosaicChip (config, view, "PPIMAGE.OUTPUT.CHIP", "PPIMAGE.OUTPUT");
@@ -163,5 +135,6 @@
     if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
 
-    psFree (view);
+    psFree(view);
+
     return true;
 }
