diff --git a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
index d4952e2ba98ce353b8482e9c9582c96cbe6f367f..92da8b42e34574bf287e70dab1ecb6be0734ea05 100644
--- a/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
+++ b/Code/Mantid/Framework/MDAlgorithms/CMakeLists.txt
@@ -22,6 +22,7 @@ set ( SRC_FILES
 	src/CreateMDWorkspace.cpp
 	src/DivideMD.cpp
 	src/EqualToMD.cpp
+	src/EvaluateMDFunction.cpp
 	src/ExponentialMD.cpp
 	src/FakeMDEventData.cpp
 	src/FindPeaksMD.cpp
@@ -102,6 +103,7 @@ set ( INC_FILES
 	inc/MantidMDAlgorithms/DllConfig.h
 	inc/MantidMDAlgorithms/EqualToMD.h
 	inc/MantidMDAlgorithms/ExponentialMD.h
+	inc/MantidMDAlgorithms/EvaluateMDFunction.h
 	inc/MantidMDAlgorithms/FakeMDEventData.h
 	inc/MantidMDAlgorithms/FindPeaksMD.h
 	inc/MantidMDAlgorithms/GreaterThanMD.h
@@ -183,6 +185,7 @@ set ( TEST_FILES
 	DivideMDTest.h
 	EqualToMDTest.h
 	ExponentialMDTest.h
+	EvaluateMDFunctionTest.h
 	FakeMDEventDataTest.h
 	FindPeaksMDTest.h
 	FitResolutionConvolvedModelTest.h
diff --git a/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/EvaluateMDFunction.h b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/EvaluateMDFunction.h
new file mode 100644
index 0000000000000000000000000000000000000000..ed2ee59597c9fba38dfe6a30709b6c5f39f40faa
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/inc/MantidMDAlgorithms/EvaluateMDFunction.h
@@ -0,0 +1,56 @@
+#ifndef MANTID_MDALGORITHMS_EVALUATEMDFUNCTION_H_
+#define MANTID_MDALGORITHMS_EVALUATEMDFUNCTION_H_
+
+#include "MantidKernel/System.h"
+#include "MantidAPI/Algorithm.h"
+
+namespace Mantid
+{
+namespace MDAlgorithms
+{
+
+  /** EvaluateMDFunction : TODO: DESCRIPTION
+    
+    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 EvaluateMDFunction  : public API::Algorithm
+  {
+  public:
+    EvaluateMDFunction();
+    virtual ~EvaluateMDFunction();
+    
+    virtual const std::string name() const {return "EvaluateMDFunction";}
+    virtual int version() const;
+    virtual const std::string category() const;
+    virtual const std::string summary() const;
+
+  private:
+    void init();
+    void exec();
+
+
+  };
+
+
+} // namespace MDAlgorithms
+} // namespace Mantid
+
+#endif  /* MANTID_MDALGORITHMS_EVALUATEMDFUNCTION_H_ */
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp b/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..d13d64033c6aecc0f258c4d71f6ad381a05ce101
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/src/EvaluateMDFunction.cpp
@@ -0,0 +1,98 @@
+#include "MantidMDAlgorithms/EvaluateMDFunction.h"
+#include "MantidAPI/FunctionProperty.h"
+#include "MantidAPI/IMDHistoWorkspace.h"
+#include "MantidAPI/AlgorithmManager.h"
+#include "MantidAPI/IMDIterator.h"
+#include "MantidAPI/FunctionDomainMD.h"
+#include "MantidAPI/FunctionValues.h"
+
+namespace Mantid
+{
+namespace MDAlgorithms
+{
+
+  using Mantid::Kernel::Direction;
+  using Mantid::API::WorkspaceProperty;
+
+  // Register the algorithm into the AlgorithmFactory
+  DECLARE_ALGORITHM(EvaluateMDFunction)
+  
+
+
+  //----------------------------------------------------------------------------------------------
+  /** Constructor
+   */
+  EvaluateMDFunction::EvaluateMDFunction()
+  {
+  }
+    
+  //----------------------------------------------------------------------------------------------
+  /** Destructor
+   */
+  EvaluateMDFunction::~EvaluateMDFunction()
+  {
+  }
+  
+
+  //----------------------------------------------------------------------------------------------
+
+  
+  /// Algorithm's version for identification. @see Algorithm::version
+  int EvaluateMDFunction::version() const { return 1;};
+  
+  /// Algorithm's category for identification. @see Algorithm::category
+  const std::string EvaluateMDFunction::category() const { return "MDAlgorithms";}
+
+  /// Algorithm's summary for use in the GUI and help. @see Algorithm::summary
+  const std::string EvaluateMDFunction::summary() const { return "Evaluates an MD function on a MD histo workspace.";};
+
+  //----------------------------------------------------------------------------------------------
+  /** Initialize the algorithm's properties.
+   */
+  void EvaluateMDFunction::init()
+  {
+    declareProperty(new WorkspaceProperty<API::IMDHistoWorkspace>("InputWorkspace","",Direction::Input), "An input workspace.");
+    declareProperty(new API::FunctionProperty("Function"),"Parameters defining the fitting function and its initial values");
+    declareProperty(new WorkspaceProperty<API::IMDHistoWorkspace>("OutputWorkspace","",Direction::Output), "An output workspace.");
+  }
+
+  //----------------------------------------------------------------------------------------------
+  /** Execute the algorithm.
+   */
+  void EvaluateMDFunction::exec()
+  {
+    API::IMDHistoWorkspace_sptr input = getProperty("InputWorkspace");
+
+    auto cloner = API::AlgorithmManager::Instance().create("CloneMDWorkspace");
+    cloner->initialize();
+    cloner->setChild(true);
+    cloner->setProperty("InputWorkspace", input);
+    cloner->setPropertyValue("OutputWorkspace", "_");
+    cloner->execute();
+
+    API::IMDWorkspace_sptr clone = cloner->getProperty("OutputWorkspace");
+    API::IMDHistoWorkspace_sptr output = boost::dynamic_pointer_cast<API::IMDHistoWorkspace>(clone);
+
+    if ( !output )
+      throw std::runtime_error("Cannot create output workspace");
+
+    API::IFunction_sptr function = getProperty("Function");
+    function->setWorkspace( output );
+
+    API::FunctionDomainMD domain( output );
+    API::FunctionValues values( domain );
+
+    function->function( domain, values );
+
+    double *data = values.getPointerToCalculated(0);
+    size_t length = values.size();
+    double *outputData = output->getSignalArray();
+    std::copy( data, data + length, outputData );
+
+    setProperty("OutputWorkspace",output);
+  }
+
+
+
+} // namespace MDAlgorithms
+} // namespace Mantid
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h b/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h
new file mode 100644
index 0000000000000000000000000000000000000000..8d5fbc2a645a11562c446029bb8033a54325f7b4
--- /dev/null
+++ b/Code/Mantid/Framework/MDAlgorithms/test/EvaluateMDFunctionTest.h
@@ -0,0 +1,61 @@
+#ifndef MANTID_MDALGORITHMS_EVALUATEMDFUNCTIONTEST_H_
+#define MANTID_MDALGORITHMS_EVALUATEMDFUNCTIONTEST_H_
+
+#include <cxxtest/TestSuite.h>
+
+#include "MantidMDAlgorithms/EvaluateMDFunction.h"
+
+using Mantid::MDAlgorithms::EvaluateMDFunction;
+using namespace Mantid::API;
+
+class EvaluateMDFunctionTest : 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 EvaluateMDFunctionTest *createSuite() { return new EvaluateMDFunctionTest(); }
+  static void destroySuite( EvaluateMDFunctionTest *suite ) { delete suite; }
+
+
+  void test_Init()
+  {
+    EvaluateMDFunction alg;
+    TS_ASSERT_THROWS_NOTHING( alg.initialize() )
+    TS_ASSERT( alg.isInitialized() )
+  }
+  
+  void test_exec()
+  {
+    // Name of the output workspace.
+    std::string outWSName("EvaluateMDFunctionTest_OutputWS");
+  
+    EvaluateMDFunction 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);
+  }
+  
+  void test_Something()
+  {
+    TSM_ASSERT( "You forgot to write a test!", 0);
+  }
+
+
+};
+
+
+#endif /* MANTID_MDALGORITHMS_EVALUATEMDFUNCTIONTEST_H_ */