Index: trunk/magic/remove/src/streaksio.c
===================================================================
--- trunk/magic/remove/src/streaksio.c	(revision 21437)
+++ 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)
 {
Index: trunk/magic/remove/src/streaksio.h
===================================================================
--- trunk/magic/remove/src/streaksio.h	(revision 21437)
+++ trunk/magic/remove/src/streaksio.h	(revision 21438)
@@ -7,7 +7,6 @@
     psString outputFilename, bool required);
 
-void sFileFree(sFile *);
+void closeImages(streakFiles *sfiles);
 
-void closeImages(streakFiles *sfiles);
 void closeImage(sFile *sfile);
 
@@ -27,3 +26,5 @@
 bool isExciseValue(double, double);
 void setMaskedToNAN(streakFiles *sfiles, psU8 maskMask, bool printCounts);
+
+bool swapOutputsToInputs(streakFiles *sf);
 #endif // STREAKS_IO_H
Index: trunk/magic/remove/src/warpedpixels.c
===================================================================
--- trunk/magic/remove/src/warpedpixels.c	(revision 21437)
+++ trunk/magic/remove/src/warpedpixels.c	(revision 21438)
@@ -22,8 +22,10 @@
     int n = psArrayLength(skycells);
 
-    psRegion     bounds = *pmChipPixels(sf->chip);
+    psRegion     *bounds = pmChipPixels(sf->chip);
     
-    int width  = bounds.x1 - bounds.x0;
-    int height = bounds.y1 - bounds.y0;
+    int width  = bounds->x1 - bounds->x0;
+    int height = bounds->y1 - bounds->y0;
+
+    psFree(bounds);
 
     sf->warpedPixels = psImageAlloc(width, height, PS_TYPE_U8);
@@ -35,4 +37,5 @@
 
         addTouchedPixels(sf, resolved_name);
+        psFree(resolved_name);
     }
 
@@ -48,4 +51,5 @@
         psFitsWriteImage(fits, header, sf->warpedPixels, 0, NULL);
         psFitsClose(fits);
+        psFree(header);
     }
     return true;
@@ -62,4 +66,5 @@
     }
     psMetadata *header = psFitsReadHeader(NULL, fits);
+    psFitsClose(fits);
     if (!header) {
         psError(PS_ERR_IO, false, "failed to read fixts header from skycell file: %s", fileName);
@@ -75,4 +80,6 @@
     int naxis2 = psMetadataLookupS32(NULL, header, "NAXIS2");
 
+    psFree(header);
+
     /* now set up our wrapper to the chip astrometry to apply to the whole chip */
     sf->astrom = streakSetAstrometry(sf->astrom, sf->stage, sf->inAstrom->fpa, sf->chip, false, NULL, 
@@ -111,4 +118,6 @@
         pt[i].y = p.y;
     }
+
+    psFree(wcs);
 
     // put the corners in the desired order (see comments below)
