Index: trunk/ppSub/src/ppSubMatchPSFs.c
===================================================================
--- trunk/ppSub/src/ppSubMatchPSFs.c	(revision 23235)
+++ trunk/ppSub/src/ppSubMatchPSFs.c	(revision 23309)
@@ -48,4 +48,7 @@
 
     bool mdok;                          // Status of MD lookup
+
+    // Load pre-calculated kernel, if available
+    pmReadout *kernelRO = pmFPAfileThisReadout(config->files, view, "PPSUB.OUTPUT.KERNEL"); // RO with kernel
 
     // Sources in image, used for stamps: these must be loaded from previous analysis stages
@@ -134,10 +137,18 @@
 
     // Match the PSFs
-    if (!pmSubtractionMatch(inConv, refConv, inRO, refRO, footprint, stride, regionSize, spacing, threshold,
-                            sources, stampsName, type, size, order, widths, orders, inner, ringsOrder,
-                            binning, penalty, optimum, optWidths, optOrder, optThresh, iter, rej, sys,
-                            maskVal, maskBad, maskPoor, poorFrac, badFrac, subMode)) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to match images.");
-        return false;
+    if (kernelRO) {
+        if (!pmSubtractionMatchPrecalc(inConv, refConv, inRO, refRO, kernelRO->analysis,
+                                       stride, sys, maskVal, maskBad, maskPoor, poorFrac, badFrac)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to convolve images.");
+            return false;
+        }
+    } else {
+        if (!pmSubtractionMatch(inConv, refConv, inRO, refRO, footprint, stride, regionSize, spacing,
+                                threshold, sources, stampsName, type, size, order, widths, orders, inner,
+                                ringsOrder, binning, penalty, optimum, optWidths, optOrder, optThresh, iter,
+                                rej, sys, maskVal, maskBad, maskPoor, poorFrac, badFrac, subMode)) {
+            psError(PS_ERR_UNKNOWN, false, "Unable to match images.");
+            return false;
+        }
     }
 
