Index: trunk/psModules/src/camera/pmFPAfileIO.c
===================================================================
--- trunk/psModules/src/camera/pmFPAfileIO.c	(revision 11793)
+++ trunk/psModules/src/camera/pmFPAfileIO.c	(revision 11801)
@@ -107,4 +107,6 @@
         }
     }
+#if 0
+    // This should be done by pmFPAfileBlank
     if (file->mode == PM_FPA_MODE_WRITE) {
         // Want to write out any potential blank
@@ -132,5 +134,5 @@
         psFree(fpa);
     }
-
+#endif
     return true;
 
@@ -475,4 +477,93 @@
 }
 
+bool pmFPAfileBlank(pmFPAfile *file, const pmFPAview *view, pmConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(file, false);
+    PS_ASSERT_PTR_NON_NULL(view, false);
+
+    if (file->state & PM_FPA_STATE_INACTIVE) {
+        psTrace("psModules.camera", 6, "skip blank for %s, files is inactive", file->name);
+        return true;
+    }
+
+    if (file->mode != PM_FPA_MODE_WRITE) {
+        psTrace("psModules.camera", 6, "skip blank for %s, mode is not WRITE", file->name);
+        return true;
+    }
+
+    // an internal file should not be returned to here
+    if (file->mode == PM_FPA_MODE_INTERNAL) {
+        psError(PS_ERR_IO, true, "File is mode PM_FPA_MODE_INTERNAL");
+        return false;
+    }
+
+    if (!file->save) {
+        psTrace("psModules.camera", 6, "skip blank for %s, save is FALSE", file->name);
+        return true;
+    }
+
+    // get the current level
+    pmFPALevel level = pmFPAviewLevel (view);
+
+    if (level != file->fileLevel) {
+        psTrace("psModules.camera", 6, "skip blank for %s, level is %s", file->name,
+                pmFPALevelToName(file->freeLevel));
+        return true;
+    }
+
+    // do we need to open this file?
+    if (!pmFPAfileOpen (file, view, config)) {
+        psError(PS_ERR_IO, false, "failed to open %s", file->filename);
+        return false;
+    }
+
+    switch (file->type) {
+    case PM_FPA_FILE_IMAGE:
+    case PM_FPA_FILE_MASK:
+    case PM_FPA_FILE_WEIGHT:
+    case PM_FPA_FILE_FRINGE:
+    if (file->mode == PM_FPA_MODE_WRITE) {
+        // Want to write out any potential blank
+        pmFPA *fpa = pmFPAfileSuitableFPA(file, view, config); // FPA, ensuring it's ready to write a blank
+
+        switch (file->fileLevel) {
+        case PM_FPA_LEVEL_FPA:
+            pmFPAWrite(fpa, file->fits, NULL, true, false);
+            break;
+        case PM_FPA_LEVEL_CHIP: {
+                pmChip *chip = pmFPAviewThisChip(view, fpa);
+                pmChipWrite(chip, file->fits, NULL, true, false);
+                break;
+            }
+        case PM_FPA_LEVEL_CELL: {
+                pmCell *cell = pmFPAviewThisCell(view, fpa);
+                pmCellWrite(cell, file->fits, NULL, true);
+                break;
+            }
+        default:
+            psAbort("fileLevel not correctly set");
+            break;
+        }
+
+        psFree(fpa);
+    }
+    case PM_FPA_FILE_SX:
+    case PM_FPA_FILE_RAW:
+    case PM_FPA_FILE_OBJ:
+    case PM_FPA_FILE_CMP:
+    case PM_FPA_FILE_CMF:
+    case PM_FPA_FILE_PSF:
+    case PM_FPA_FILE_JPEG:
+    case PM_FPA_FILE_MANAPLOT:
+    case PM_FPA_FILE_KAPA:
+      break;
+    default:
+        fprintf (stderr, "warning: type mismatch\n");
+        return false;
+    }
+    return true;
+}
+
+
 bool pmFPAfileWrite(pmFPAfile *file, const pmFPAview *view, pmConfig *config)
 {
@@ -630,28 +721,20 @@
     case PM_FPA_FILE_WEIGHT:
     case PM_FPA_FILE_FRINGE: {
-	// create FPA structure component based on view
-	// XXX drop this ifdef'ed out code??
-#if 0
-	psMetadata *format = file->format; // Camera format configuration
-	if (!format) {
-	    // It's likely a mosaic, for which we don't yet know the appropriate format
-	    const psMetadata *camera = file->fpa->camera; // Camera configuration
-	    psMetadata *formats = psMetadataLookupMetadata(NULL, camera, "FORMATS"); // The FORMATS
-	    if (!formats) {
-		psError(PS_ERR_UNEXPECTED_NULL, false, "Unable to find FORMATS in camera configuration.\n");
-		return false;
-	    }
-	    format = psMetadataLookupMetadata(NULL, formats, config->formatName);
-	    if (!format) {
-		psError(PS_ERR_UNEXPECTED_NULL, false,
-			"Unable to find format %s in camera configuration.\n", config->formatName);
-		return false;
-	    }
-	    file->format = psMemIncrRefCounter(format);
-	}
-#endif
-	pmFPAAddSourceFromView (file->fpa, view, file->format);
-	psTrace ("pmFPAfile", 5, "created fpa data elements for %s (fpa: %p)\n", file->name, file->fpa);
-	break;
+            // create FPA structure component based on view
+            psMetadata *format = file->format; // Camera format configuration
+            if (!format) {
+                format = config->format;
+            }
+
+            pmFPA *nameSource = file->src; // Source of FPA.NAME
+            if (!nameSource) {
+                nameSource = file->fpa;
+            }
+            bool mdok;                  // Status of MD lookup
+            const char *fpaname = psMetadataLookupStr(&mdok, nameSource->concepts, "FPA.NAME"); // Name of FPA
+
+            pmFPAAddSourceFromView(file->fpa, fpaname, view, format);
+            psTrace ("pmFPAfile", 5, "created fpa data elements for %s (fpa: %p)\n", file->name, file->fpa);
+            break;
     }
     case PM_FPA_FILE_HEADER:
@@ -807,4 +890,8 @@
                 goto failure;
             }
+            if (!pmFPAfileBlank(file, view, config)) {
+                psError(PS_ERR_IO, false, "failed BLANK in FPA_BEFORE block for %s", file->name);
+                goto failure;
+            }
             break;
         case PM_FPA_AFTER:
