Index: trunk/psModules/src/objects/pmSource.c
===================================================================
--- trunk/psModules/src/objects/pmSource.c	(revision 33879)
+++ trunk/psModules/src/objects/pmSource.c	(revision 33963)
@@ -51,4 +51,5 @@
     psFree(tmp->pixels);
     psFree(tmp->variance);
+    psFree(tmp->modelVar);
     psFree(tmp->maskObj);
     psFree(tmp->maskView);
@@ -77,4 +78,5 @@
     psFree (source->pixels);
     psFree (source->variance);
+    psFree (source->modelVar);
     psFree (source->maskObj);
     psFree (source->maskView);
@@ -84,4 +86,5 @@
     source->pixels = NULL;
     source->variance = NULL;
+    source->modelVar = NULL;
     source->maskObj = NULL;
     source->maskView = NULL;
@@ -113,4 +116,5 @@
     source->pixels = NULL;
     source->variance = NULL;
+    source->modelVar = NULL;
     source->maskObj = NULL;
     source->maskView = NULL;
@@ -200,4 +204,5 @@
     source->pixels   = in->pixels   ? psImageCopyView(NULL, in->pixels)   : NULL;
     source->variance = in->variance ? psImageCopyView(NULL, in->variance) : NULL;
+    source->modelVar = NULL;
     source->maskView = in->maskView ? psImageCopyView(NULL, in->maskView) : NULL;
 
@@ -1028,4 +1033,7 @@
 
     bool addNoise = mode & PM_MODEL_OP_NOISE;
+    bool addModelVar = mode & PM_MODEL_OP_MODELVAR;
+
+    if (addModelVar) psAssert (source->modelVar, "programming error");
 
     // require the use of pmModelAddWithOffset if we are adding noise (because the model size and norm are rescaled)
@@ -1050,5 +1058,5 @@
         }
 
-        psF32 **target = source->pixels->data.F32;
+        psF32 **target = addModelVar ? source->modelVar->data.F32 : source->pixels->data.F32;
 
         for (int iy = 0; iy < source->modelFlux->numRows; iy++) {
@@ -1065,8 +1073,10 @@
             }
         }
-	if (add) {
-	    source->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED;
-	} else {
-	    source->tmpFlags |= PM_SOURCE_TMPF_SUBTRACTED;
+	if (!addModelVar) {
+	    if (add) {
+		source->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED;
+	    } else {
+		source->tmpFlags |= PM_SOURCE_TMPF_SUBTRACTED;
+	    }
 	}
         return true;
@@ -1077,11 +1087,14 @@
         target = source->variance;
     }
+    if (addModelVar) {
+        target = source->modelVar;
+    }
 
     if (add) {
 	status = pmModelAddWithOffset (target, source->maskObj, model, PM_MODEL_OP_FULL, maskVal, dx, dy);
-	source->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED;
+	if (!addNoise && !addModelVar) source->tmpFlags &= ~PM_SOURCE_TMPF_SUBTRACTED;
     } else {
 	status = pmModelSubWithOffset (target, source->maskObj, model, PM_MODEL_OP_FULL, maskVal, dx, dy);
-	source->tmpFlags |= PM_SOURCE_TMPF_SUBTRACTED;
+	if (!addNoise && !addModelVar) source->tmpFlags |= PM_SOURCE_TMPF_SUBTRACTED;
     }
 
