diff --git a/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h b/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h
index 4da6479689a84ca3e4f31840d32b7aee7109b9ca..08827662b66706980c7070665fb3228042d9eee2 100644
--- a/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h
+++ b/Framework/DataHandling/inc/MantidDataHandling/ReadMaterial.h
@@ -34,16 +34,17 @@ public:
   };
 
   static ValidationErrors validateInputs(MaterialParameters params);
-  void setMaterial(const std::string chemicalSymbol, const int atomicNumber,
-                   const int massNumber);
-  void setNumberDensity(const double rho_m, const double rho,
-                        const double zParameter, const double unitCellVolume);
+  void setMaterialParameters(MaterialParameters params);
+  std::unique_ptr<Kernel::Material> buildMaterial();
   void setScatteringInfo(double coherentXSection, double incoherentXSection,
                          double attenuationXSection, double scatteringXSection);
-  std::unique_ptr<Kernel::Material> buildMaterial();
-
 private:
   Kernel::MaterialBuilder builder;
+  void setMaterial(const std::string chemicalSymbol, const int atomicNumber,
+                   const int massNumber);
+  void setNumberDensity(const double rho_m, const double rho,
+                        const double zParameter, const double unitCellVolume);
+ 
   static bool isEmpty(const double toCheck);
 };
 } // namespace DataHandling
diff --git a/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h b/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h
index 0e702cdbb4d8786791e134b7fbb304861ea499be..bbb6c60b08a25d3b45e793699ffca75f0c7c6941 100644
--- a/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h
+++ b/Framework/DataHandling/inc/MantidDataHandling/SetSampleMaterial.h
@@ -9,7 +9,7 @@
 
 #include "MantidAPI/DistributedAlgorithm.h"
 #include "MantidKernel/NeutronAtom.h"
-
+#include "MantidDataHandling/ReadMaterial.h"
 namespace Mantid {
 namespace DataHandling {
 
@@ -48,6 +48,8 @@ private:
   /// Print out the list of information for the material
   void fixNeutron(PhysicalConstants::NeutronAtom &neutron, double coh_xs,
                   double inc_xs, double abs_xs, double tot_xs);
+
+  ReadMaterial::MaterialParameters params;
 };
 } // namespace DataHandling
 } // namespace Mantid
diff --git a/Framework/DataHandling/src/ReadMaterial.cpp b/Framework/DataHandling/src/ReadMaterial.cpp
index a7dd7d8bb4f6d6bb82b2e306c033a72d8d30062d..2b8e0652c7739af1d628497369fd337044502899 100644
--- a/Framework/DataHandling/src/ReadMaterial.cpp
+++ b/Framework/DataHandling/src/ReadMaterial.cpp
@@ -50,6 +50,11 @@ ValidationErrors ReadMaterial::validateInputs(const MaterialParameters params) {
   return result;
 }
 
+void ReadMaterial::setMaterialParameters(MaterialParameters params){
+  setMaterial(params.chemicalSymbol, params.atomicNumber, params.massNumber);
+  setNumberDensity(params.sampleMassDensity, params.sampleNumberDensity,params.zParameter,params.unitCellVolume);
+}
+
 std::unique_ptr<Kernel::Material> ReadMaterial::buildMaterial() {
   return std::make_unique<Kernel::Material>(builder.build());
 }
diff --git a/Framework/DataHandling/src/SetSampleMaterial.cpp b/Framework/DataHandling/src/SetSampleMaterial.cpp
index b544cf7c3161253941fc37b2e1e1bf7aa80f7341..6633697e4ca93de6683afcd928b6d7781e563b08 100644
--- a/Framework/DataHandling/src/SetSampleMaterial.cpp
+++ b/Framework/DataHandling/src/SetSampleMaterial.cpp
@@ -8,7 +8,6 @@
 #include "MantidAPI/ExperimentInfo.h"
 #include "MantidAPI/Sample.h"
 #include "MantidAPI/Workspace.h"
-#include "MantidDataHandling/ReadMaterial.h"
 #include "MantidGeometry/Crystal/OrientedLattice.h"
 #include "MantidKernel/Atom.h"
 #include "MantidKernel/BoundedValidator.h"
@@ -109,18 +108,13 @@ void SetSampleMaterial::init() {
 }
 
 std::map<std::string, std::string> SetSampleMaterial::validateInputs() {
-  ReadMaterial::MaterialParameters params = [this]() -> auto {
-    ReadMaterial::MaterialParameters setMaterial;
-    setMaterial.chemicalSymbol = getPropertyValue("ChemicalFormula");
-    setMaterial.atomicNumber = getProperty("AtomicNumber");
-    setMaterial.massNumber = getProperty("MassNumber");
-    setMaterial.sampleNumberDensity = getProperty("SampleNumberDensity");
-    setMaterial.zParameter = getProperty("ZParameter");
-    setMaterial.unitCellVolume = getProperty("UnitCellVolume");
-    setMaterial.sampleMassDensity = getProperty("SampleMassDensity");
-    return setMaterial;
-  }
-  ();
+  params.chemicalSymbol = getPropertyValue("ChemicalFormula");
+  params.atomicNumber = getProperty("AtomicNumber");
+  params.massNumber = getProperty("MassNumber");
+  params.sampleNumberDensity = getProperty("SampleNumberDensity");
+  params.zParameter = getProperty("ZParameter");
+  params.unitCellVolume = getProperty("UnitCellVolume");
+  params.sampleMassDensity = getProperty("SampleMassDensity");
   auto result = ReadMaterial::validateInputs(params);
 
   return result;
@@ -164,13 +158,9 @@ void SetSampleMaterial::exec() {
 
   ReadMaterial reader;
   const std::string chemicalSymbol = getProperty("ChemicalFormula");
-  reader.setMaterial(chemicalSymbol, getProperty("AtomicNumber"),
-                     getProperty("MassNumber"));
+  reader.setMaterialParameters(params);
 
   double rho = getProperty("SampleNumberDensity"); // in atoms / Angstroms^3
-  reader.setNumberDensity(getProperty("SampleMassDensity"), rho,
-                          getProperty("ZParameter"),
-                          getProperty("UnitCellVolume"));
 
   // get the scattering information - this will override table values
   reader.setScatteringInfo(
diff --git a/Framework/DataHandling/test/ReadMaterialTest.h b/Framework/DataHandling/test/ReadMaterialTest.h
index f48ea57b2d339cdb6c234e5b4e3b46c9dac72029..c4a6bdd12bb18e78fe634ff43c9fdb91d3177f35 100644
--- a/Framework/DataHandling/test/ReadMaterialTest.h
+++ b/Framework/DataHandling/test/ReadMaterialTest.h
@@ -19,7 +19,7 @@ public:
   static void destroySuite(ReadMaterialTest *suite) { delete suite; }
 
   void testSuccessfullValidateInputsFormula() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = FORMULA;
       setMaterial.atomicNumber = 0;
@@ -36,7 +36,7 @@ public:
   }
 
   void testSuccessfullValidateInputsAtomicNumber() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -53,7 +53,7 @@ public:
   }
 
   void testFailureValidateInputsFormulaPlusAtomicNumber() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = FORMULA;
       setMaterial.atomicNumber = 1;
@@ -71,7 +71,7 @@ public:
   }
 
   void testFailureValidateInputsNoMaterial() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 0;
@@ -88,7 +88,7 @@ public:
   }
 
   void testSuccessfullValidateInputsSampleNumber() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -105,7 +105,7 @@ public:
   }
 
   void testSuccessfullValidateInputsZParam() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -122,7 +122,7 @@ public:
   }
 
   void testSuccessfullValidateInputsSampleMass() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -139,7 +139,7 @@ public:
   }
 
   void testFailureValidateInputsSampleNumberAndZParam() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -157,7 +157,7 @@ public:
   }
 
   void testFailureValidateInputsZParamWithSampleMass() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -175,7 +175,7 @@ public:
   }
 
   void testFailureValidateInputsZParamWithoutUnitCell() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -193,7 +193,7 @@ public:
   }
 
   void testFailureValidateInputsSampleNumWithSampleMass() {
-    ReadMaterial::MaterialParameters params = [this]() -> auto {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
       ReadMaterial::MaterialParameters setMaterial;
       setMaterial.chemicalSymbol = EMPTY;
       setMaterial.atomicNumber = 1;
@@ -212,30 +212,75 @@ public:
   }
 
   void testMaterialIsCorrect() {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
+      ReadMaterial::MaterialParameters setMaterial;
+      setMaterial.chemicalSymbol = FORMULA;
+      setMaterial.atomicNumber = 0;
+      setMaterial.massNumber = 0;
+      setMaterial.sampleNumberDensity = 1;
+      setMaterial.zParameter = EMPTY_DOUBLE_VAL;
+      setMaterial.unitCellVolume = EMPTY_DOUBLE_VAL;
+      setMaterial.sampleMassDensity = EMPTY_DOUBLE_VAL;
+      return setMaterial;
+    }
+    ();
     ReadMaterial reader;
-    reader.setMaterial(FORMULA, 0, 0);
-    reader.setNumberDensity(EMPTY_DOUBLE_VAL, 1, EMPTY_DOUBLE_VAL,
-                            EMPTY_DOUBLE_VAL);
+    reader.setMaterialParameters(params);
     reader.setScatteringInfo(1, 2, 3, 4);
     auto material = reader.buildMaterial();
-    compareMaterial(material, 1, 1, 2, 3, 4, FORMULA);
+    Kernel::MaterialBuilder builder;
+    builder.setFormula(FORMULA);
+    builder.setNumberDensity(1);
+    builder.setCoherentXSection(1);
+    builder.setIncoherentXSection(2);
+    builder.setAbsorptionXSection(3);
+    builder.setTotalScatterXSection(4);
+    auto check = builder.build();
+    compareMaterial(material, check);
   }
 
   void testGenerateScatteringInfo() {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
+      ReadMaterial::MaterialParameters setMaterial;
+      setMaterial.chemicalSymbol = FORMULA;
+      setMaterial.atomicNumber = 0;
+      setMaterial.massNumber = 0;
+      setMaterial.sampleNumberDensity = 1;
+      setMaterial.zParameter = EMPTY_DOUBLE_VAL;
+      setMaterial.unitCellVolume = EMPTY_DOUBLE_VAL;
+      setMaterial.sampleMassDensity = EMPTY_DOUBLE_VAL;
+      return setMaterial;
+    }
+    ();
     ReadMaterial reader;
-    reader.setMaterial(FORMULA, 0, 0);
-    reader.setNumberDensity(EMPTY_DOUBLE_VAL, 1, EMPTY_DOUBLE_VAL,
-                            EMPTY_DOUBLE_VAL);
+    reader.setMaterialParameters(params);
     auto material = reader.buildMaterial();
-    compareMaterial(material, 1, 0.0184000000, 5.0800000022, 5.0800000022,
-                    5.1000000044, FORMULA);
+    Kernel::MaterialBuilder builder;
+    builder.setFormula(FORMULA);
+    builder.setNumberDensity(1);
+    builder.setCoherentXSection(0.0184000000);
+    builder.setIncoherentXSection(5.0800000022);
+    builder.setAbsorptionXSection(5.0800000022);
+    builder.setTotalScatterXSection(5.1000000044);
+    auto check = builder.build();
+    compareMaterial(material, check);
   }
 
   void testNoMaterialFailure() {
+    const ReadMaterial::MaterialParameters params = [this]() -> auto {
+      ReadMaterial::MaterialParameters setMaterial;
+      setMaterial.chemicalSymbol = EMPTY;
+      setMaterial.atomicNumber = 0;
+      setMaterial.massNumber = 0;
+      setMaterial.sampleNumberDensity = 1;
+      setMaterial.zParameter = EMPTY_DOUBLE_VAL;
+      setMaterial.unitCellVolume = EMPTY_DOUBLE_VAL;
+      setMaterial.sampleMassDensity = EMPTY_DOUBLE_VAL;
+      return setMaterial;
+    }
+    ();
     ReadMaterial reader;
-    reader.setMaterial(EMPTY, 0, 0);
-    reader.setNumberDensity(EMPTY_DOUBLE_VAL, 1, EMPTY_DOUBLE_VAL,
-                            EMPTY_DOUBLE_VAL);
+    reader.setMaterialParameters(params);
     reader.setScatteringInfo(EMPTY_DOUBLE_VAL, EMPTY_DOUBLE_VAL,
                              EMPTY_DOUBLE_VAL, EMPTY_DOUBLE_VAL);
     TS_ASSERT_THROWS(reader.buildMaterial(), std::runtime_error);
@@ -245,25 +290,20 @@ private:
   const double EMPTY_DOUBLE_VAL = 8.9884656743115785e+307;
   const std::string EMPTY = "";
   const std::string FORMULA = "V";
-
-  void compareMaterial(std::unique_ptr<Material> &material,
-                       const double numberDensity,
-                       const double coherentXSection,
-                       const double incoherentXSection,
-                       const double absorbXSection, const double totalXSection,
-                       const std::string &formula) {
-    std::vector<Material::FormulaUnit> checkFormula =
-        Material::parseChemicalFormula(formula);
+  void compareMaterial(const std::unique_ptr<Material> &material,
+                       const Material &check) {
+    std::vector<Material::FormulaUnit> checkFormula = check.chemicalFormula();
     std::vector<Material::FormulaUnit> materialFormula =
         material->chemicalFormula();
-    TS_ASSERT_EQUALS(material->numberDensity(), numberDensity);
-    TS_ASSERT_DELTA(material->cohScatterXSection(), coherentXSection,
-                    0.00000001);
-    TS_ASSERT_DELTA(material->incohScatterXSection(), incoherentXSection,
+    TS_ASSERT_EQUALS(material->numberDensity(), check.numberDensity());
+    TS_ASSERT_DELTA(material->cohScatterXSection(), check.cohScatterXSection(),
                     0.00000001);
-    TS_ASSERT_DELTA(material->absorbXSection(), absorbXSection, 0.00000001);
-    TS_ASSERT_DELTA(material->totalScatterXSection(), totalXSection,
+    TS_ASSERT_DELTA(material->incohScatterXSection(),
+                    check.incohScatterXSection(), 0.00000001);
+    TS_ASSERT_DELTA(material->absorbXSection(), check.absorbXSection(),
                     0.00000001);
+    TS_ASSERT_DELTA(material->totalScatterXSection(),
+                    check.totalScatterXSection(), 0.00000001);
     TS_ASSERT_EQUALS(checkFormula[0].multiplicity,
                      materialFormula[0].multiplicity);
     TS_ASSERT_EQUALS(checkFormula.size(), materialFormula.size())