diff --git a/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp b/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp
index d9648f4fbac8c7e6a690fb4fcd26091c563d6cb6..e87541366a72267831bba290d4377166b0dfd1f5 100755
--- a/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp
@@ -87,13 +87,15 @@ namespace Mantid
         qCalculator = &SofQW2::calculateIndirectQ;
       }
 
-
+      PARALLEL_FOR2(inputWS, outputWS)
       for(int64_t i = 0; i < static_cast<int64_t>(nTheta); ++i) // signed for openmp
       {
+        PARALLEL_START_INTERUPT_REGION
+
         const double theta = m_thetaPts[i];
         const double efixed = getEFixed(inputWS->getDetector(i));
-        const double thetaLower = theta - m_thetaWidth;
-        const double thetaUpper = theta + m_thetaWidth;
+        const double thetaLower = theta - 0.5*m_thetaWidth;
+        const double thetaUpper = theta + 0.5*m_thetaWidth;
 
         for(size_t j = 0; j < nenergyBins; ++j)
         {
@@ -111,7 +113,24 @@ namespace Mantid
 
           rebinToOutput(inputQ, inputWS, i, j, outputWS);
         }
+
+        PARALLEL_END_INTERUPT_REGION
+      }
+      PARALLEL_CHECK_INTERUPT_REGION
+
+      const size_t nOutputHist(outputWS->getNumberHistograms());
+      // The errors need square-rooting
+      PARALLEL_FOR1(outputWS)
+      for(int64_t i = 0; i < static_cast<int64_t>(nOutputHist); ++i)
+      {
+        PARALLEL_START_INTERUPT_REGION
+
+        MantidVec& errors = outputWS->dataE(i);
+        std::transform(errors.begin(), errors.end(), errors.begin(), (double (*)(double))std::sqrt);
+
+        PARALLEL_END_INTERUPT_REGION
       }
+      PARALLEL_CHECK_INTERUPT_REGION
 
       // Divide by the bin width if the input is a distribution
       if( inputWS->isDistribution() )
@@ -146,7 +165,9 @@ namespace Mantid
           try
           {
             ConvexPolygon overlap = intersectionByLaszlo(outputQ, inputQ);
-            outputWS->dataY(qi)[ei] += inputWS->readY(i)[j] * (overlap.area()/inputQ.area());
+            const double weight = overlap.area()/inputQ.area();
+            outputWS->dataY(qi)[ei] += inputWS->readY(i)[j] * weight;
+            outputWS->dataE(qi)[ei] += std::pow(inputWS->readE(i)[j] * weight, 2);
           }
           catch(Geometry::NoIntersectionException &)
           {}
diff --git a/Code/Mantid/Framework/Algorithms/test/SofQW2Test.h b/Code/Mantid/Framework/Algorithms/test/SofQW2Test.h
index 68ec2680ed271365df8ea67ec8bdc57dc305e0cd..4c8e2e078b158ac938f8ddb280fb3ac8d619fdc6 100755
--- a/Code/Mantid/Framework/Algorithms/test/SofQW2Test.h
+++ b/Code/Mantid/Framework/Algorithms/test/SofQW2Test.h
@@ -69,28 +69,28 @@ public:
 //    std::cerr << "\n";
 //    for(int i = 0; i < 6; ++i)
 //    {
-//      std::cerr << std::setprecision(12) << result->readY(i)[bins[i]] << "  " << result->readE(i)[bins[i]];
+//      std::cerr << std::setprecision(12) << result->readY(i)[bins[i]] << "  " << result->readE(i)[bins[i]] << "\n";
 //    }
 //    std::cerr << "\n";
 
     const double delta(1e-08);
-    TS_ASSERT_DELTA( result->readY(0)[1160], 5.41214271, delta);
-    //TS_ASSERT_DELTA( result->readE(0)[1160], 0.062926550, delta);
+    TS_ASSERT_DELTA( result->readY(0)[1160], 0.0, delta);
+    TS_ASSERT_DELTA( result->readE(0)[1160], 0.0, delta);
 
-    TS_ASSERT_DELTA( result->readY(1)[1145], 13.12828673, delta);
-    //TS_ASSERT_DELTA( result->readE(1)[1145], 0.040755760, delta);
+    TS_ASSERT_DELTA( result->readY(1)[1145], 14.21487562, delta);
+    TS_ASSERT_DELTA( result->readE(1)[1145], 0.27891342, delta);
 
-    TS_ASSERT_DELTA( result->readY(2)[1200], 6.63459775, delta);
-    //TS_ASSERT_DELTA( result->readE(2)[1200], 0.021459611, delta);
+    TS_ASSERT_DELTA( result->readY(2)[1200], 5.33576534, delta);
+    TS_ASSERT_DELTA( result->readE(2)[1200], 0.16793570, delta);
 
-    TS_ASSERT_DELTA( result->readY(3)[99], 0.17718250  , delta);
-    //TS_ASSERT_DELTA( result->readE(3)[99],   0.007609629, delta);
+    TS_ASSERT_DELTA( result->readY(3)[99],  0.17843416 , delta);
+    TS_ASSERT_DELTA( result->readE(3)[99],  0.07401977, delta);
 
-    TS_ASSERT_DELTA( result->readY(4)[1654],0.07161639 , delta);
-    //TS_ASSERT_DELTA( result->readE(4)[1654], 0.00182863, delta);
+    TS_ASSERT_DELTA( result->readY(4)[1654], 0.06845460, delta);
+    TS_ASSERT_DELTA( result->readE(4)[1654], 0.02002920, delta);
 
-    TS_ASSERT_DELTA( result->readY(5)[1025], 0.14990359, delta);
-    //TS_ASSERT_DELTA( result->readE(5)[1025], 0.00410309, delta);
+    TS_ASSERT_DELTA( result->readY(5)[1025], 0.20644528, delta);
+    TS_ASSERT_DELTA( result->readE(5)[1025], 0.04115725, delta);
 
     AnalysisDataService::Instance().remove(inputWS);
     AnalysisDataService::Instance().remove(outputWS);