Index: /trunk/psModules/src/imcombine/pmSubtractionKernels.c
===================================================================
--- /trunk/psModules/src/imcombine/pmSubtractionKernels.c	(revision 14540)
+++ /trunk/psModules/src/imcombine/pmSubtractionKernels.c	(revision 14541)
@@ -555,5 +555,5 @@
         // Iterate over (u,v) order
         for (int uOrder = 0; uOrder <= (i == 0 ? 0 : ringsOrder); uOrder++) {
-            for (int vOrder = 0; vOrder <= (i == 0 ? 0 : ringsOrder) - uOrder; vOrder++, index++) {
+            for (int vOrder = 0; vOrder <= (i == 0 ? 0 : ringsOrder - uOrder); vOrder++, index++) {
 
                 psArray *data = psArrayAlloc(3); // Container for data
@@ -581,16 +581,18 @@
                                 float uPoly = power(u, uOrder); // Value of u^uOrder
 
-                                uCoords->data.S32[j] = u;
-                                vCoords->data.S32[j] = v;
-                                norm += poly->data.F32[j] = uPoly * vPoly;
-
-                                psVectorExtend(uCoords, RINGS_BUFFER, 1);
-                                psVectorExtend(vCoords, RINGS_BUFFER, 1);
-                                psVectorExtend(poly, RINGS_BUFFER, 1);
-
-                                psTrace("psModules.imcombine", 9, "u = %d, v = %d, poly = %f\n",
-                                        u, v, poly->data.F32[j]);
-
-                                j++;
+                                float polyVal = uPoly * vPoly; // Value of polynomial
+                                if (polyVal != 0) { // No point adding it otherwise
+                                    uCoords->data.S32[j] = u;
+                                    vCoords->data.S32[j] = v;
+                                    poly->data.F32[j] = polyVal;
+                                    norm += polyVal;
+
+                                    psVectorExtend(uCoords, RINGS_BUFFER, 1);
+                                    psVectorExtend(vCoords, RINGS_BUFFER, 1);
+                                    psVectorExtend(poly, RINGS_BUFFER, 1);
+                                    psTrace("psModules.imcombine", 9, "u = %d, v = %d, poly = %f\n",
+                                            u, v, poly->data.F32[j]);
+                                    j++;
+                                }
                             }
                         }
@@ -599,4 +601,5 @@
                     if (uOrder % 2 == 0 && vOrder % 2 == 0) {
                         psBinaryOp(poly, poly, "*", psScalarAlloc(1.0 / norm, PS_TYPE_F32));
+                        // Add subtraction of 0,0 component to preserve photometric scaling
                         uCoords->data.S32[j] = 0;
                         vCoords->data.S32[j] = 0;
@@ -606,9 +609,10 @@
                         psVectorExtend(poly, RINGS_BUFFER, 1);
                     } else {
-                        psBinaryOp(poly, poly, "*", psScalarAlloc(1.0 / (float)j, PS_TYPE_F32));
+                        norm = powf(size, uOrder) * powf(size, vOrder)
+                        psBinaryOp(poly, poly, "*", psScalarAlloc(1.0 / norm, PS_TYPE_F32));
                     }
                 }
 
-                psTrace("psModules.imcombine", 8, "%ld pixels in ring\n", uCoords->n);
+                psTrace("psModules.imcombine", 8, "%ld pixels in kernel\n", uCoords->n);
 
                 kernels->preCalc->data[index] = data;
