Index: trunk/ppStack/src/ppStack.h
===================================================================
--- trunk/ppStack/src/ppStack.h	(revision 21260)
+++ trunk/ppStack/src/ppStack.h	(revision 21366)
@@ -38,5 +38,5 @@
     psArray *imageFits;                 // FITS file pointers for images
     psArray *maskFits;                  // FITS file pointers for masks
-    psArray *weightFits;                // FITS file pointers for weights
+    psArray *varianceFits;                // FITS file pointers for variances
 } ppStackThreadData;
 
@@ -45,5 +45,5 @@
                                           const psArray *imageNames, // Names of images to read
                                           const psArray *maskNames, // Names of masks to read
-                                          const psArray *weightNames, // Names of weight maps to read
+                                          const psArray *varianceNames, // Names of variance maps to read
                                           const pmConfig *config // Configuration
     );
Index: trunk/ppStack/src/ppStackArguments.c
===================================================================
--- trunk/ppStack/src/ppStackArguments.c	(revision 21260)
+++ trunk/ppStack/src/ppStackArguments.c	(revision 21366)
@@ -24,5 +24,5 @@
             "\tIMAGE(STR):     Image filename\n"
             "\tMASK(STR):      Mask filename\n"
-            "\tWEIGHT(STR):    Weight map filename\n"
+            "\tVARIANCE(STR):  Variance map filename\n"
             "\tPSF(STR):       PSF filename\n"
             "\tSOURCES(STR):   Sources filename\n"
@@ -151,5 +151,5 @@
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-mask-poor", 0, "Mask value to give poor pixels", NULL);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-threshold-mask", 0, "Threshold for mask deconvolution", NAN);
-    psMetadataAddF32(arguments, PS_LIST_TAIL, "-poor-frac", 0, "Fraction of weight for poor pixels", NAN);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-poor-frac", 0, "Fraction of variance for poor pixels", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-deconv-limit", 0, "Maximum deconvolution fraction limit", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-image-rej", 0,
@@ -183,5 +183,5 @@
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-temp-image", 0, "Suffix for temporary images", NULL);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-temp-mask", 0, "Suffix for temporary masks", NULL);
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-temp-weight", 0, "Suffix for temporary weight maps", NULL);
+    psMetadataAddStr(arguments, PS_LIST_TAIL, "-temp-variance", 0, "Suffix for temporary variance maps", NULL);
     psMetadataAddBool(arguments, PS_LIST_TAIL, "-temp-delete", 0,
                       "Delete temporary files on completion?", false);
@@ -283,10 +283,10 @@
     VALUE_ARG_RECIPE_INT("-renorm-num", "RENORM.NUM", S32, 0);
     VALUE_ARG_RECIPE_FLOAT("-renorm-width", "RENORM.WIDTH", F32);
-    valueArgRecipeStr(arguments, recipe, "-renorm-mean", "RENORM.MEAN", recipe);
+    valueArgRecipeStr(arguments, recipe, "-renorm-mean",  "RENORM.MEAN", recipe);
     valueArgRecipeStr(arguments, recipe, "-renorm-stdev", "RENORM.STDEV", recipe);
 
-    valueArgRecipeStr(arguments, recipe, "-temp-image",  "TEMP.IMAGE",  recipe);
-    valueArgRecipeStr(arguments, recipe, "-temp-mask",   "TEMP.MASK",   recipe);
-    valueArgRecipeStr(arguments, recipe, "-temp-weight", "TEMP.WEIGHT", recipe);
+    valueArgRecipeStr(arguments, recipe, "-temp-image",    "TEMP.IMAGE",  recipe);
+    valueArgRecipeStr(arguments, recipe, "-temp-mask",     "TEMP.MASK",   recipe);
+    valueArgRecipeStr(arguments, recipe, "-temp-variance", "TEMP.VARIANCE", recipe);
 
     if (psMetadataLookupBool(NULL, arguments, "-temp-delete") ||
Index: trunk/ppStack/src/ppStackCamera.c
===================================================================
--- trunk/ppStack/src/ppStackCamera.c	(revision 21260)
+++ trunk/ppStack/src/ppStackCamera.c	(revision 21366)
@@ -71,5 +71,5 @@
 bool ppStackCamera(pmConfig *config)
 {
-    bool haveWeights = false;           // Do we have weight maps?
+    bool haveVariances = false;           // Do we have variance maps?
     bool havePSFs = false;              // Do we have PSFs?
 
@@ -97,5 +97,5 @@
         bool mdok;
         psString mask = psMetadataLookupStr(&mdok, input, "MASK"); // Name of mask
-        psString weight = psMetadataLookupStr(&mdok, input, "WEIGHT"); // Name of weight map
+        psString variance = psMetadataLookupStr(&mdok, input, "VARIANCE"); // Name of variance map
         psString psf = psMetadataLookupStr(&mdok, input, "PSF"); // Name of PSF
         psString sources = psMetadataLookupStr(&mdok, input, "SOURCES"); // Name of sources
@@ -140,22 +140,22 @@
         }
 
-        // Optionally add the weight file
-        if (weight && strlen(weight) > 0) {
-            haveWeights = true;
-            psArray *weightFiles = psArrayAlloc(1); // Array of filenames for this FPA
-            weightFiles->data[0] = psMemIncrRefCounter(weight);
-            psMetadataAddArray(config->arguments, PS_LIST_TAIL, "WEIGHT.FILENAMES", PS_META_REPLACE,
-                               "Filenames of weight files", weightFiles);
-            psFree(weightFiles);
+        // Optionally add the variance file
+        if (variance && strlen(variance) > 0) {
+            haveVariances = true;
+            psArray *varianceFiles = psArrayAlloc(1); // Array of filenames for this FPA
+            varianceFiles->data[0] = psMemIncrRefCounter(variance);
+            psMetadataAddArray(config->arguments, PS_LIST_TAIL, "VARIANCE.FILENAMES", PS_META_REPLACE,
+                               "Filenames of variance files", varianceFiles);
+            psFree(varianceFiles);
 
             bool status;
-            pmFPAfile *weightFile = pmFPAfileBindFromArgs(&status, imageFile, config, "PPSTACK.INPUT.WEIGHT",
-                                                          "WEIGHT.FILENAMES");
+            pmFPAfile *varianceFile = pmFPAfileBindFromArgs(&status, imageFile, config,
+                                                            "PPSTACK.INPUT.VARIANCE", "VARIANCE.FILENAMES");
             if (!status) {
-                psError(PS_ERR_UNKNOWN, false, "Unable to define file from weight %d (%s)", i, weight);
-                return false;
-            }
-            if (weightFile->type != PM_FPA_FILE_WEIGHT) {
-                psError(PS_ERR_IO, true, "PPSTACK.INPUT.WEIGHT is not of type WEIGHT");
+                psError(PS_ERR_UNKNOWN, false, "Unable to define file from variance %d (%s)", i, variance);
+                return false;
+            }
+            if (varianceFile->type != PM_FPA_FILE_VARIANCE) {
+                psError(PS_ERR_IO, true, "PPSTACK.INPUT.VARIANCE is not of type VARIANCE");
                 return false;
             }
@@ -217,22 +217,22 @@
 #if 0
         // Output convolved files
-        pmFPAfile *outconvImage  = defineOutputConvolved("PPSTACK.OUTCONV", imageFile->fpa, config,
+        pmFPAfile *outconvImage    = defineOutputConvolved("PPSTACK.OUTCONV", imageFile->fpa, config,
+                                                           PM_FPA_FILE_IMAGE);
+        pmFPAfile *outconvMask     = defineOutputConvolved("PPSTACK.OUTCONV.MASK", imageFile->fpa, config,
+                                                           PM_FPA_FILE_MASK);
+        pmFPAfile *outconvVariance = defineOutputConvolved("PPSTACK.OUTCONV.VARIANCE", imageFile->fpa, config,
+                                                           PM_FPA_FILE_VARIANCE);
+        if (!outconvImage || !outconvMask || !outconvVariance) {
+            return false;
+        }
+
+        // Input convolved files
+        pmFPAfile *inconvImage    = defineInputConvolved("PPSTACK.INCONV", outconvImage, config,
                                                          PM_FPA_FILE_IMAGE);
-        pmFPAfile *outconvMask   = defineOutputConvolved("PPSTACK.OUTCONV.MASK", imageFile->fpa, config,
+        pmFPAfile *inconvMask     = defineInputConvolved("PPSTACK.INCONV.MASK", outconvMask, config,
                                                          PM_FPA_FILE_MASK);
-        pmFPAfile *outconvWeight = defineOutputConvolved("PPSTACK.OUTCONV.WEIGHT", imageFile->fpa, config,
-                                                         PM_FPA_FILE_WEIGHT);
-        if (!outconvImage || !outconvMask || !outconvWeight) {
-            return false;
-        }
-
-        // Input convolved files
-        pmFPAfile *inconvImage  = defineInputConvolved("PPSTACK.INCONV", outconvImage, config,
-                                                       PM_FPA_FILE_IMAGE);
-        pmFPAfile *inconvMask   = defineInputConvolved("PPSTACK.INCONV.MASK", outconvMask, config,
-                                                       PM_FPA_FILE_MASK);
-        pmFPAfile *inconvWeight = defineInputConvolved("PPSTACK.INCONV.WEIGHT", outconvWeight, config,
-                                                       PM_FPA_FILE_WEIGHT);
-        if (!inconvImage || !inconvMask || !inconvWeight) {
+        pmFPAfile *inconvVariance = defineInputConvolved("PPSTACK.INCONV.VARIANCE", outconvVariance, config,
+                                                         PM_FPA_FILE_VARIANCE);
+        if (!inconvImage || !inconvMask || !inconvVariance) {
             return false;
         }
@@ -246,6 +246,6 @@
         psMetadataRemoveKey(config->arguments, "MASK.FILENAMES");
     }
-    if (psMetadataLookup(config->arguments, "WEIGHT.FILENAMES")) {
-        psMetadataRemoveKey(config->arguments, "WEIGHT.FILENAMES");
+    if (psMetadataLookup(config->arguments, "VARIANCE.FILENAMES")) {
+        psMetadataRemoveKey(config->arguments, "VARIANCE.FILENAMES");
     }
     if (psMetadataLookup(config->arguments, "PSF.FILENAMES")) {
@@ -295,16 +295,16 @@
     outMask->save = true;
 
-    // Output weight
-    if (haveWeights) {
-        pmFPAfile *outWeight = pmFPAfileDefineOutput(config, output->fpa, "PPSTACK.OUTPUT.WEIGHT");
-        if (!outWeight) {
-            psError(PS_ERR_IO, false, _("Unable to generate output file from PPSTACK.OUTPUT.WEIGHT"));
-            return false;
-        }
-        if (outWeight->type != PM_FPA_FILE_WEIGHT) {
-            psError(PS_ERR_IO, true, "PPSTACK.OUTPUT.WEIGHT is not of type WEIGHT");
-            return false;
-        }
-        outWeight->save = true;
+    // Output variance
+    if (haveVariances) {
+        pmFPAfile *outVariance = pmFPAfileDefineOutput(config, output->fpa, "PPSTACK.OUTPUT.VARIANCE");
+        if (!outVariance) {
+            psError(PS_ERR_IO, false, _("Unable to generate output file from PPSTACK.OUTPUT.VARIANCE"));
+            return false;
+        }
+        if (outVariance->type != PM_FPA_FILE_VARIANCE) {
+            psError(PS_ERR_IO, true, "PPSTACK.OUTPUT.VARIANCE is not of type VARIANCE");
+            return false;
+        }
+        outVariance->save = true;
     }
 
Index: trunk/ppStack/src/ppStackLoop.c
===================================================================
--- trunk/ppStack/src/ppStackLoop.c	(revision 21260)
+++ trunk/ppStack/src/ppStackLoop.c	(revision 21366)
@@ -24,8 +24,8 @@
 
 // Files required for the convolution
-static char *convolveFiles[] = { "PPSTACK.INPUT", "PPSTACK.INPUT.MASK", "PPSTACK.INPUT.WEIGHT", NULL };
+static char *convolveFiles[] = { "PPSTACK.INPUT", "PPSTACK.INPUT.MASK", "PPSTACK.INPUT.VARIANCE", NULL };
 
 // Output files for the combination
-static char *combineFiles[] = { "PPSTACK.OUTPUT", "PPSTACK.OUTPUT.MASK", "PPSTACK.OUTPUT.WEIGHT",
+static char *combineFiles[] = { "PPSTACK.OUTPUT", "PPSTACK.OUTPUT.MASK", "PPSTACK.OUTPUT.VARIANCE",
                                 "PPSTACK.OUTPUT.JPEG1", "PPSTACK.OUTPUT.JPEG2", NULL };
 
@@ -204,8 +204,8 @@
     const char *tempImage = psMetadataLookupStr(NULL, recipe, "TEMP.IMAGE"); // Suffix for temporary images
     const char *tempMask = psMetadataLookupStr(NULL, recipe, "TEMP.MASK"); // Suffix for temporary masks
-    const char *tempWeight = psMetadataLookupStr(NULL, recipe, "TEMP.WEIGHT"); // Suffix for temp weight maps
-    if (!tempImage || !tempMask || !tempWeight) {
+    const char *tempVariance = psMetadataLookupStr(NULL, recipe, "TEMP.VARIANCE"); // Suffix for temp variance maps
+    if (!tempImage || !tempMask || !tempVariance) {
         psError(PS_ERR_BAD_PARAMETER_VALUE, false,
-                "Unable to find TEMP.IMAGE, TEMP.MASK and TEMP.WEIGHT in recipe");
+                "Unable to find TEMP.IMAGE, TEMP.MASK and TEMP.VARIANCE in recipe");
         return false;
     }
@@ -387,14 +387,14 @@
     psArray *imageNames = psArrayAlloc(num);
     psArray *maskNames = psArrayAlloc(num);
-    psArray *weightNames = psArrayAlloc(num);
+    psArray *varianceNames = psArrayAlloc(num);
     for (int i = 0; i < num; i++) {
-        psString imageName = NULL, maskName = NULL, weightName = NULL; // Names for convolved images
+        psString imageName = NULL, maskName = NULL, varianceName = NULL; // Names for convolved images
         psStringAppend(&imageName, "%s/%s.%d.%s", tempDir, tempName, i, tempImage);
         psStringAppend(&maskName, "%s/%s.%d.%s", tempDir, tempName, i, tempMask);
-        psStringAppend(&weightName, "%s/%s.%d.%s", tempDir, tempName, i, tempWeight);
-        psTrace("ppStack", 5, "Temporary files: %s %s %s\n", imageName, maskName, weightName);
+        psStringAppend(&varianceName, "%s/%s.%d.%s", tempDir, tempName, i, tempVariance);
+        psTrace("ppStack", 5, "Temporary files: %s %s %s\n", imageName, maskName, varianceName);
         imageNames->data[i] = imageName;
         maskNames->data[i] = maskName;
-        weightNames->data[i] = weightName;
+        varianceNames->data[i] = varianceName;
     }
     // Free the outputName that we grabbed above to set up tempName.
@@ -417,4 +417,5 @@
     psList *fpaList = psListAlloc(NULL); // List of input FPAs, for concept averaging
     psList *cellList = psListAlloc(NULL); // List of input cells, for concept averaging
+    psArray *covariances = psArrayAlloc(num); // Covariance matrices
     for (int i = 0; i < num; i++) {
         psTrace("ppStack", 2, "Convolving input %d of %d to target PSF....\n", i, num);
@@ -431,4 +432,5 @@
             psFree(fpaList);
             psFree(cellList);
+            psFree(covariances);
             return false;
         }
@@ -450,4 +452,5 @@
             psFree(fpaList);
             psFree(cellList);
+            psFree(covariances);
             return false;
         }
@@ -464,4 +467,5 @@
             continue;
         }
+        covariances->data[i] = psMemIncrRefCounter(readout->covariance);
 
         if (stats) {
@@ -486,10 +490,9 @@
         pmHDU *hdu = readout->parent->parent->parent->hdu; // HDU for convolved image
         assert(hdu);
-        writeImage(imageNames->data[i],  hdu->header, readout->image, config);
         psMetadata *maskHeader = psMetadataCopy(NULL, hdu->header); // Copy of header, for mask
         pmConfigMaskWriteHeader(config, maskHeader);
-        writeImage(maskNames->data[i],   maskHeader, readout->mask, config);
+        writeImage(maskNames->data[i], maskHeader, readout->mask, config);
         psFree(maskHeader);
-        writeImage(weightNames->data[i], hdu->header, readout->weight, config);
+        writeImage(varianceNames->data[i], hdu->header, readout->variance, config);
 
         pmCell *inCell = readout->parent; // Input cell
@@ -502,4 +505,5 @@
             psFree(fpaList);
             psFree(cellList);
+            psFree(covariances);
             return false;
         }
@@ -523,4 +527,5 @@
         psFree(fpaList);
         psFree(cellList);
+        psFree(covariances);
         return false;
     }
@@ -570,4 +575,5 @@
             psFree(matchChi2);
             psFree(values);
+            psFree(covariances);
             return false;
         }
@@ -611,4 +617,5 @@
         psFree(inputMask);
         psFree(matchChi2);
+        psFree(covariances);
         return false;
     }
@@ -622,5 +629,5 @@
     // Start threading
     ppStackThreadInit();
-    ppStackThreadData *stack = ppStackThreadDataSetup(cells, imageNames, maskNames, weightNames, config);
+    ppStackThreadData *stack = ppStackThreadDataSetup(cells, imageNames, maskNames, varianceNames, config);
 
     psTimerStart("PPSTACK_INITIAL");
@@ -645,4 +652,5 @@
             psFree(matchChi2);
             psFree(cells);
+            psFree(covariances);
             return false;
         }
@@ -658,4 +666,5 @@
             psFree(matchChi2);
             psFree(cells);
+            psFree(covariances);
             return false;
         }
@@ -676,4 +685,5 @@
             psFree(outRO);
             psFree(cells);
+            psFree(covariances);
             return false;
         }
@@ -695,4 +705,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(covariances);
                 return false;
             }
@@ -721,4 +732,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(covariances);
                 return false;
             }
@@ -735,4 +747,5 @@
             psFree(view);
             psFree(outRO);
+            psFree(covariances);
             return false;
         }
@@ -803,4 +816,5 @@
                 psFree(inspect);
                 psFree(rejected);
+                psFree(covariances);
                 return false;
             }
@@ -818,4 +832,5 @@
             psFree(inspect);
             psFree(rejected);
+            psFree(covariances);
             return false;
         }
@@ -912,4 +927,5 @@
             psFree(view);
             psFree(outRO);
+            psFree(covariances);
             return false;
         }
@@ -941,4 +957,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(covariances);
                 return false;
             }
@@ -962,4 +979,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(covariances);
                 return false;
             }
@@ -974,4 +992,5 @@
             psFree(view);
             psFree(outRO);
+            psFree(covariances);
             return false;
         }
@@ -979,4 +998,14 @@
 
     memDump("final");
+
+    // Sum covariance matrices
+    for (int i = 0; i < num; i++) {
+        if (inputMask->data.U8[i]) {
+            psFree(covariances->data[i]);
+            covariances->data[i] = NULL;
+        }
+    }
+    outRO->covariance = psImageCovarianceSum(covariances);
+    psFree(covariances);
 
     if (stats) {
@@ -1040,17 +1069,17 @@
             psString imageResolved = pmConfigConvertFilename(imageNames->data[i], config, false, false);
             psString maskResolved = pmConfigConvertFilename(maskNames->data[i], config, false, false);
-            psString weightResolved = pmConfigConvertFilename(weightNames->data[i], config, false, false);
+            psString varianceResolved = pmConfigConvertFilename(varianceNames->data[i], config, false, false);
             if (unlink(imageResolved) == -1 || unlink(maskResolved) == -1 ||
-                unlink(weightResolved) == -1) {
+                unlink(varianceResolved) == -1) {
                 psWarning("Unable to delete temporary files for image %d", i);
             }
             psFree(imageResolved);
             psFree(maskResolved);
-            psFree(weightResolved);
+            psFree(varianceResolved);
         }
     }
     psFree(imageNames);
     psFree(maskNames);
-    psFree(weightNames);
+    psFree(varianceNames);
 
     psFree(inputMask);
@@ -1092,6 +1121,6 @@
         float renormWidth = psMetadataLookupS32(&mdok, recipe, "RENORM.WIDTH"); // Width of Gaussian phot
         psImageMaskType maskValue = pmConfigMaskGet("BLANK", config); // Bits to mask
-        if (!pmReadoutWeightRenormPhot(outRO, maskValue, renormNum, renormWidth,
-                                       renormMean, renormStdev, NULL)) {
+        if (!pmReadoutVarianceRenormPhot(outRO, maskValue, renormNum, renormWidth,
+                                         renormMean, renormStdev, NULL)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to renormalise variances.");
             psFree(outRO);
Index: trunk/ppStack/src/ppStackMatch.c
===================================================================
--- trunk/ppStack/src/ppStackMatch.c	(revision 21260)
+++ trunk/ppStack/src/ppStackMatch.c	(revision 21366)
@@ -16,4 +16,5 @@
                      PM_SOURCE_MODE_CR_LIMIT) // Mask to apply to input sources
 #define FAINT_SOURCE_FRAC 1.0e-4         // Set minimum flux to this fraction of faintest source flux
+#define COVAR_FRAC 0.01                 // Truncation fraction for covariance matrix
 
 //#define TESTING                         // Enable debugging output
@@ -233,24 +234,24 @@
         }
 
-        // Read image, mask, weight
+        // Read image, mask, variance
         const char *tempImage = psMetadataLookupStr(NULL, recipe, "TEMP.IMAGE"); // Suffix for image
         const char *tempMask = psMetadataLookupStr(NULL, recipe, "TEMP.MASK"); // Suffix for mask
-        const char *tempWeight = psMetadataLookupStr(NULL, recipe, "TEMP.WEIGHT"); // Suffix for weight map
-        psString imageName = NULL, maskName = NULL, weightName = NULL; // Names for convolved images
+        const char *tempVariance = psMetadataLookupStr(NULL, recipe, "TEMP.VARIANCE"); // Suffix for variance map
+        psString imageName = NULL, maskName = NULL, varianceName = NULL; // Names for convolved images
         psStringAppend(&imageName, "%s.%d.%s", outName, numInput, tempImage);
         psStringAppend(&maskName, "%s.%d.%s", outName, numInput, tempMask);
-        psStringAppend(&weightName, "%s.%d.%s", outName, numInput, tempWeight);
+        psStringAppend(&varianceName, "%s.%d.%s", outName, numInput, tempVariance);
 
         if (!readImage(&readout->image, imageName, config) || !readImage(&readout->mask, maskName, config) ||
-            !readImage(&readout->weight, weightName, config)) {
+            !readImage(&readout->variance, varianceName, config)) {
             psError(PS_ERR_IO, false, "Unable to read previously produced image.");
             psFree(imageName);
             psFree(maskName);
-            psFree(weightName);
+            psFree(varianceName);
             return false;
         }
         psFree(imageName);
         psFree(maskName);
-        psFree(weightName);
+        psFree(varianceName);
 
         psRegion *region = psMetadataLookupPtr(NULL, output->analysis,
@@ -374,5 +375,5 @@
                                                                                          "RENORM.STDEV"));
 
-                if (!pmReadoutWeightRenormPixels(readout, maskBad, renormMean, renormStdev, rng)) {
+                if (!pmReadoutVarianceRenormPixels(readout, maskBad, renormMean, renormStdev, rng)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to renormalise variances.");
                     psFree(output);
@@ -444,8 +445,10 @@
             psFree(readout->image);
             psFree(readout->mask);
-            psFree(readout->weight);
+            psFree(readout->variance);
+            psFree(readout->covariance);
             readout->image  = psMemIncrRefCounter(output->image);
             readout->mask   = psMemIncrRefCounter(output->mask);
-            readout->weight = psMemIncrRefCounter(output->weight);
+            readout->variance = psMemIncrRefCounter(output->variance);
+            readout->covariance = psImageCovarianceTruncate(output->covariance, COVAR_FRAC);
         } else {
             // Fake the convolution
@@ -559,5 +562,5 @@
                                                                                  "RENORM.STDEV"));
 
-        if (!pmReadoutWeightRenormPixels(readout, maskBad, renormMean, renormStdev, rng)) {
+        if (!pmReadoutVarianceRenormPixels(readout, maskBad, renormMean, renormStdev, rng)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to renormalise variances.");
             psFree(output);
@@ -583,5 +586,4 @@
     psFree(bg);
 
-
 #if 0
 #define RADIUS 10                       // Radius of photometry
Index: trunk/ppStack/src/ppStackThread.c
===================================================================
--- trunk/ppStack/src/ppStackThread.c	(revision 21260)
+++ trunk/ppStack/src/ppStackThread.c	(revision 21366)
@@ -38,15 +38,15 @@
         psFitsClose(stack->imageFits->data[i]);
         psFitsClose(stack->maskFits->data[i]);
-        psFitsClose(stack->weightFits->data[i]);
-        stack->imageFits->data[i] = stack->maskFits->data[i] = stack->weightFits->data[i] = NULL;
+        psFitsClose(stack->varianceFits->data[i]);
+        stack->imageFits->data[i] = stack->maskFits->data[i] = stack->varianceFits->data[i] = NULL;
     }
     psFree(stack->imageFits);
     psFree(stack->maskFits);
-    psFree(stack->weightFits);
+    psFree(stack->varianceFits);
     return;
 }
 
 ppStackThreadData *ppStackThreadDataSetup(const psArray *cells, const psArray *imageNames,
-                                          const psArray *maskNames, const psArray *weightNames,
+                                          const psArray *maskNames, const psArray *varianceNames,
                                           const pmConfig *config)
 {
@@ -54,5 +54,5 @@
     PS_ASSERT_ARRAYS_SIZE_EQUAL(cells, imageNames, NULL);
     PS_ASSERT_ARRAYS_SIZE_EQUAL(cells, maskNames, NULL);
-    PS_ASSERT_ARRAYS_SIZE_EQUAL(cells, weightNames, NULL);
+    PS_ASSERT_ARRAYS_SIZE_EQUAL(cells, varianceNames, NULL);
 
     ppStackThreadData *stack = psAlloc(sizeof(ppStackThreadData)); // Thread data, to return
@@ -64,5 +64,5 @@
     stack->imageFits  = psArrayAlloc(numInputs);
     stack->maskFits   = psArrayAlloc(numInputs);
-    stack->weightFits = psArrayAlloc(numInputs);
+    stack->varianceFits = psArrayAlloc(numInputs);
     for (int i = 0; i < numInputs; i++) {
         if (!cells->data[i]) {
@@ -73,14 +73,14 @@
         psString imageResolved = pmConfigConvertFilename(imageNames->data[i], config, false, false);
         psString maskResolved = pmConfigConvertFilename(maskNames->data[i], config, false, false);
-        psString weightResolved = pmConfigConvertFilename(weightNames->data[i], config, false, false);
+        psString varianceResolved = pmConfigConvertFilename(varianceNames->data[i], config, false, false);
         stack->imageFits->data[i] = psFitsOpen(imageResolved, "r");
         stack->maskFits->data[i] = psFitsOpen(maskResolved, "r");
-        stack->weightFits->data[i] = psFitsOpen(weightResolved, "r");
+        stack->varianceFits->data[i] = psFitsOpen(varianceResolved, "r");
         psFree(imageResolved);
         psFree(maskResolved);
-        psFree(weightResolved);
-        if (!stack->imageFits->data[i] || !stack->maskFits->data[i] || !stack->weightFits->data[i]) {
+        psFree(varianceResolved);
+        if (!stack->imageFits->data[i] || !stack->maskFits->data[i] || !stack->varianceFits->data[i]) {
             psError(PS_ERR_UNKNOWN, false, "Unable to open convolved files %s, %s, %s",
-                    (char*)imageNames->data[i], (char*)maskNames->data[i], (char*)weightNames->data[i]);
+                    (char*)imageNames->data[i], (char*)maskNames->data[i], (char*)varianceNames->data[i]);
             return false;
         }
@@ -156,14 +156,14 @@
                 // override the recorded last scan
                 ro->thisImageScan  = thread->firstScan;
-                ro->thisWeightScan = thread->firstScan;
+                ro->thisVarianceScan = thread->firstScan;
                 ro->thisMaskScan   = thread->firstScan;
                 ro->lastImageScan  = thread->lastScan;
                 ro->lastMaskScan   = thread->lastScan;
-                ro->lastWeightScan = thread->lastScan;
+                ro->lastVarianceScan = thread->lastScan;
                 ro->forceScan      = true;
 
                 psFits *imageFits  = stack->imageFits->data[i]; // FITS file for image
                 psFits *maskFits   = stack->maskFits->data[i]; // FITS file for mask
-                psFits *weightFits = stack->weightFits->data[i]; // FITS file for weight
+                psFits *varianceFits = stack->varianceFits->data[i]; // FITS file for variance
 
 
@@ -189,8 +189,9 @@
                 }
 
-                if (pmReadoutMoreWeight(ro, weightFits, 0, rows, config)) {
+                if (pmReadoutMoreVariance(ro, varianceFits, 0, rows, config)) {
                     keepReading = true;
-                    if (!pmReadoutReadChunkWeight(ro, weightFits, 0, rows, overlap, config)) {
-                        psError(PS_ERR_IO, false, "Unable to read chunk %d for file PPSTACK.INPUT.WEIGHT %d",
+                    if (!pmReadoutReadChunkVariance(ro, varianceFits, 0, rows, overlap, config)) {
+                        psError(PS_ERR_IO, false,
+                                "Unable to read chunk %d for file PPSTACK.INPUT.VARIANCE %d",
                                 numChunk, i);
                         *status = false;
