Index: trunk/magic/remove/src/streaksio.c
===================================================================
--- trunk/magic/remove/src/streaksio.c	(revision 21156)
+++ trunk/magic/remove/src/streaksio.c	(revision 21438)
@@ -2,4 +2,8 @@
 #include "libgen.h"
 #include "unistd.h"
+
+static void sFileFree(sFile *sfile);
+static void streakFilesFree(streakFiles *sf);
+static void freeImages(streakFiles *);
 
 static nebServer *ourNebServer = NULL;
@@ -12,4 +16,5 @@
     bool status;
     streakFiles *sf = psAlloc(sizeof(streakFiles));
+    psMemSetDeallocator(sf, (psFreeFunc) streakFilesFree);
     memset(sf, 0, sizeof(*sf));
 
@@ -96,9 +101,12 @@
 }
 
-void sFileFree(sFile *sfile)
-{
-    psFree(sfile->resolved_name);
-    psFree(sfile->name);
-    psFree(sfile);
+static void
+streakFilesFree(streakFiles *sf)
+{
+    freeImages(sf);
+    psFree(sf->warpedPixels);
+    psFree(sf->tiles);
+    psFree(sf->view);
+    psFree(sf->astrom);
 }
 
@@ -232,7 +240,7 @@
     psString name = psMetadataLookupStr(&status, config->arguments, fileSelect);
     if (!status || !name) {
+        sFileFree(sfile);
         if (required) {
             psError(PS_ERR_IO, false, "Failed to lookup name for %s", fileSelect);
-            sFileFree(sfile);
             streaksExit("", 1);
         }
@@ -707,4 +715,15 @@
 
 void
+sFileFree(sFile *sfile)
+{
+    if (!sfile) {
+        return;
+    }
+    psFree(sfile->name);
+    psFree(sfile->resolved_name);
+    psFree(sfile);
+}
+
+void
 closeImage(sFile *sfile)
 {
@@ -718,9 +737,9 @@
     }
     psFree(sfile->header);
+    sfile->header = NULL;
     psFree(sfile->image);
+    sfile->header = NULL;
     psFree(sfile->imagecube);
-    psFree(sfile->name);
-    psFree(sfile->resolved_name);
-    psFree(sfile);
+    sfile->header = NULL;
 }
 
@@ -745,4 +764,27 @@
         closeImage(sf->outWeight);
         closeImage(sf->recWeight);
+    }
+}
+
+static void
+freeImages(streakFiles *sf)
+{
+    sFileFree(sf->inImage);
+    sFileFree(sf->outImage);
+    sFileFree(sf->recImage);
+    if (sf->inMask) {
+        sFileFree(sf->inMask);
+        sFileFree(sf->outMask);
+        sFileFree(sf->recMask);
+    }
+    if (sf->inChMask) {
+        sFileFree(sf->inChMask);
+        sFileFree(sf->outChMask);
+        sFileFree(sf->recChMask);
+    }
+    if (sf->inWeight) {
+        sFileFree(sf->inWeight);
+        sFileFree(sf->outWeight);
+        sFileFree(sf->recWeight);
     }
 }
@@ -845,8 +887,9 @@
     return true;
 }
-static bool
+
+bool
 swapOutputsToInputs(streakFiles *sfiles)
 {
-    if (sfiles->inMask) {
+    if (sfiles->outMask) {
         if (!swapOutputToInput(sfiles->inMask, sfiles->outMask)) {
             psError(PM_ERR_SYS, false, "failed to swap instances for Mask.");
@@ -855,5 +898,5 @@
     }
 
-    if (sfiles->inWeight) {
+    if (sfiles->outWeight) {
         if (!swapOutputToInput(sfiles->inWeight, sfiles->outWeight)) {
             psError(PM_ERR_SYS, false, "failed to swap instances for Weight.");
@@ -891,5 +934,5 @@
 }
 
-static bool
+bool
 deleteTemps(streakFiles *sfiles)
 {
