Index: /trunk/psModules/src/detrend/pmBias.c
===================================================================
--- /trunk/psModules/src/detrend/pmBias.c	(revision 10411)
+++ /trunk/psModules/src/detrend/pmBias.c	(revision 10412)
@@ -263,4 +263,10 @@
             psFree(pixels);
             double reduced = psStatsGetValue(stats, statistic); // Result of statistics
+
+            psString comment = NULL;    // Comment to add
+            psStringAppend(&comment, "Overscan value: %f", reduced);
+            psMetadataAddStr(hdu->header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, comment, "");
+            psFree(comment);
+
             (void)psBinaryOp(image, image, "-", psScalarAlloc((float)reduced, PS_TYPE_F32));
         } else {
@@ -272,6 +278,5 @@
                 psArray *pixels = psArrayAlloc(image->numRows); // Array of vectors containing pixels
                 for (int i = 0; i < pixels->n; i++) {
-                    psVector *values = psVectorAlloc(0, PS_TYPE_F32);
-                    pixels->data[i] = values;
+                    pixels->data[i] = psVectorAlloc(0, PS_TYPE_F32);
                 }
 
@@ -283,12 +288,11 @@
                     for (int i = PS_MAX(0,diff); i < PS_MIN(image->numRows, overscan->numRows + diff); i++) {
                         // i is row on overscan
-                        // XXX Reimplement with memcpy
                         psVector *values = pixels->data[i];
                         int index = values->n; // Index in the vector
                         values = psVectorRealloc(values, values->n + overscan->numCols);
-                        for (int j = 0; j < overscan->numCols; j++) {
-                            values->data.F32[index++] = overscan->data.F32[i][j];
-                        }
                         values->n += overscan->numCols;
+                        memcpy(&values->data.F32[index], overscan->data.F32[i],
+                               overscan->numCols * PSELEMTYPE_SIZEOF(PS_TYPE_F32));
+                        index += overscan->numCols;
                         pixels->data[i] = values; // Update the pointer in case it's moved
                     }
@@ -300,4 +304,5 @@
                 psFree(pixels);
                 if (! reduced) {
+                    psError(PS_ERR_UNEXPECTED_NULL, false, "Unable to generate overscan vector.\n");
                     return false;
                 }
@@ -326,10 +331,9 @@
                     for (int i = PS_MAX(0,diff); i < PS_MIN(image->numCols, overscan->numCols + diff); i++) {
                         // i is column on overscan
-                        // XXX Reimplement with memcpy
                         psVector *values = pixels->data[i];
                         int index = values->n; // Index in the vector
                         values = psVectorRealloc(values, values->n + overscan->numRows);
                         for (int j = 0; j < overscan->numRows; j++) {
-                            values->data.F32[index++] = overscan->data.F32[i][j];
+                            values->data.F32[index++] = overscan->data.F32[j][i];
                         }
                         values->n += overscan->numRows;
@@ -343,4 +347,5 @@
                 psFree(pixels);
                 if (! reduced) {
+                    psError(PS_ERR_UNEXPECTED_NULL, false, "Unable to generate overscan vector.\n");
                     return false;
                 }
@@ -354,4 +359,38 @@
                 psFree(reduced);
             }
+
+            switch (overscanOpts->fitType) {
+            case PM_FIT_POLY_ORD:
+            case PM_FIT_POLY_CHEBY: {
+                    psString comment = NULL;    // Comment to add
+                    psStringAppend(&comment, "Overscan fit: ");
+                    psPolynomial1D *poly = overscanOpts->poly; // The polynomial
+                    for (int i = 0; i < poly->nX; i++) {
+                        psStringAppend(&comment, "%.1f ", poly->coeff[i]);
+                    }
+                    psMetadataAddStr(hdu->header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, comment, "");
+                    psFree(comment);
+                    break;
+                }
+            case PM_FIT_SPLINE: {
+                    psSpline1D *spline = overscanOpts->spline; // The spline
+                    for (int i = 0; i < spline->n; i++) {
+                        psStringAppend(&comment, "Overscan fit %d: ", i);
+                        psPolynomial1D *poly = spline->spline[i]; // i-th polynomial
+                        for (int j = 0; j < poly->nX; j++) {
+                            psStringAppend(&comment, "%.1f ", poly->coeff[i]);
+                        }
+                        psMetadataAddStr(hdu->header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK,
+                                         comment, "");
+                        psFree(comment);
+                    }
+                    break;
+                }
+            case PM_FIT_NONE:
+            default:
+                psAbort(__func__, "Should never get here!!!\n");
+            }
+
+
         }
         psFree(stats);
@@ -394,5 +433,5 @@
     psString timeString = psTimeToISO(time); // String with time
     psFree(time);
-    psStringPrepend(&timeString, "Bias processing completed at ");
+    psStringPrepend(&timeString, "Overscan/bias/dark processing completed at ");
     psMetadataAddStr(hdu->header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK,
                      timeString, "");
