diff --git a/Framework/Algorithms/src/ScaleX.cpp b/Framework/Algorithms/src/ScaleX.cpp
index d0ea8c9c6f4d1c08c408a653a0f57e8f98576ce7..b6a9e6e3d11fea378320fb0a3239a6cef05d04c3 100644
--- a/Framework/Algorithms/src/ScaleX.cpp
+++ b/Framework/Algorithms/src/ScaleX.cpp
@@ -199,13 +199,14 @@ void ScaleX::execEvent() {
     PARALLEL_START_INTERUPT_REGION
     // Do the offsetting
     if ((i >= m_wi_min) && (i <= m_wi_max)) {
+      auto factor = getScaleFactor(inputWS, i);
       if (op == "Multiply") {
-        outputWS->getEventList(i).scaleTof(getScaleFactor(inputWS, i));
-        if (m_algFactor < 0) {
+        outputWS->getEventList(i).scaleTof(factor);
+        if (factor < 0) {
           outputWS->getEventList(i).reverse();
         }
       } else if (op == "Add") {
-        outputWS->getEventList(i).addTof(getScaleFactor(inputWS, i));
+        outputWS->getEventList(i).addTof(factor);
       }
     }
     m_progress->report("Scaling X");
diff --git a/Framework/Algorithms/test/ScaleXTest.h b/Framework/Algorithms/test/ScaleXTest.h
index f6173453e1f42025c86e576d59a962cb98739e66..0d415af03560636b133509579f8ce9fc79417607 100644
--- a/Framework/Algorithms/test/ScaleXTest.h
+++ b/Framework/Algorithms/test/ScaleXTest.h
@@ -88,7 +88,7 @@ public:
     pmap.addDouble(det1->getComponentID(), parname, det1Factor);
 
     auto det2 = inputWS->getDetector(1);
-    const double det2Factor(10);
+    const double det2Factor(-10);
     pmap.addDouble(det2->getComponentID(), parname, det2Factor);
 
     const double instFactor(100);
@@ -108,10 +108,22 @@ public:
         factor = instFactor;
 
       for (size_t j = 0; j < xsize; ++j) {
-        TS_ASSERT_DELTA(result->readX(i)[j], factor * inputWS->readX(i)[j],
-                        1e-12);
-        TS_ASSERT_EQUALS(result->readY(i)[j], inputWS->readY(i)[j]);
-        TS_ASSERT_EQUALS(result->readE(i)[j], inputWS->readE(i)[j]);
+        if (factor > 0) {
+          TS_ASSERT_DELTA(result->readX(i)[j], factor * inputWS->readX(i)[j],
+                          1e-12);
+          TS_ASSERT_EQUALS(result->readY(i)[j], inputWS->readY(i)[j]);
+          TS_ASSERT_EQUALS(result->readE(i)[j], inputWS->readE(i)[j]);
+        } else {
+          // ScaleX reverses the histogram if the factor is negative
+          // X vector has length xsize+1
+          TS_ASSERT_DELTA(result->readX(i)[j],
+                          factor * inputWS->readX(i)[xsize - j], 1e-12);
+          // Y and E have length xsize
+          TS_ASSERT_EQUALS(result->readY(i)[j],
+                           inputWS->readY(i)[xsize - 1 - j]);
+          TS_ASSERT_EQUALS(result->readE(i)[j],
+                           inputWS->readE(i)[xsize - 1 - j]);
+        }
       }
     }
   }
@@ -131,7 +143,7 @@ public:
     pmap.addDouble(det1->getComponentID(), parname, det1Factor);
 
     auto det2 = inputWS->getDetector(1);
-    const double det2Factor(10);
+    const double det2Factor(-10);
     pmap.addDouble(det2->getComponentID(), parname, det2Factor);
 
     const double instFactor(100);
@@ -143,6 +155,7 @@ public:
         boost::dynamic_pointer_cast<Mantid::API::IEventWorkspace>(result);
     TS_ASSERT(resultEventWS);
 
+    const size_t xsize = result->blocksize();
     for (size_t i = 0; i < resultEventWS->getNumberHistograms(); ++i) {
       double factor(1.0);
       if (i == 0)
@@ -163,6 +176,25 @@ public:
       for (size_t j = 0; i < inTOFs.size(); ++j) {
         TS_ASSERT_DELTA(outTOFs[j], factor * inTOFs[j], 1e-12);
       }
+
+      for (size_t j = 0; j < xsize; ++j) {
+        if (factor > 0) {
+          TS_ASSERT_DELTA(result->readX(i)[j], factor * inputWS->readX(i)[j],
+                          1e-12);
+          TS_ASSERT_EQUALS(result->readY(i)[j], inputWS->readY(i)[j]);
+          TS_ASSERT_EQUALS(result->readE(i)[j], inputWS->readE(i)[j]);
+        } else {
+          // ScaleX reverses the histogram if the factor is negative
+          // X vector has length xsize+1
+          TS_ASSERT_DELTA(result->readX(i)[j],
+                          factor * inputWS->readX(i)[xsize - j], 1e-12);
+          // Y and E have length xsize
+          TS_ASSERT_EQUALS(result->readY(i)[j],
+                           inputWS->readY(i)[xsize - 1 - j]);
+          TS_ASSERT_EQUALS(result->readE(i)[j],
+                           inputWS->readE(i)[xsize - 1 - j]);
+        }
+      }
     }
   }