diff --git a/speccy.html b/speccy.html
index efee12c1e9a1a8af8621dca8ee69a4df6b9b890e..ab4afdef91f75bf1c657b72acc4b1c4d04cf280a 100644
--- a/speccy.html
+++ b/speccy.html
@@ -204,6 +204,8 @@
 		<span style="color: #aaaaaa;">Noise</span></label>
 	    <label><input type="checkbox" onclick="plotData();" value="ToggleModel" id="ToggleModel" checked>
 		<span style="color: #dd0000;">Model</span></label>
+	    <label><input type="checkbox" onclick="plotData();" value="ToggleResidual" id="ToggleResidual">
+		<span style="color: #ff8c00;">Residual</span></label>
 	    <br>
 	    <label><input type="checkbox" onclick="plotData();" value="ToggleLines" id="ToggleLines" checked>
 		<span style="color: #008800;">Lines</span></label>
diff --git a/speccy.js b/speccy.js
index b4b3abe9062a01381f89ddebf74c646ae238fdc4..8a271d358462823fdaa07e854610d7e3d076dc1a 100644
--- a/speccy.js
+++ b/speccy.js
@@ -40,7 +40,9 @@ var fluxArray   = [];
 var fluxerrArray= [];
 var skyArray    = [];
 var modelArray  = [];
+var residualArray  = [];
 var smoothedArray = [];
+var smoothedresidualArray = [];
 var templatelambdaArray = [];
 var templatefluxArray = [];
 var templateLength = 0;
@@ -310,6 +312,7 @@ function readSpecFileASCII()
 		    fluxerrArray[j] = Number(data[2]);
 		    skyArray[j]     = Number(data[3]);
 		    modelArray[j]   = Number(data[4]);
+		    residualArray[j] = Number(fluxArray[j] - modelArray[j]);
 		    if (  modelArray[j] > 1.0 * fluxerrArray[j] ) 
 		    {   // the numeric value is the number of sigmas to accept
 			if ( fluxArray[j] < y0 ) y0 = fluxArray[j];
@@ -357,7 +360,8 @@ function readSpecFileASCII()
 
 	    //calc the smoothed flux array
 	    var boxsize =  $("input[type='radio'][name='smoothing']:checked").val();
-	    smoothArray(fluxArray, smoothedArray, boxsize)
+	    smoothArray(fluxArray, smoothedArray, boxsize);
+	    smoothArray(residualArray, smoothedresidualArray, boxsize);
 
 	    plotData();
 	    writePipeInfo();
@@ -749,6 +753,25 @@ function plotData() {
 	ctx.closePath();
     }
 
+    //draw the residual flux curve
+    if ( document.getElementById("ToggleResidual").checked )
+    {  
+	ctx.strokeStyle = "#ff8c00";
+	ctx.beginPath();
+	for(var i=0;i<lambdaArray.length;i++){
+	    var x =         padx1 + (lambdaArray[i]-x0)*dx_inv;
+	    if ( x >= padx1 && x <= xsize-padx2 ) 
+	    { 
+		var y = ysize - pady - (smoothedresidualArray[i]-y0)*dy_inv;
+		var clip_y = Math.max(Math.min(y,ysize-pady),pady);
+		if ( i>=1) { ctx.lineTo(x,clip_y);}
+		else       { ctx.moveTo(x,clip_y);}
+	    }
+	}
+	ctx.stroke();
+	ctx.closePath();
+    }
+
     //draw the model curve
     if ( document.getElementById("ToggleModel").checked )
     {  
@@ -850,6 +873,7 @@ function updateSmoothing(){
     //re-calc the smoothed flux array
     var boxsize =  $("input[type='radio'][name='smoothing']:checked").val();
     smoothArray(fluxArray, smoothedArray, boxsize);
+    smoothArray(residualArray, smoothedresidualArray, boxsize);
     plotData();
 }