diff --git a/Framework/Algorithms/test/Rebin2DTest.h b/Framework/Algorithms/test/Rebin2DTest.h
index 060756117e016d83c290c75ee4971f73b34f2c5b..35df733c043465433e6165015d498781be4e1417 100644
--- a/Framework/Algorithms/test/Rebin2DTest.h
+++ b/Framework/Algorithms/test/Rebin2DTest.h
@@ -126,8 +126,8 @@ public:
     TS_ASSERT_EQUALS(outputWS->getNumberHistograms(), 4);
     TS_ASSERT_EQUALS(outputWS->blocksize(), 6);
 
-    double errors[6] = {2.716615541, 2.50998008,  2.437211521,
-                        2.50998008,  2.716615541, 2.121320344};
+    double errors[6] = {3.,  3., 3.,
+                        3.,  3., 2.236067977};
 
     const double epsilon(1e-08);
     for (size_t i = 0; i < outputWS->getNumberHistograms(); ++i) {
diff --git a/Framework/Algorithms/test/SofQWCutTest.h b/Framework/Algorithms/test/SofQWCutTest.h
index 7b392a711eacdce6ff5e210225955fdbbc229c44..93f98324fcaa6b6e0b94500c46071ac522bb585c 100644
--- a/Framework/Algorithms/test/SofQWCutTest.h
+++ b/Framework/Algorithms/test/SofQWCutTest.h
@@ -140,15 +140,15 @@ public:
     TS_ASSERT_DELTA((*(ws_q->getAxis(1)))(400), 5.0, delta);
     TS_ASSERT_EQUALS((*(ws_q->getAxis(1)))(800), 10.);
     TS_ASSERT_DELTA(ws_q->readY(46)[0], 0.577055734, delta);
-    TS_ASSERT_DELTA(ws_q->readE(46)[0], 0.016266516, delta);
+    TS_ASSERT_DELTA(ws_q->readE(46)[0], 0.037384333, delta);
     TS_ASSERT_DELTA(ws_q->readY(461)[0], 0.642083585, delta);
-    TS_ASSERT_DELTA(ws_q->readE(461)[0], 0.027694702, delta);
+    TS_ASSERT_DELTA(ws_q->readE(461)[0], 0.050139186, delta);
     TS_ASSERT_DELTA(ws_q->readY(703)[0], 8.619229199, delta);
-    TS_ASSERT_DELTA(ws_q->readE(703)[0], 0.119106057, delta);
+    TS_ASSERT_DELTA(ws_q->readE(703)[0], 0.188331444, delta);
     TS_ASSERT_DELTA(ws_q->readY(727)[0], 1.212655693, delta);
-    TS_ASSERT_DELTA(ws_q->readE(727)[0], 0.047618940, delta);
+    TS_ASSERT_DELTA(ws_q->readE(727)[0], 0.071437133, delta);
     TS_ASSERT_DELTA(ws_q->readY(787)[0], 12.280788436, delta);
-    TS_ASSERT_DELTA(ws_q->readE(787)[0], 0.239880567, delta);
+    TS_ASSERT_DELTA(ws_q->readE(787)[0], 0.338125386, delta);
 
     auto ws_e =
         boost::dynamic_pointer_cast<MatrixWorkspace>(result->getItem(1));
@@ -162,15 +162,15 @@ public:
     TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(0), 5.);
     TS_ASSERT_EQUALS((*(ws_e->getAxis(1)))(1), 10.);
     TS_ASSERT_DELTA(ws_e->readY(0)[5], 1120.875680688, delta);
-    TS_ASSERT_DELTA(ws_e->readE(0)[5], 5.143783614, delta);
+    TS_ASSERT_DELTA(ws_e->readE(0)[5], 5.269885974, delta);
     TS_ASSERT_DELTA(ws_e->readY(0)[16], 171.212246850, delta);
-    TS_ASSERT_DELTA(ws_e->readE(0)[16], 2.079560024, delta);
+    TS_ASSERT_DELTA(ws_e->readE(0)[16], 2.134947683, delta);
     TS_ASSERT_DELTA(ws_e->readY(0)[28], 40.854749824, delta);
-    TS_ASSERT_DELTA(ws_e->readE(0)[28], 1.014309882, delta);
+    TS_ASSERT_DELTA(ws_e->readE(0)[28], 1.055504462, delta);
     TS_ASSERT_DELTA(ws_e->readY(0)[36], 54.655069317, delta);
-    TS_ASSERT_DELTA(ws_e->readE(0)[36], 1.179213931, delta);
+    TS_ASSERT_DELTA(ws_e->readE(0)[36], 1.225166860, delta);
     TS_ASSERT_DELTA(ws_e->readY(0)[113], 3.724579351, delta);
-    TS_ASSERT_DELTA(ws_e->readE(0)[113], 0.485226781, delta);
+    TS_ASSERT_DELTA(ws_e->readE(0)[113], 0.494593697, delta);
   }
 
   void test_sofqw3() {
diff --git a/Framework/Algorithms/test/SofQWPolygonTest.h b/Framework/Algorithms/test/SofQWPolygonTest.h
index 0461c8819f44e43af499e859adb22829ec5741e0..ba471e5d45036188061b8f0ce6f96708cc4b8b2d 100644
--- a/Framework/Algorithms/test/SofQWPolygonTest.h
+++ b/Framework/Algorithms/test/SofQWPolygonTest.h
@@ -40,22 +40,22 @@ public:
 
     const double delta(1e-08);
     TS_ASSERT_DELTA(result->y(0)[1160], 17.5583314826, delta);
-    TS_ASSERT_DELTA(result->e(0)[1160], 0.197345265992, delta);
+    TS_ASSERT_DELTA(result->e(0)[1160], 0.2251606553, delta);
 
     TS_ASSERT_DELTA(result->y(1)[1145], 4.61301046588, delta);
-    TS_ASSERT_DELTA(result->e(1)[1145], 0.0721823446635, delta);
+    TS_ASSERT_DELTA(result->e(1)[1145], 0.1161341763, delta);
 
     TS_ASSERT_DELTA(result->y(2)[1200], 1.33394133548, delta);
-    TS_ASSERT_DELTA(result->e(2)[1200], 0.0419839252961, delta);
+    TS_ASSERT_DELTA(result->e(2)[1200], 0.0610978549, delta);
 
     TS_ASSERT_DELTA(result->y(3)[99], 0.0446085388561, delta);
-    TS_ASSERT_DELTA(result->e(3)[99], 0.0185049423467, delta);
+    TS_ASSERT_DELTA(result->e(3)[99], 0.0249727396, delta);
 
     TS_ASSERT_DELTA(result->y(4)[1654], 0.0171136490957, delta);
-    TS_ASSERT_DELTA(result->e(4)[1654], 0.005007299861, delta);
+    TS_ASSERT_DELTA(result->e(4)[1654], 0.0057467706, delta);
 
     TS_ASSERT_DELTA(result->y(5)[1025], 0.0516113202152, delta);
-    TS_ASSERT_DELTA(result->e(5)[1025], 0.0102893133461, delta);
+    TS_ASSERT_DELTA(result->e(5)[1025], 0.0128755226, delta);
 
     // Spectra-detector mapping
     const size_t nspectra(6);
diff --git a/Framework/DataObjects/src/FractionalRebinning.cpp b/Framework/DataObjects/src/FractionalRebinning.cpp
index 3f5d59bc8d73102697d672e40bb674bc21073f66..1d6bf716ab0fe5a33c9dcc36837d2c2103d64999 100644
--- a/Framework/DataObjects/src/FractionalRebinning.cpp
+++ b/Framework/DataObjects/src/FractionalRebinning.cpp
@@ -543,14 +543,14 @@ void rebinToOutput(const Quadrilateral &inputQ,
       if (intersection(outputQ, inputQ, intersectOverlap)) {
         const double weight = intersectOverlap.area() / inputQ.area();
         yValue *= weight;
-        double eValue = inE[j] * weight;
+        double eValue = inE[j];
         if (inputWS->isDistribution()) {
           const double overlapWidth =
               intersectOverlap.maxX() - intersectOverlap.minX();
           yValue *= overlapWidth;
           eValue *= overlapWidth;
         }
-        eValue = eValue * eValue;
+        eValue = eValue * eValue * weight;
         PARALLEL_CRITICAL(overlap_sum) {
           outputWS->mutableY(y)[xi] += yValue;
           outputWS->mutableE(y)[xi] += eValue;
@@ -621,7 +621,6 @@ void rebinToFractionalOutput(const Quadrilateral &inputQ,
   // If the input is a RebinnedOutput workspace with frac. area we need
   // to account for the weight of the input bin in the output bin weights
   double inputWeight = 1.;
-  double variance = error * error;
   auto inputRB = boost::dynamic_pointer_cast<const RebinnedOutput>(inputWS);
   if (inputRB) {
     const auto &inF = inputRB->dataF(i);
@@ -630,10 +629,11 @@ void rebinToFractionalOutput(const Quadrilateral &inputQ,
     // we need to undo this before carrying on.
     if (inputRB->isFinalized()) {
       signal *= inF[j];
-      variance *= inF[j] * inF[j]; // It was the _error_ which was scaled.
+      error *= inF[j];
     }
   }
 
+  const double variance = error * error;
   for (const auto &ai : areaInfo) {
     const size_t xi = std::get<0>(ai);
     const size_t yi = std::get<1>(ai);