diff --git a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
index d4952e2ba98ce353b8482e9c9582c96cbe6f367f..d69bb9346be1c92db1eb8fe8cd15b98bd7c8ef35 100644
--- a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
+++ b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
@@ -62,6 +62,7 @@ set ( SRC_FILES
 	src/Quantification/Resolution/TobyFitYVector.cpp
 	src/Quantification/ResolutionConvolvedCrossSection.cpp
 	src/Quantification/SimulateResolutionConvolvedModel.cpp
+	src/SXDMDNorm.cpp
 	src/SaveMD.cpp
 	src/SaveZODS.cpp
 	src/SetMDUsingMask.cpp
@@ -104,8 +105,8 @@ set ( INC_FILES
 	inc/MantidMDAlgorithms/ExponentialMD.h
 	inc/MantidMDAlgorithms/FakeMDEventData.h
 	inc/MantidMDAlgorithms/FindPeaksMD.h
+	inc/MantidMDAlgorithms/GSLFunctions.h
 	inc/MantidMDAlgorithms/GreaterThanMD.h
-    inc/MantidMDAlgorithms/GSLFunctions.h
 	inc/MantidMDAlgorithms/IDynamicRebinning.h
 	inc/MantidMDAlgorithms/IntegratePeaksMD.h
 	inc/MantidMDAlgorithms/IntegratePeaksMD2.h
@@ -142,6 +143,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/SaveMD.h
 	inc/MantidMDAlgorithms/SaveZODS.h
 	inc/MantidMDAlgorithms/SetMDUsingMask.h
@@ -165,8 +167,8 @@ set ( TEST_FILES
 	AndMDTest.h
 	BooleanBinaryOperationMDTest.h
 	CachedExperimentInfoTest.h
-	CentroidPeaksMDTest.h
 	CentroidPeaksMD2Test.h
+	CentroidPeaksMDTest.h
 	CloneMDWorkspaceTest.h
 	CompareMDWorkspacesTest.h
 	ConvertEventsToMDTest.h
@@ -188,8 +190,8 @@ set ( TEST_FILES
 	FitResolutionConvolvedModelTest.h
 	ForegroundModelTest.h
 	GreaterThanMDTest.h
-	IntegratePeaksMDTest.h
 	IntegratePeaksMD2Test.h
+	IntegratePeaksMDTest.h
 	InvalidParameterParserTest.h
 	InvalidParameterTest.h
 	LessThanMDTest.h
@@ -210,6 +212,7 @@ set ( TEST_FILES
 	PowerMDTest.h
 	PreprocessDetectorsToMDTest.h
 	ResolutionConvolvedCrossSectionTest.h
+	SXDMDNormTest.h
 	SaveMDTest.h
 	SaveZODSTest.h
 	SetMDUsingMaskTest.h
diff --git a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h
new file mode 100644
index 0000000000000000000000000000000000000000..7e4461599f8937f149deac04582dcfcb77cc41ea
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/SXDMDNorm.h
@@ -0,0 +1,58 @@
+#ifndef MANTID_MDALGORITHMS_SXDMDNORM_H_
+#define MANTID_MDALGORITHMS_SXDMDNORM_H_
+
+#include "MantidKernel/System.h"
+#include "MantidAPI/Algorithm.h"
+#include "MantidMDAlgorithms/SlicingAlgorithm.h"
+
+namespace Mantid
+{
+namespace MDAlgorithms
+{
+
+  /** SXDMDNorm : Generate MD normalization for single crystal diffraction
+    
+    Copyright © 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 SXDMDNorm  : public SlicingAlgorithm
+  {
+  public:
+    SXDMDNorm();
+    virtual ~SXDMDNorm();
+    
+    virtual const std::string name() const;
+    virtual int version() const;
+    virtual const std::string category() const;
+
+  private:
+    virtual void initDocs();
+    void init();
+    void exec();
+    std::vector<Mantid::Kernel::VMD> calculateIntersections(uint16_t expIndex, Mantid::Geometry::IDetector_const_sptr detector);
+    size_t m_nDims;
+    Mantid::MDEvents::MDHistoWorkspace_sptr m_normWS;
+  };
+
+
+} // namespace MDAlgorithms
+} // namespace Mantid
+
+#endif  /* MANTID_MDALGORITHMS_SXDMDNORM_H_ */
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp b/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..78136bd5e061e61d7b46788683d56db58963a270
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/src/SXDMDNorm.cpp
@@ -0,0 +1,154 @@
+/*WIKI*
+TODO: Enter a full wiki-markup description of your algorithm here. You can then use the Build/wiki_maker.py script to generate your full wiki page.
+*WIKI*/
+
+#include "MantidMDAlgorithms/SXDMDNorm.h"
+#include "MantidMDEvents/MDEventWorkspace.h"
+#include "MantidMDEvents/MDHistoWorkspace.h"
+#include "MantidAPI/WorkspaceValidators.h"
+#include "MantidAPI/ImplicitFunctionFactory.h"
+#include "MantidGeometry/MDGeometry/MDBoxImplicitFunction.h"
+#include "MantidGeometry/MDGeometry/MDHistoDimension.h"
+#include "MantidKernel/CPUTimer.h"
+#include "MantidKernel/Strings.h"
+#include "MantidKernel/System.h"
+#include "MantidKernel/Utils.h"
+#include "MantidMDEvents/CoordTransformAffineParser.h"
+#include "MantidMDEvents/CoordTransformAligned.h"
+#include "MantidMDEvents/MDBoxBase.h"
+#include "MantidMDEvents/MDBox.h"
+#include "MantidMDEvents/MDEventFactory.h"
+#include "MantidMDEvents/MDEventWorkspace.h"
+#include "MantidMDEvents/MDHistoWorkspace.h"
+#include "MantidMDAlgorithms/BinMD.h"
+#include <boost/algorithm/string.hpp>
+#include <Poco/DOM/Document.h>
+#include <Poco/DOM/DOMParser.h>
+#include <Poco/DOM/Element.h>
+#include "MantidKernel/EnabledWhenProperty.h"
+#include "MantidMDEvents/CoordTransformAffine.h"
+using namespace Mantid::MDEvents;
+using namespace Mantid::API;
+using namespace Mantid::Kernel;
+namespace Mantid
+{
+namespace MDAlgorithms
+{
+
+  // Register the algorithm into the AlgorithmFactory
+  DECLARE_ALGORITHM(SXDMDNorm)
+  
+
+
+  //----------------------------------------------------------------------------------------------
+  /** Constructor
+   */
+  SXDMDNorm::SXDMDNorm()
+  {
+  }
+    
+  //----------------------------------------------------------------------------------------------
+  /** Destructor
+   */
+  SXDMDNorm::~SXDMDNorm()
+  {
+  }
+  
+
+  //----------------------------------------------------------------------------------------------
+  /// Algorithm's name for identification. @see Algorithm::name
+  const std::string SXDMDNorm::name() const { return "SXDMDNorm";};
+  
+  /// Algorithm's version for identification. @see Algorithm::version
+  int SXDMDNorm::version() const { return 1;};
+  
+  /// Algorithm's category for identification. @see Algorithm::category
+  const std::string SXDMDNorm::category() const { return "MDAlgorithms";}
+
+  //----------------------------------------------------------------------------------------------
+  /// Sets documentation strings for this algorithm
+  void SXDMDNorm::initDocs()
+  {
+    this->setWikiSummary("TODO: Enter a quick description of your algorithm.");
+    this->setOptionalMessage("TODO: Enter a quick description of your algorithm.");
+  }
+
+  //----------------------------------------------------------------------------------------------
+  /** Initialize the algorithm's properties.
+   */
+  void SXDMDNorm::init()
+  {
+
+      declareProperty(new WorkspaceProperty<IMDWorkspace>("InputWorkspace","",Direction::Input), "An input MDWorkspace.");
+
+      this->initSlicingProps();
+
+      auto wsValidator = boost::make_shared<CompositeValidator>();
+      wsValidator->add<WorkspaceUnitValidator>("Momentum");
+
+      declareProperty(new WorkspaceProperty<>("InputVanadiumWorkspace","",Direction::Input,wsValidator), "An input workspace containing vanadium data.");
+
+      declareProperty(new WorkspaceProperty<Workspace>("OutputWorkspace","",Direction::Output), "A name for the output data MDHistoWorkspace.");
+      declareProperty(new WorkspaceProperty<MDHistoWorkspace>("OutputNormalizationWorkspace","",Direction::Output), "A name for the output normalization MDHistoWorkspace.");
+  }
+
+  //----------------------------------------------------------------------------------------------
+  /** Execute the algorithm.
+   */
+  void SXDMDNorm::exec()
+  {
+      // Run BinMD
+      Workspace_sptr outputWS = getProperty("OutputWorkspace");
+      auto props=getProperties();
+      IAlgorithm_sptr bin = createChildAlgorithm("BinMD",0.0,0.9);
+      for(auto it=props.begin();it!=props.end();++it)
+      {
+          if((*it)->name()!="InputVanadiumWorkspace")
+              bin->setPropertyValue((*it)->name(),(*it)->value());
+      }
+      bin->executeAsChildAlg();
+      outputWS=bin->getProperty("OutputWorkspace");
+      setProperty("OutputWorkspace", outputWS);
+
+      //copy the MDHisto workspace, and change signals and errors to 0.
+      m_normWS=MDHistoWorkspace_sptr(new MDHistoWorkspace(*(boost::dynamic_pointer_cast<MDHistoWorkspace>(outputWS))));
+      m_normWS->setTo(0.,0.,0.);
+      for (uint16_t expi=0;expi<m_normWS->getNumExperimentInfo();expi++)
+      {
+          //get detector ID, no monitors
+          std::vector<detid_t> detIDS=m_normWS->getExperimentInfo(expi)->getInstrument()->getDetectorIDs(true);
+          //TODO make parallel
+          for(int i=0;i<static_cast<int>(detIDS.size());i++)
+          {
+              Mantid::Geometry::IDetector_const_sptr detector=m_normWS->getExperimentInfo(expi)->getInstrument()->getDetector(detIDS[i]);
+            if(!detector->isMonitor())
+            {
+                std::vector<Mantid::Kernel::VMD> intersections=calculateIntersections(expi,detector);
+                if(!intersections.empty())
+                {
+                    //calculate indices
+                    //add to the correct signal at that particular index
+                    //NOTE: if parallel it has to be atomic
+                }
+            }
+          }
+      }
+      setProperty("OutputNormalizationWorkspace",m_normWS);
+
+
+  }
+
+
+  std::vector<Mantid::Kernel::VMD> SXDMDNorm::calculateIntersections(uint16_t expIndex, Mantid::Geometry::IDetector_const_sptr detector)
+  {
+
+     // VMD smallestMomentum(m_nDims+1), largestMomentum(m_nDims+1);
+     //m_normWS->getExperimentInfo(0)->run().getGoniometer().getR()
+
+      std::vector<Mantid::Kernel::VMD> intersections;
+      return intersections;
+  }
+
+
+} // namespace MDAlgorithms
+} // namespace Mantid
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/SXDMDNormTest.h b/Code/Mantid/Framework/MDAlgorithms/test/SXDMDNormTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..f443de956395fc7bbaf26e924ea44377bac1f3d8
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/test/SXDMDNormTest.h
@@ -0,0 +1,59 @@
+#ifndef MANTID_MDALGORITHMS_SXDMDNORMTEST_H_
+#define MANTID_MDALGORITHMS_SXDMDNORMTEST_H_
+
+#include <cxxtest/TestSuite.h>
+
+#include "MantidMDAlgorithms/SXDMDNorm.h"
+
+using Mantid::MDAlgorithms::SXDMDNorm;
+
+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() )
+  }
+  
+  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_ */