diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/WorkspaceValidators.h b/Code/Mantid/Framework/API/inc/MantidAPI/WorkspaceValidators.h
index ee9485b4d8782d5dabe514e56fa9fb95a461c597..fbc3c24c4aeca04bd06bb794660c0a80e7b79163 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/WorkspaceValidators.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/WorkspaceValidators.h
@@ -369,6 +369,44 @@ private:
   }
 };
 
+//===============================================================================================
+/**
+ * A validator which checks whether data in each spectrum of the input workspace are monotonically increasing.
+ */
+class DLLExport IncreasingDataValidator : public MatrixWorkspaceValidator
+{
+public:
+  ///Gets the type of the validator
+  std::string getType() const { return "increasingdata"; }
+  /// Clone the current state
+  Kernel::IValidator_sptr clone() const { return boost::make_shared<IncreasingDataValidator>(*this); }
+
+private:
+  /** Validate a workspace.
+  *  @param value :: The workspace to test
+  *  @return A message for users with negative results, otherwise ""
+  */
+  std::string checkValidity( const MatrixWorkspace_sptr& value ) const
+  {
+    if ( value->blocksize() < 2 ) 
+    {
+      return "Spectra must have two or more data points (bins).";
+    }
+    for(size_t spec = 0; spec < value->getNumberHistograms(); ++spec)
+    {
+      auto &Y = value->readY( spec );
+      double y = Y.front();
+      for(auto it = Y.begin() + 1; it != Y.end(); ++it)
+      {
+        if ( y > *it ) return "Data in the workspace must monotonically increase.";
+        y = *it;
+      }
+    }
+    return "";
+  }
+
+};
+
 } // namespace API
 } // namespace Mantid
 
diff --git a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
index e0fdf07f80079d8be53e1ec6a5f81cbab17f9267..ab0039013900d48500ed29dd06a8ffc1375ab9d8 100644
--- a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
+++ b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
@@ -28,6 +28,7 @@ set ( SRC_FILES
 	src/FindPeaksMD.cpp
 	src/GreaterThanMD.cpp
 	src/IDynamicRebinning.cpp
+	src/IntegrateFlux.cpp
 	src/IntegratePeaksMD.cpp
 	src/IntegratePeaksMD2.cpp
 	src/InvalidParameter.cpp
@@ -63,7 +64,7 @@ set ( SRC_FILES
 	src/Quantification/Resolution/TobyFitYVector.cpp
 	src/Quantification/ResolutionConvolvedCrossSection.cpp
 	src/Quantification/SimulateResolutionConvolvedModel.cpp
-	src/SXDMDNorm.cpp
+	src/MDNormSXD.cpp
 	src/SaveMD.cpp
 	src/SaveZODS.cpp
 	src/SetMDUsingMask.cpp
@@ -103,13 +104,14 @@ set ( INC_FILES
 	inc/MantidMDAlgorithms/DivideMD.h
 	inc/MantidMDAlgorithms/DllConfig.h
 	inc/MantidMDAlgorithms/EqualToMD.h
-	inc/MantidMDAlgorithms/ExponentialMD.h
 	inc/MantidMDAlgorithms/EvaluateMDFunction.h
+	inc/MantidMDAlgorithms/ExponentialMD.h
 	inc/MantidMDAlgorithms/FakeMDEventData.h
 	inc/MantidMDAlgorithms/FindPeaksMD.h
 	inc/MantidMDAlgorithms/GSLFunctions.h
 	inc/MantidMDAlgorithms/GreaterThanMD.h
 	inc/MantidMDAlgorithms/IDynamicRebinning.h
+	inc/MantidMDAlgorithms/IntegrateFlux.h
 	inc/MantidMDAlgorithms/IntegratePeaksMD.h
 	inc/MantidMDAlgorithms/IntegratePeaksMD2.h
 	inc/MantidMDAlgorithms/InvalidParameter.h
@@ -145,7 +147,7 @@ set ( INC_FILES
 	inc/MantidMDAlgorithms/Quantification/Resolution/TobyFitYVector.h
 	inc/MantidMDAlgorithms/Quantification/ResolutionConvolvedCrossSection.h
 	inc/MantidMDAlgorithms/Quantification/SimulateResolutionConvolvedModel.h
-	inc/MantidMDAlgorithms/SXDMDNorm.h
+	inc/MantidMDAlgorithms/MDNormSXD.h
 	inc/MantidMDAlgorithms/SaveMD.h
 	inc/MantidMDAlgorithms/SaveZODS.h
 	inc/MantidMDAlgorithms/SetMDUsingMask.h
@@ -186,13 +188,14 @@ set ( TEST_FILES
 	CreateMDWorkspaceTest.h
 	DivideMDTest.h
 	EqualToMDTest.h
-	ExponentialMDTest.h
 	EvaluateMDFunctionTest.h
+	ExponentialMDTest.h
 	FakeMDEventDataTest.h
 	FindPeaksMDTest.h
 	FitResolutionConvolvedModelTest.h
 	ForegroundModelTest.h
 	GreaterThanMDTest.h
+	IntegrateFluxTest.h
 	IntegratePeaksMD2Test.h
 	IntegratePeaksMDTest.h
 	InvalidParameterParserTest.h
@@ -215,7 +218,7 @@ set ( TEST_FILES
 	PowerMDTest.h
 	PreprocessDetectorsToMDTest.h
 	ResolutionConvolvedCrossSectionTest.h
-	SXDMDNormTest.h
+	MDNormSXDTest.h
 	SaveMDTest.h
 	SaveZODSTest.h
 	SetMDUsingMaskTest.h
diff --git a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/IntegrateFlux.h b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/IntegrateFlux.h
new file mode 100644
index 0000000000000000000000000000000000000000..0b652515c80f72b8205dba395d33db003c20864e
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/IntegrateFlux.h
@@ -0,0 +1,65 @@
+#ifndef MANTID_MDALGORITHMS_INTEGRATEFLUX_H_
+#define MANTID_MDALGORITHMS_INTEGRATEFLUX_H_
+
+#include "MantidKernel/System.h"
+#include "MantidAPI/Algorithm.h"
+
+namespace Mantid
+{
+
+namespace DataObjects
+{
+  class EventWorkspace;
+}
+
+namespace MDAlgorithms
+{
+
+  /** Algorithm IntegrateFlux.
+
+    Calculates indefinite integral of the spectra in the input workspace sampled at a regular grid.
+    The input workspace is expected to be an event workspace with weighted-no-time events.
+
+    Copyright &copy; 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory
+
+    This file is part of Mantid.
+
+    Mantid is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 3 of the License, or
+    (at your option) any later version.
+
+    Mantid is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+    File change history is stored at: <https://github.com/mantidproject/mantid>
+    Code Documentation is available at: <http://doxygen.mantidproject.org>
+  */
+  class DLLExport IntegrateFlux  : public API::Algorithm
+  {
+  public:
+
+    virtual const std::string name() const;
+    virtual int version() const;
+    virtual const std::string category() const;
+    virtual const std::string summary() const;
+
+  private:
+    void init();
+    void exec();
+
+    boost::shared_ptr<API::MatrixWorkspace> createOutputWorkspace( const DataObjects::EventWorkspace& eventWS, size_t nX ) const;
+    void integrateSpectra( const DataObjects::EventWorkspace& eventWS, API::MatrixWorkspace &integrWS );
+
+  };
+
+
+} // namespace MDAlgorithms
+} // namespace Mantid
+
+#endif  /* MANTID_MDALGORITHMS_INTEGRATEFLUX_H_ */
\ No newline at end of file
diff --git a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/MDNormSXD.h
similarity index 76%
rename from Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h
rename to Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/MDNormSXD.h
index a6d7c3e1218239423bbca99136a968d18e4b1eb6..1c791f73ff3144a861573ef311702bbe00dc3842 100644
--- a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h
+++ b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/MDNormSXD.h
@@ -1,15 +1,19 @@
-#ifndef MANTID_MDALGORITHMS_SXDMDNORM_H_
-#define MANTID_MDALGORITHMS_SXDMDNORM_H_
+#ifndef MANTID_MDALGORITHMS_MDNORMSXD_H_
+#define MANTID_MDALGORITHMS_MDNORMSXD_H_
 
 #include "MantidKernel/System.h"
 #include "MantidAPI/Algorithm.h"
 #include "MantidMDAlgorithms/SlicingAlgorithm.h"
 namespace Mantid
 {
+namespace DataObjects
+{
+  class EventWorkspace;
+}
 namespace MDAlgorithms
 {
 
-  /** SXDMDNorm : Generate MD normalization for single crystal diffraction
+  /** MDNormSXD : Generate MD normalization for single crystal diffraction
 
     Copyright &copy; 2014 ISIS Rutherford Appleton Laboratory & NScD Oak Ridge National Laboratory
 
@@ -31,13 +35,11 @@ namespace MDAlgorithms
     File change history is stored at: <https://github.com/mantidproject/mantid>
     Code Documentation is available at: <http://doxygen.mantidproject.org>
   */
-  bool compareMomentum(Mantid::Kernel::VMD v1, Mantid::Kernel::VMD v2);
-
-  class DLLExport SXDMDNorm  :public SlicingAlgorithm
+  class DLLExport MDNormSXD  :public SlicingAlgorithm
   {
   public:
-    SXDMDNorm();
-    virtual ~SXDMDNorm();
+    MDNormSXD();
+    virtual ~MDNormSXD();
     
     virtual const std::string name() const;
     virtual int version() const;
@@ -50,6 +52,11 @@ namespace MDAlgorithms
 
     /// function to calculate intersections of teh trajectory with MDBoxes
     std::vector<Mantid::Kernel::VMD> calculateIntersections(Mantid::Geometry::IDetector_const_sptr detector);
+    /// Integrate flux spectra
+    void integrateFlux( const DataObjects::EventWorkspace& flux, API::MatrixWorkspace &integrFlux );
+    /// Use interpolation to calculate integrals
+    void calcIntegralsForIntersections( const std::vector<double> &xValues, const API::MatrixWorkspace &integrFlux, size_t sp, std::vector<double> &yValues ) const;
+
     /// number of MD dimensions
     size_t m_nDims;
     /// Normalization workspace
@@ -74,4 +81,4 @@ namespace MDAlgorithms
 } // namespace MDAlgorithms
 } // namespace Mantid
 
-#endif  /* MANTID_MDALGORITHMS_SXDMDNORM_H_ */
+#endif  /* MANTID_MDALGORITHMS_MDNORMSXD_H_ */
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/IntegrateFlux.cpp b/Code/Mantid/Framework/MDAlgorithms/src/IntegrateFlux.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..65f7469307f303c918b4e02f0b93fd6526b7ae8b
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/src/IntegrateFlux.cpp
@@ -0,0 +1,164 @@
+#include "MantidMDAlgorithms/IntegrateFlux.h"
+#include "MantidDataObjects/EventWorkspace.h"
+#include "MantidAPI/MatrixWorkspace.h"
+#include "MantidAPI/WorkspaceFactory.h"
+#include "MantidKernel/BoundedValidator.h"
+
+#include <boost/make_shared.hpp>
+
+namespace Mantid
+{
+namespace MDAlgorithms
+{
+
+  using Mantid::Kernel::Direction;
+  using Mantid::API::WorkspaceProperty;
+
+  // Register the algorithm into the AlgorithmFactory
+  DECLARE_ALGORITHM(IntegrateFlux)
+
+namespace{
+
+  /// Void deleter for shared pointers
+class NoEventWorkspaceDeleting
+{
+public:
+    /// deleting operator. Does nothing
+  void operator()(const DataObjects::EventWorkspace*){}
+};
+
+}
+
+  //----------------------------------------------------------------------------------------------
+
+  /// Algorithms name for identification. @see Algorithm::name
+  const std::string IntegrateFlux::name() const { return "IntegrateFlux"; }
+
+  /// Algorithm's version for identification. @see Algorithm::version
+  int IntegrateFlux::version() const { return 1;};
+
+  /// Algorithm's category for identification. @see Algorithm::category
+  const std::string IntegrateFlux::category() const { return "MDAlgorithms";}
+
+  /// Algorithm's summary for use in the GUI and help. @see Algorithm::summary
+  const std::string IntegrateFlux::summary() const { return "Interates spectra in a matrix workspace at a set of points.";};
+
+  //----------------------------------------------------------------------------------------------
+  /** Initialize the algorithm's properties.
+   */
+  void IntegrateFlux::init()
+  {
+    declareProperty(new WorkspaceProperty<DataObjects::EventWorkspace>("InputWorkspace","",Direction::Input), "An input workspace.");
+    auto validator = boost::make_shared<Kernel::BoundedValidator<int>>();
+    validator->setLower(2);
+    declareProperty("NPoints", 1000, validator, "Number of points per output spectrum.");
+    declareProperty(new WorkspaceProperty<API::Workspace>("OutputWorkspace","",Direction::Output), "An output workspace.");
+  }
+
+  //----------------------------------------------------------------------------------------------
+  /** Execute the algorithm.
+   */
+  void IntegrateFlux::exec()
+  {
+    DataObjects::EventWorkspace_sptr inputWS = getProperty("InputWorkspace");
+    size_t nX = static_cast<size_t>( (int)getProperty("NPoints") );
+
+    auto outputWS = createOutputWorkspace( *inputWS, nX );
+
+    integrateSpectra( *inputWS, *outputWS );
+
+    setProperty("OutputWorkspace",outputWS);
+  }
+
+  /**
+   * Create an empty output workspace with required dimensions and defined x-values
+   * @param eventWS :: The input event workspace.
+   * @param nX :: Suggested size of the output spectra. It can change in the actual output.
+   */
+  boost::shared_ptr<API::MatrixWorkspace> IntegrateFlux::createOutputWorkspace( const DataObjects::EventWorkspace& eventWS, size_t nX ) const
+  {
+    size_t nSpec = eventWS.getNumberHistograms();
+
+    if ( nSpec == 0 )
+    {
+      throw std::runtime_error("Input workspace has no data.");
+    }
+
+    // make sure the output spectrum size isn't too large
+    auto nEvents = eventWS.getEventList(0).getNumberEvents();
+    if ( nX > nEvents )
+    {
+      nX = nEvents;
+    }
+
+    // and not 0 or 1 as they are to be used for interpolation
+    if ( nX < 2 )
+    {
+      throw std::runtime_error("Failed to create output."
+        "Output spectra should have at least two points.");
+    }
+
+    // crate empty output workspace
+    API::MatrixWorkspace_sptr ws = API::WorkspaceFactory::Instance().create( 
+      boost::shared_ptr<const DataObjects::EventWorkspace>(&eventWS,NoEventWorkspaceDeleting()), 
+      nSpec, nX, nX );
+
+    // claculate the integration points and save them in the x-vactors of integrFlux
+    double xMin = eventWS.getEventXMin();
+    double xMax = eventWS.getEventXMax();
+    double dx = ( xMax - xMin ) / static_cast<double>( nX - 1 );
+    auto &X = ws->dataX(0);
+    auto ix = X.begin();
+    // x-values are equally spaced between the min and max tof in the first flux spectrum
+    for(double x = xMin; ix != X.end(); ++ix, x += dx)
+    {
+      *ix = x;
+    }
+
+    // share the xs for all spectra
+    auto xRef = ws->refX(0);
+    for(size_t sp = 1; sp < nSpec; ++sp)
+    {
+      ws->setX(sp,xRef);
+    }
+
+    return ws;
+  }
+
+  /**
+   * Integrate spectra in eventWS at x-values in integrWS and save the results in y-vectors of integrWS.
+   * @param eventWS :: A workspace to integrate. The events have to be weighted-no-time.
+   * @param integrWS :: A workspace to store the results.
+   */
+  void IntegrateFlux::integrateSpectra( const DataObjects::EventWorkspace& eventWS, API::MatrixWorkspace &integrWS )
+  {
+    size_t nSpec = eventWS.getNumberHistograms();
+    assert( nSpec == integrWS.getNumberHistograms() );
+
+    auto &X = integrWS.readX(0);
+    // loop overr the spectra and integrate
+    for(size_t sp = 0; sp < nSpec; ++sp)
+    {
+      std::vector<Mantid::DataObjects::WeightedEventNoTime> el = eventWS.getEventList(sp).getWeightedEventsNoTime();
+      auto &outY = integrWS.dataY(sp);
+      double sum = 0;
+      auto x = X.begin() + 1;
+      size_t i = 1;
+      // the integral is a running sum of the event weights in the spectrum
+      for(auto evnt = el.begin(); evnt != el.end(); ++evnt)
+      {
+        double tof = evnt->tof();
+        while( x != X.end() && *x < tof )
+        {
+          outY[i] = sum;
+          ++x; ++i;
+        }
+        if ( x == X.end() ) break;
+        sum += evnt->weight();
+        outY[i] = sum;
+      }
+    }
+  }
+
+} // namespace MDAlgorithms
+} // namespace Mantid
\ No newline at end of file
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp b/Code/Mantid/Framework/MDAlgorithms/src/MDNormSXD.cpp
similarity index 74%
rename from Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp
rename to Code/Mantid/Framework/MDAlgorithms/src/MDNormSXD.cpp
index db70979476418d76a42f6ba3005159b844c8a2d6..49fa22981141f86b2a014a9a18b5b89ef488a306 100644
--- a/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp
+++ b/Code/Mantid/Framework/MDAlgorithms/src/MDNormSXD.cpp
@@ -1,4 +1,4 @@
-#include "MantidMDAlgorithms/SXDMDNorm.h"
+#include "MantidMDAlgorithms/MDNormSXD.h"
 #include "MantidMDEvents/MDEventWorkspace.h"
 #include "MantidMDEvents/MDHistoWorkspace.h"
 #include "MantidAPI/WorkspaceValidators.h"
@@ -16,21 +16,28 @@ namespace MDAlgorithms
   using namespace Mantid::API;
   using namespace Mantid::Kernel;
 
+  namespace{
+
   ///function to  compare two intersections (h,k,l,Momentum) by Momentum
   bool compareMomentum(const Mantid::Kernel::VMD &v1, const Mantid::Kernel::VMD &v2)
   {
     return (v1[3]<v2[3]);
   }
 
+  // size of the interpolation tables for the integrated flux spectra
+  const size_t interpolationSize = 1000;
+
+  }
+
   // Register the algorithm into the AlgorithmFactory
-  DECLARE_ALGORITHM(SXDMDNorm)
+  DECLARE_ALGORITHM(MDNormSXD)
 
 
 
   //----------------------------------------------------------------------------------------------
   /** Constructor
    */
-  SXDMDNorm::SXDMDNorm()
+  MDNormSXD::MDNormSXD()
   {
       hIndex=-1;
       kIndex=-1;
@@ -47,7 +54,7 @@ namespace MDAlgorithms
   //----------------------------------------------------------------------------------------------
   /** Destructor
    */
-  SXDMDNorm::~SXDMDNorm()
+  MDNormSXD::~MDNormSXD()
   {
   }
 
@@ -56,21 +63,21 @@ namespace MDAlgorithms
 
 
   /// Algorithm's version for identification. @see Algorithm::version
-  int SXDMDNorm::version() const { return 1;}
+  int MDNormSXD::version() const { return 1;}
 
   /// Algorithm's category for identification. @see Algorithm::category
-  const std::string SXDMDNorm::category() const { return "MDAlgorithms";}
+  const std::string MDNormSXD::category() const { return "MDAlgorithms";}
 
   /// Algorithm's summary for use in the GUI and help. @see Algorithm::summary
-  const std::string SXDMDNorm::summary() const { return "Calculate normalization for an MDEvent workspace for single crystal diffraction.";}
+  const std::string MDNormSXD::summary() const { return "Calculate normalization for an MDEvent workspace for single crystal diffraction.";}
 
   /// Algorithm's name for use in the GUI and help. @see Algorithm::name
-  const std::string SXDMDNorm::name() const { return "SXDMDNorm";}
+  const std::string MDNormSXD::name() const { return "MDNormSXD";}
 
   //----------------------------------------------------------------------------------------------
   /** Initialize the algorithm's properties.
    */
-  void SXDMDNorm::init()
+  void MDNormSXD::init()
   {
       declareProperty(new WorkspaceProperty<IMDEventWorkspace>("InputWorkspace","",Direction::Input), "An input MDWorkspace.");
 
@@ -85,13 +92,15 @@ namespace MDAlgorithms
                "Enter it as a comma-separated list of values with the format: 'name,minimum,maximum,number_of_bins'. Leave blank for NONE.");
       }
 
-      auto wsValidator = boost::make_shared<CompositeValidator>();
-      wsValidator->add<WorkspaceUnitValidator>("Momentum");
-      wsValidator->add<InstrumentValidator>();
-      wsValidator->add<CommonBinsValidator>();
+      auto fluxValidator = boost::make_shared<CompositeValidator>();
+      fluxValidator->add<WorkspaceUnitValidator>("Momentum");
+      fluxValidator->add<InstrumentValidator>();
+      fluxValidator->add<CommonBinsValidator>();
+      auto solidAngleValidator = fluxValidator->clone();
+      fluxValidator->add<IncreasingDataValidator>();
 
-      declareProperty(new WorkspaceProperty<>("FluxWorkspace","",Direction::Input,wsValidator), "An input workspace containing momentum dependent flux.");
-      declareProperty(new WorkspaceProperty<>("SolidAngleWorkspace","",Direction::Input,wsValidator->clone()), "An input workspace containing momentum integrated vanadium (a measure of the solid angle).");
+      declareProperty(new WorkspaceProperty<>("FluxWorkspace","",Direction::Input,fluxValidator), "An input workspace containing integrated momentum dependent flux.");
+      declareProperty(new WorkspaceProperty<>("SolidAngleWorkspace","",Direction::Input,solidAngleValidator), "An input workspace containing momentum integrated vanadium (a measure of the solid angle).");
 
       declareProperty(new WorkspaceProperty<Workspace>("OutputWorkspace","",Direction::Output), "A name for the output data MDHistoWorkspace.");
       declareProperty(new WorkspaceProperty<Workspace>("OutputNormalizationWorkspace","",Direction::Output), "A name for the output normalization MDHistoWorkspace.");
@@ -100,7 +109,7 @@ namespace MDAlgorithms
   //----------------------------------------------------------------------------------------------
   /** Execute the algorithm.
    */
-  void SXDMDNorm::exec()
+  void MDNormSXD::exec()
   {
       bool skipProcessing=false;
       m_inputWS=getProperty("InputWorkspace");
@@ -256,13 +265,10 @@ namespace MDAlgorithms
         m_lX[i] = lDim.getX(i);
       }
 
-      Mantid::API::MatrixWorkspace_const_sptr fW=getProperty("FluxWorkspace");
-      Mantid::DataObjects::EventWorkspace_const_sptr fluxW = boost::dynamic_pointer_cast<const Mantid::DataObjects::EventWorkspace>(fW);
-      KincidentMin=fluxW->getEventXMin();
-      KincidentMax=fluxW->getEventXMax();
+      Mantid::API::MatrixWorkspace_const_sptr integrFlux = getProperty("FluxWorkspace");
+      integrFlux->getXMinMax(KincidentMin,KincidentMax);
       Mantid::API::MatrixWorkspace_const_sptr sA=getProperty("SolidAngleWorkspace");
 
-
       if (skipProcessing)
       {
           g_log.warning("Binning limits are outside the limits of the MDWorkspace\n");
@@ -285,8 +291,8 @@ namespace MDAlgorithms
           std::vector<detid_t> detIDS=m_normWS->getExperimentInfo(0)->getInstrument()->getDetectorIDs(true);
 
           Mantid::API::Progress *prog=new Mantid::API::Progress(this,0.3,1,static_cast<int64_t>(detIDS.size()));
-          const detid2index_map d2m=fluxW->getDetectorIDToWorkspaceIndexMap();
-          const detid2index_map d2mSA=sA->getDetectorIDToWorkspaceIndexMap();
+          const detid2index_map d2m = integrFlux->getDetectorIDToWorkspaceIndexMap();
+          const detid2index_map d2mSA = sA->getDetectorIDToWorkspaceIndexMap();
           auto instrument = m_normWS->getExperimentInfo(0)->getInstrument();
 
           PARALLEL_FOR1(m_normWS)
@@ -305,28 +311,44 @@ namespace MDAlgorithms
                       //add to the correct signal at that particular index
                       //NOTE: if parallel it has to be atomic/critical
 
-                      //get event vector
+                      //get flux spectrum number
                       size_t sp=d2m.find(detIDS[i])->second;
-                      std::vector<Mantid::DataObjects::WeightedEventNoTime> el=fluxW->getEventList(sp).getWeightedEventsNoTime();
-                      //get iterator to the first event that has momentum >= (*intersections.begin())[3]
-                      std::vector<Mantid::DataObjects::WeightedEventNoTime>::iterator start=el.begin();
-                      // check that el isn't empty
-                      if ( start == el.end() ) continue;
-                      while((*start).tof()<(*intersections.begin())[3]) ++start;
-
+                      // get the solid angle
                       double solid=sA->readY(d2mSA.find(detIDS[i])->second)[0]*PC;
 
                       const size_t sizeOfMVD = intersections.front().size();
                       // pre-allocate for efficiency
                       std::vector<coord_t> pos( sizeOfMVD + otherValues.size() );
 
-                      for (auto it=intersections.begin()+1;it!=intersections.end();++it)
+                      auto intersectionsBegin = intersections.begin();
+
+                      // calculate integrals for the intersection
+
+                      // momentum values at intersections
+                      std::vector<double> xValues( intersections.size() );
+                      // buffer for the integrals
+                      std::vector<double> yValues( intersections.size() );
+                      {
+                        // copy momenta to xValues
+                        auto x = xValues.begin();
+                        for (auto it = intersectionsBegin; it != intersections.end(); ++it, ++x)
+                        {
+                          *x = (*it)[3];
+                        }
+                      }
+                      // calculate integrals at momenta from xValues by interpolating between points in spectrum sp
+                      // of workspace integrFlux. The result is stored in yValues
+                      calcIntegralsForIntersections( xValues, *integrFlux, sp, yValues );
+
+                      for (auto it = intersectionsBegin + 1; it != intersections.end(); ++it)
                       {
                           //Mantid::Kernel::VMD deltav=(*it)-(*(it-1));//difference between consecutive intersections
                           // the full vector isn't used so compute only what is necessary
-                          double delta = (*it)[3] - (*(it-1))[3];
+                          const double xStart = (*(it-1))[3];
+                          const double xEnd = (*it)[3];
+                          const double delta = xEnd - xStart;
+                          const double eps=1e-7;//do not integrate if momemntum difference is smaller than eps, assume contribution is 0
 
-                          double eps=1e-7;//do not integrate if momemntum difference is smaller than eps, assume contribution is 0
                           if (delta > eps)
                           {
                               //Mantid::Kernel::VMD avev=((*it)+(*(it-1)))*0.5;//average between two intersection (to get position)
@@ -342,14 +364,10 @@ namespace MDAlgorithms
 
                               if(linIndex!=size_t(-1))
                               {
-                                  double signal=0.;
-                                  while((*start).tof()<(*it)[3])
-                                  {
-                                      if (start==el.end())
-                                          break;
-                                      signal+=(*start).weight();
-                                      ++start;
-                                  }
+                                  // index of the current intersection
+                                  size_t k = static_cast<size_t>( std::distance( intersectionsBegin, it ) );
+                                  // signal = integral between two consecutive intersections
+                                  double signal = yValues[k] - yValues[k - 1];
                                   signal*=solid;
 
                                   PARALLEL_CRITICAL(updateMD)
@@ -375,7 +393,7 @@ namespace MDAlgorithms
   }
 
 
-  std::vector<Mantid::Kernel::VMD> SXDMDNorm::calculateIntersections(Mantid::Geometry::IDetector_const_sptr detector)
+  std::vector<Mantid::Kernel::VMD> MDNormSXD::calculateIntersections(Mantid::Geometry::IDetector_const_sptr detector)
   {
         std::vector<Mantid::Kernel::VMD> intersections;
         double th=detector->getTwoTheta(V3D(0,0,0),V3D(0,0,1));
@@ -568,5 +586,140 @@ namespace MDAlgorithms
         return intersections;
   }
 
+  /**
+   * Integrate spectra in flux at x-values in integrFlux and save the results in y-vectors of integrFlux.
+   * @param flux :: A workspace to integrate.
+   * @param integrFlux :: A workspace to store the results.
+   */
+  void MDNormSXD::integrateFlux( const DataObjects::EventWorkspace& flux, API::MatrixWorkspace &integrFlux )
+  {
+    size_t nSpec = flux.getNumberHistograms();
+    assert( nSpec == integrFlux.getNumberHistograms() );
+
+    // claculate the integration points and save them in the x-vactors of integrFlux
+    double xMin = flux.getEventXMin();
+    double xMax = flux.getEventXMax();
+    double dx = ( xMax - xMin ) / static_cast<double>( integrFlux.blocksize() - 1 );
+    auto &X = integrFlux.dataX(0);
+    auto ix = X.begin();
+    // x-values are equally spaced between the min and max tof in the first flux spectrum
+    for(double x = xMin; ix != X.end(); ++ix, x += dx)
+    {
+      *ix = x;
+    }
+
+    // loop overr the spectra and integrate
+    for(size_t sp = 0; sp < nSpec; ++sp)
+    {
+      if ( sp > 0 )
+      {
+        integrFlux.setX(sp,X);
+      }
+      std::vector<Mantid::DataObjects::WeightedEventNoTime> el = flux.getEventList(sp).getWeightedEventsNoTime();
+      auto &outY = integrFlux.dataY(sp);
+      double sum = 0;
+      auto x = X.begin() + 1;
+      size_t i = 1;
+      // the integral is a running sum of the event weights in the spectrum
+      for(auto evnt = el.begin(); evnt != el.end(); ++evnt)
+      {
+        double tof = evnt->tof();
+        while( x != X.end() && *x < tof )
+        {
+          ++x; ++i;
+        }
+        if ( x == X.end() ) break;
+        sum += evnt->weight();
+        outY[i] = sum;
+      }
+    }
+  }
+
+  /**
+   * LInearly interpolate between the points in integrFlux at xValues and save the results in yValues.
+   * @param xValues :: X-values at which to interpolate
+   * @param integrFlux :: A workspace with the spectra to interpolate
+   * @param sp :: A workspace index for a spectrum in integrFlux to interpolate.
+   * @param yValues :: A vector to save the results.
+   */
+  void MDNormSXD::calcIntegralsForIntersections( const std::vector<double> &xValues, const API::MatrixWorkspace &integrFlux, size_t sp, std::vector<double> &yValues ) const
+  {
+    assert( xValues.size() == yValues.size() );
+
+    // the x-data from the workspace
+    auto &xData = integrFlux.readX(sp);
+    const double xStart = xData.front();
+    const double xEnd = xData.back();
+
+    // the values in integrFlux are expected to be integrals of a non-negative function
+    // ie they must make a non-decreasing function
+    auto &yData = integrFlux.readY(sp);
+    size_t spSize = yData.size();
+
+    const double yMin = 0.0;
+    const double yMax = yData.back();
+
+    size_t nData = xValues.size();
+    // all integrals below xStart must be 0
+    if (xValues[nData-1] < xStart)
+    {
+      std::fill( yValues.begin(), yValues.end(), yMin );
+      return;
+    }
+
+    // all integrals above xEnd must be equal tp yMax
+    if ( xValues[0] > xEnd )
+    {
+      std::fill( yValues.begin(), yValues.end(), yMax );
+      return;
+    }
+
+    size_t i = 0;
+    // integrals below xStart must be 0
+    while(i < nData - 1 && xValues[i] < xStart)
+    {
+      yValues[i] = yMin;
+      i++;
+    }
+    size_t j = 0;
+    for(;i<nData;i++)
+    {
+      // integrals above xEnd must be equal tp yMax
+      if (j >= spSize - 1)
+      {
+        yValues[i] = yMax;
+      }
+      else
+      {
+        double xi = xValues[i];
+        while(j < spSize - 1 && xi > xData[j]) j++;
+        // if x falls onto an interpolation point return the corresponding y
+        if (xi == xData[j])
+        {
+          yValues[i] = yData[j];
+        }
+        else if (j == spSize - 1)
+        {
+          // if we get above xEnd it's yMax
+          yValues[i] = yMax;
+        }
+        else if (j > 0)
+        {
+          // interpolate between the consecutive points
+          double x0 = xData[j-1];
+          double x1 = xData[j];
+          double y0 = yData[j-1];
+          double y1 = yData[j];
+          yValues[i] = y0 + (y1 - y0)*(xi - x0)/(x1 - x0);
+        }
+        else // j == 0
+        {
+          yValues[i] = yMin;
+        }
+      }
+    }
+
+  }
+
 } // namespace MDAlgorithms
 } // namespace Mantid
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/IntegrateFluxTest.h b/Code/Mantid/Framework/MDAlgorithms/test/IntegrateFluxTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..ec5e88feb910085058ef04d2906434b24b97443d
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/test/IntegrateFluxTest.h
@@ -0,0 +1,204 @@
+#ifndef MANTID_MDALGORITHMS_INTEGRATEFLUXTEST_H_
+#define MANTID_MDALGORITHMS_INTEGRATEFLUXTEST_H_
+
+#include <cxxtest/TestSuite.h>
+
+#include "MantidMDAlgorithms/IntegrateFlux.h"
+#include "MantidAPI/AlgorithmManager.h"
+
+using Mantid::MDAlgorithms::IntegrateFlux;
+using namespace Mantid::API;
+
+class IntegrateFluxTest : public CxxTest::TestSuite
+{
+public:
+  // This pair of boilerplate methods prevent the suite being created statically
+  // This means the constructor isn't called when running other tests
+  static IntegrateFluxTest *createSuite() { return new IntegrateFluxTest(); }
+  static void destroySuite( IntegrateFluxTest *suite ) 
+  { 
+    delete suite; 
+  }
+
+
+  void test_Init()
+  {
+    IntegrateFlux alg;
+    TS_ASSERT_THROWS_NOTHING( alg.initialize() )
+    TS_ASSERT( alg.isInitialized() )
+  }
+
+  void test_exec()
+  {
+    // Name of the input workspace.
+    std::string inWSName("IntegrateFluxTest_InputWS");
+    // Name of the output workspace.
+    std::string outWSName("IntegrateFluxTest_OutputWS");
+
+    // Create an input workspace
+    createInputWorkspace(inWSName);
+
+    IntegrateFlux alg;
+    TS_ASSERT_THROWS_NOTHING( alg.initialize() )
+    TS_ASSERT( alg.isInitialized() )
+    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("InputWorkspace", inWSName) );
+    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", outWSName) );
+    TS_ASSERT_THROWS_NOTHING( alg.execute(); );
+    TS_ASSERT( alg.isExecuted() );
+
+    // Retrieve the workspace from data service. TODO: Change to your desired type
+    MatrixWorkspace_sptr ws;
+    TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(outWSName) );
+    TS_ASSERT(ws);
+    if (!ws) return;
+
+    auto inWS = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>( inWSName );
+    
+    TS_ASSERT( ws->getAxis(0)->unit() == inWS->getAxis(0)->unit() );
+    TS_ASSERT_EQUALS( ws->getNumberHistograms(), 4 );
+
+    auto &x = ws->readX(0);
+    auto &y = ws->readY(0);
+    
+    TS_ASSERT_EQUALS( x.size(), 98 );
+    TS_ASSERT_EQUALS( x.size(), y.size() );
+
+    for(size_t i = 10; i < x.size(); ++i)
+    {
+      double t = x[i];
+      TS_ASSERT_DELTA( t*(t+1.0) / y[i], 1.0, 0.1 );
+    }
+
+    // Remove workspace from the data service.
+    AnalysisDataService::Instance().clear();
+  }
+  
+  void test_two_interpolation_point()
+  {
+    // Name of the input workspace.
+    std::string inWSName("IntegrateFluxTest_InputWS");
+    // Name of the output workspace.
+    std::string outWSName("IntegrateFluxTest_OutputWS");
+
+    // Create an input workspace
+    createInputWorkspace(inWSName);
+
+    IntegrateFlux alg;
+    alg.initialize();
+    alg.setPropertyValue("InputWorkspace", inWSName);
+    alg.setPropertyValue("OutputWorkspace", outWSName);
+    alg.setProperty("NPoints", 2);
+    alg.execute();
+    TS_ASSERT( alg.isExecuted() );
+
+    // Retrieve the workspace from data service. TODO: Change to your desired type
+    MatrixWorkspace_sptr ws;
+    TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(outWSName) );
+    TS_ASSERT(ws);
+    if (!ws) return;
+
+    TS_ASSERT_EQUALS( ws->getNumberHistograms(), 4 );
+
+    auto &x = ws->readX(0);
+    auto &y = ws->readY(0);
+
+    TS_ASSERT_EQUALS( x.size(), y.size() );
+    TS_ASSERT_EQUALS( x.size(), 2 );
+
+    double t = x[1];
+    TS_ASSERT_DELTA( t*(t+1.0) / y[1], 1.0, 0.1 );
+
+    // Remove workspace from the data service.
+    AnalysisDataService::Instance().clear();
+  }
+  
+  void test_one_interpolation_point()
+  {
+    // Name of the input workspace.
+    std::string inWSName("IntegrateFluxTest_InputWS");
+    // Name of the output workspace.
+    std::string outWSName("IntegrateFluxTest_OutputWS");
+
+    // Create an input workspace
+    createInputWorkspace(inWSName);
+
+    IntegrateFlux alg;
+    alg.initialize();
+    alg.setPropertyValue("InputWorkspace", inWSName);
+    alg.setPropertyValue("OutputWorkspace", outWSName);
+    TS_ASSERT_THROWS( alg.setProperty("NPoints", 1), std::invalid_argument );
+
+    // Remove workspace from the data service.
+    AnalysisDataService::Instance().clear();
+  }
+  
+  void test_bad_input_workspace()
+  {
+    // Name of the input workspace.
+    std::string inWSName("IntegrateFluxTest_InputWS");
+    // Name of the output workspace.
+    std::string outWSName("IntegrateFluxTest_OutputWS");
+
+    // Create an input workspace
+    createBadInputWorkspace(inWSName);
+
+    IntegrateFlux alg;
+    alg.initialize();
+    alg.setRethrows(true);
+    alg.setPropertyValue("InputWorkspace", inWSName);
+    alg.setPropertyValue("OutputWorkspace", outWSName);
+    TS_ASSERT_THROWS( alg.execute(), std::runtime_error );
+
+    // Remove workspace from the data service.
+    AnalysisDataService::Instance().clear();
+  }
+  
+private:
+
+  void createInputWorkspace(const std::string& wsName)
+  {
+    auto alg = Mantid::API::AlgorithmManager::Instance().create("CreateSampleWorkspace");
+    alg->initialize();
+    alg->setPropertyValue("WorkspaceType","Event");
+    alg->setPropertyValue("Function","User Defined");
+    alg->setPropertyValue("UserDefinedFunction","name=LinearBackground,A0=1,A1=2");
+    alg->setProperty("NumEvents",10000);
+    alg->setProperty("NumBanks",1);
+    alg->setProperty("BankPixelWidth",2);
+    alg->setProperty("XMin",0.0);
+    alg->setProperty("XMax",100.0);
+    alg->setPropertyValue("XUnit","Momentum");
+    alg->setProperty("BinWidth",1.0);
+    alg->setProperty("OutputWorkspace",wsName);
+    alg->execute();
+
+    alg = Mantid::API::AlgorithmManager::Instance().create("CompressEvents");
+    alg->initialize();
+    alg->setPropertyValue("InputWorkspace",wsName);
+    alg->setPropertyValue("OutputWorkspace",wsName);
+    alg->setProperty("Tolerance",1.0);
+    alg->execute();
+  }
+
+  void createBadInputWorkspace(const std::string& wsName)
+  {
+    auto alg = Mantid::API::AlgorithmManager::Instance().create("CreateSampleWorkspace");
+    alg->initialize();
+    alg->setPropertyValue("WorkspaceType","Event");
+    alg->setPropertyValue("Function","User Defined");
+    alg->setPropertyValue("UserDefinedFunction","name=LinearBackground,A0=1,A1=2");
+    alg->setProperty("NumEvents",10000);
+    alg->setProperty("NumBanks",1);
+    alg->setProperty("BankPixelWidth",2);
+    alg->setProperty("XMin",0.0);
+    alg->setProperty("XMax",100.0);
+    alg->setPropertyValue("XUnit","Momentum");
+    alg->setProperty("BinWidth",1.0);
+    alg->setProperty("OutputWorkspace",wsName);
+    alg->execute();
+
+  }
+};
+
+
+#endif /* MANTID_MDALGORITHMS_INTEGRATEFLUXTEST_H_ */
\ No newline at end of file
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/MDNormSXDTest.h b/Code/Mantid/Framework/MDAlgorithms/test/MDNormSXDTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..3e4082bb571b4d28a1bec83338730d8b9b35ada0
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/test/MDNormSXDTest.h
@@ -0,0 +1,119 @@
+#ifndef MANTID_MDALGORITHMS_MDNORMSXDTEST_H_
+#define MANTID_MDALGORITHMS_MDNORMSXDTEST_H_
+
+#include <cxxtest/TestSuite.h>
+
+#include "MantidMDAlgorithms/MDNormSXD.h"
+#include "MantidMDAlgorithms/CreateMDWorkspace.h"
+#include "MantidAPI/IMDHistoWorkspace.h"
+#include "MantidAPI/WorkspaceFactory.h"
+#include "MantidTestHelpers/WorkspaceCreationHelper.h"
+
+using Mantid::MDAlgorithms::MDNormSXD;
+using namespace Mantid::API;
+
+class MDNormSXDTest : public CxxTest::TestSuite
+{
+public:
+  // This pair of boilerplate methods prevent the suite being created statically
+  // This means the constructor isn't called when running other tests
+  static MDNormSXDTest *createSuite() { return new MDNormSXDTest(); }
+  static void destroySuite( MDNormSXDTest *suite ) { delete suite; }
+
+
+  void test_Init()
+  {
+    MDNormSXD alg;
+    TS_ASSERT_THROWS_NOTHING( alg.initialize() )
+    TS_ASSERT( alg.isInitialized() )
+  }
+
+  void test_properties()
+  {
+    std::string mdWsName = "__temp_InputMDWorkspaceName";
+    createMDWorkspace(mdWsName);
+    std::string fluxGoodWsName = "__temp_InputGoodFluxWorkspaceName";
+    createGoodFluxWorkspace(fluxGoodWsName);
+    std::string fluxBadWsName = "__temp_InputBadFluxWorkspaceName";
+    createBadFluxWorkspace(fluxBadWsName);
+    std::string saWsName = "__temp_InputSAWorkspaceName";
+    createBadFluxWorkspace(saWsName);
+
+    MDNormSXD alg;
+    TS_ASSERT_THROWS_NOTHING( alg.initialize() )
+    TS_ASSERT( alg.isInitialized() )
+    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("InputWorkspace", mdWsName) );
+    TS_ASSERT_THROWS_NOTHING( alg.setProperty("FluxWorkspace", fluxGoodWsName) );
+    TS_ASSERT_THROWS( alg.setProperty("FluxWorkspace", fluxBadWsName), std::invalid_argument );
+    TS_ASSERT_THROWS_NOTHING( alg.setProperty("SolidAngleWorkspace", saWsName) );
+    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", "OutWSName") );
+    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputNormalizationWorkspace", "OutNormWSName") );
+
+    AnalysisDataService::Instance().clear();
+  }
+  
+private:
+
+  void createMDWorkspace(const std::string& wsName)
+  {
+    const int ndims = 2;
+    std::string bins = "2,2";
+    std::string extents = "0,1,0,1";
+    std::vector<std::string> names(ndims);
+    names[0] = "A"; names[1] = "B";
+    std::vector<std::string> units(ndims);
+    units[0] = "a"; units[1] = "b";
+
+    Mantid::MDAlgorithms::CreateMDWorkspace alg;
+    alg.initialize();
+    TS_ASSERT_THROWS_NOTHING( alg.setProperty("Dimensions", ndims) );
+    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("Extents", extents) );
+    TS_ASSERT_THROWS_NOTHING( alg.setProperty("Names", names) );
+    TS_ASSERT_THROWS_NOTHING( alg.setProperty("Units", units) );
+    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", wsName) );
+    alg.execute();
+
+  }
+
+  void createGoodFluxWorkspace(const std::string& wsName)
+  {
+    auto flux = WorkspaceCreationHelper::create2DWorkspaceWithFullInstrument( 2, 10 );
+    auto &x = flux->dataX(0);
+    auto &y1 = flux->dataY(1);
+    
+    for(size_t i = 0; i < y1.size(); ++i)
+    {
+      y1[i] = 2 * x[i];
+    }
+    flux->setX(1,x);
+    flux->getAxis(0)->setUnit("Momentum");
+
+    AnalysisDataService::Instance().addOrReplace( wsName, flux );
+  }
+
+  void createBadFluxWorkspace(const std::string& wsName)
+  {
+    auto flux = WorkspaceCreationHelper::create2DWorkspaceWithFullInstrument( 2, 10 );
+    auto &x = flux->dataX(0);
+    auto &y1 = flux->dataY(1);
+    
+    for(size_t i = 0; i < y1.size(); ++i)
+    {
+      y1[i] = -2 * x[i];
+    }
+    flux->setX(1,x);
+    flux->getAxis(0)->setUnit("Momentum");
+
+    AnalysisDataService::Instance().addOrReplace( wsName, flux );
+  }
+
+  void createSolidAngleWorkspace(const std::string& wsName)
+  {
+    auto sa = WorkspaceCreationHelper::create2DWorkspaceWithFullInstrument( 2, 10 );
+    AnalysisDataService::Instance().addOrReplace( wsName, sa );
+  }
+
+};
+
+
+#endif /* MANTID_MDALGORITHMS_MDNORMSXDTEST_H_ */
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/SXDMDNormTest.h b/Code/Mantid/Framework/MDAlgorithms/test/SXDMDNormTest.h
deleted file mode 100644
index 96934641cd3dbcc2487b2a1375945d2bc6da5901..0000000000000000000000000000000000000000
--- a/Code/Mantid/Framework/MDAlgorithms/test/SXDMDNormTest.h
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef MANTID_MDALGORITHMS_SXDMDNORMTEST_H_
-#define MANTID_MDALGORITHMS_SXDMDNORMTEST_H_
-
-#include <cxxtest/TestSuite.h>
-
-#include "MantidMDAlgorithms/SXDMDNorm.h"
-
-using Mantid::MDAlgorithms::SXDMDNorm;
-using namespace Mantid::API;
-
-class SXDMDNormTest : public CxxTest::TestSuite
-{
-public:
-  // This pair of boilerplate methods prevent the suite being created statically
-  // This means the constructor isn't called when running other tests
-  static SXDMDNormTest *createSuite() { return new SXDMDNormTest(); }
-  static void destroySuite( SXDMDNormTest *suite ) { delete suite; }
-
-
-  void test_Init()
-  {
-    SXDMDNorm alg;
-    TS_ASSERT_THROWS_NOTHING( alg.initialize() )
-    TS_ASSERT( alg.isInitialized() )
-  }
-
-  //No test for now. Should be part of ticket #9105
-  void test_exec()
-  {
-    // Name of the output workspace.
-    /*std::string outWSName("SXDMDNormTest_OutputWS");
-
-    SXDMDNorm alg;
-    TS_ASSERT_THROWS_NOTHING( alg.initialize() )
-    TS_ASSERT( alg.isInitialized() )
-    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("REPLACE_PROPERTY_NAME_HERE!!!!", "value") );
-    TS_ASSERT_THROWS_NOTHING( alg.setPropertyValue("OutputWorkspace", outWSName) );
-    TS_ASSERT_THROWS_NOTHING( alg.execute(); );
-    TS_ASSERT( alg.isExecuted() );
-
-    // Retrieve the workspace from data service. TODO: Change to your desired type
-    Workspace_sptr ws;
-    TS_ASSERT_THROWS_NOTHING( ws = AnalysisDataService::Instance().retrieveWS<Workspace>(outWSName) );
-    TS_ASSERT(ws);
-    if (!ws) return;
-
-    // TODO: Check the results
-
-    // Remove workspace from the data service.
-    AnalysisDataService::Instance().remove(outWSName);*/
-  }
-  
-
-};
-
-
-#endif /* MANTID_MDALGORITHMS_SXDMDNORMTEST_H_ */
diff --git a/Code/Mantid/docs/source/algorithms/IntegrateFlux-v1.rst b/Code/Mantid/docs/source/algorithms/IntegrateFlux-v1.rst
new file mode 100644
index 0000000000000000000000000000000000000000..82124878d83ea7b48c1293e2b94247c543e2f376
--- /dev/null
+++ b/Code/Mantid/docs/source/algorithms/IntegrateFlux-v1.rst
@@ -0,0 +1,47 @@
+
+.. algorithm::
+
+.. summary::
+
+.. alias::
+
+.. properties::
+
+Description
+-----------
+
+If a spectrum in the input workspace contains function :math:`f(x)` then the corresponding spectrum in
+the output workspace has its indefinite integral:
+
+:math:`\int_{x_0}^x f(\xi)d\xi`.
+
+The input workspace is expected to be an event workspace with weighted-no-time events.
+
+
+Usage
+-----
+
+**Example - IntegrateFlux**
+
+.. testcode:: IntegrateFluxExample
+
+    # Create an event workspace
+    ws = CreateSampleWorkspace("Event")
+    # Make evet type weighted-no-time.
+    ws = CompressEvents( ws )
+    # Integrate all spectra.
+    wsOut = IntegrateFlux( ws )
+    
+    # Print the result
+    print "The input workspace has %i spectra" % ws.getNumberHistograms()
+    print "The output workspace has %i spectra" % wsOut.getNumberHistograms()
+
+Output:
+
+.. testoutput:: IntegrateFluxExample
+
+    The input workspace has 200 spectra
+    The output workspace has 200 spectra
+
+.. categories::
+
diff --git a/Code/Mantid/docs/source/algorithms/SXDMDNorm-v1.rst b/Code/Mantid/docs/source/algorithms/MDNormSXD-v1.rst
similarity index 96%
rename from Code/Mantid/docs/source/algorithms/SXDMDNorm-v1.rst
rename to Code/Mantid/docs/source/algorithms/MDNormSXD-v1.rst
index cec6c422ba6cf8701b6d91c476d4de5bb7798829..1f4af4aaf5571f19b52ba8d9f7da81b8f97b1e98 100644
--- a/Code/Mantid/docs/source/algorithms/SXDMDNorm-v1.rst
+++ b/Code/Mantid/docs/source/algorithms/MDNormSXD-v1.rst
@@ -22,9 +22,9 @@ Usage
     autotestdata\UsageData and the following tag unindented
     .. include:: ../usagedata-note.txt
 
-**Example - SXDMDNorm**
+**Example - MDNormSXD**
 
-.. testcode:: SXDMDNormExample
+.. testcode:: MDNormSXDExample
 
   try:
     # Setting up the workspaces containing information about the flux and the solid angle (from a vanadium run)
@@ -48,6 +48,7 @@ Usage
         el=flux.getEventList(i)
         el.divide(flux.readY(i)[0],0)
     flux=Rebin(InputWorkspace=flux,Params='1.85,10,10')
+    flux=IntegrateFlux(flux)
     SaveNexus(InputWorkspace=flux, Filename="/home/3y9/Desktop/TOPAZ/spectra.nxs")
     
     #data
@@ -65,7 +66,7 @@ Usage
     SaveMD(InputWorkspace=MDdata, Filename="/home/3y9/Desktop/TOPAZ/MDdata.nxs")
     
     #running the algorithm
-    SXDMDNorm(InputWorkspace='MDdata',
+    MDNormSXD(InputWorkspace='MDdata',
         AlignedDim0='[H,0,0],-8,8,100',
         AlignedDim1='[0,K,0],-8,8,100',
         AlignedDim2='[0,0,L],-8,8,100',