Index: trunk/psModules/src/imcombine/pmSubtractionThreads.c
===================================================================
--- trunk/psModules/src/imcombine/pmSubtractionThreads.c	(revision 18962)
+++ trunk/psModules/src/imcombine/pmSubtractionThreads.c	(revision 19059)
@@ -8,4 +8,5 @@
 #include "pmSubtractionMatch.h"
 #include "pmSubtractionEquation.h"
+#include "pmSubtraction.h"
 
 bool threaded = false;                  // Run with threads?
@@ -16,11 +17,49 @@
 }
 
-void pmSubtractionThreadSetup(void)
+// Initialise a mutex in each of the input
+static void subtractionMutexInit(pmReadout *ro)
+{
+    if (!ro) {
+        return;
+    }
+
+    if (ro->image) {
+        psMutexInit(ro->image);
+    }
+    if (ro->weight) {
+        psMutexInit(ro->weight);
+    }
+
+    return;
+}
+
+static void subtractionMutexDestroy(pmReadout *ro)
+{
+    if (!ro) {
+        return;
+    }
+
+    if (ro->image) {
+        psMutexDestroy(ro->image);
+    }
+    if (ro->weight) {
+        psMutexDestroy(ro->weight);
+    }
+
+    return;
+}
+
+void pmSubtractionThreadsInit(pmReadout *out1, pmReadout *out2, pmReadout *in1, pmReadout *in2)
 {
     if (threaded) {
-        psAbort("%s called multiple times.", __func__);
+        psAbort("Already running threaded.");
     }
 
     threaded = true;
+
+    subtractionMutexInit(out1);
+    subtractionMutexInit(out2);
+    subtractionMutexInit(in1);
+    subtractionMutexInit(in2);
 
     {
@@ -38,5 +77,30 @@
     }
 
+    {
+        psThreadTask *task = psThreadTaskAlloc("PSMODULES_SUBTRACTION_CONVOLVE", 17);
+        task->function = &pmSubtractionConvolveThread;
+        psThreadTaskAdd(task);
+        psFree(task);
+    }
+
     return;
 }
 
+
+void pmSubtractionThreadsFinalize(pmReadout *out1, pmReadout *out2, pmReadout *in1, pmReadout *in2)
+{
+    if (!threaded) {
+        return;
+    }
+
+    threaded = false;
+    psThreadTaskRemove("PSMODULES_SUBTRACTION_ORDER");
+    psThreadTaskRemove("PSMODULES_SUBTRACTION_CALCULATE_EQUATION");
+    psThreadTaskRemove("PSMODULES_SUBTRACTION_CONVOLVE");
+
+    subtractionMutexDestroy(out1);
+    subtractionMutexDestroy(out2);
+    subtractionMutexDestroy(in1);
+    subtractionMutexDestroy(in1);
+    return;
+}
