diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h b/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h
index e4dcc3d251e14cfbabe51af5dd3bcba089237934..4ceb2d99e06088924f8bb037bc80f24e25504f99 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/CoordTransform.h
@@ -7,6 +7,7 @@
 #include "MantidKernel/Matrix.h"
 #include "MantidKernel/System.h"
 #include "MantidKernel/VMD.h"
+#include <boost/shared_ptr.hpp>
 
 namespace Mantid {
 namespace API {
@@ -57,6 +58,12 @@ protected:
   size_t outD;
 };
 
+// Helper typedef for a shared pointer of this type.
+typedef boost::shared_ptr<CoordTransform> CoordTransform_sptr;
+
+// Helper typdef for a const shared pointer of this type.
+typedef boost::shared_ptr<const CoordTransform> CoordTransform_const_sptr;
+
 } // namespace Mantid
 } // namespace API
 
diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h b/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h
index 77cec04739c2581fe62bd33fe28aee89a4fcd152..33a0804517ca1b926ee94e8994fd8db42154dd4f 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/MDGeometry.h
@@ -6,6 +6,7 @@
 #include "MantidGeometry/MDGeometry/IMDDimension.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include <Poco/NObserver.h>
+#include <boost/shared_ptr.hpp>
 
 namespace Mantid {
 namespace API {
@@ -85,10 +86,10 @@ public:
   size_t numOriginalWorkspaces() const;
   boost::shared_ptr<Workspace> getOriginalWorkspace(size_t index = 0) const;
   void setOriginalWorkspace(boost::shared_ptr<Workspace> ws, size_t index = 0);
-  Mantid::API::CoordTransform *getTransformFromOriginal(size_t index = 0) const;
+  Mantid::API::CoordTransform const *getTransformFromOriginal(size_t index = 0) const;
   void setTransformFromOriginal(Mantid::API::CoordTransform *transform,
                                 size_t index = 0);
-  Mantid::API::CoordTransform *getTransformToOriginal(size_t index = 0) const;
+  Mantid::API::CoordTransform const *getTransformToOriginal(size_t index = 0) const;
   void setTransformToOriginal(Mantid::API::CoordTransform *transform,
                               size_t index = 0);
 
@@ -120,6 +121,11 @@ public:
   /// plane
   const Kernel::DblMatrix &getWTransf() const { return m_Wtransf; }
 
+  /// Clear transforms
+  void clearTransforms();
+  /// Clear original workspaces
+  void clearOriginalWorkspaces();
+
 protected:
   /// Function called when observer objects recieves a notification
   void deleteNotificationReceived(
@@ -138,11 +144,11 @@ protected:
 
   /// Coordinate Transformation that goes from the original workspace to this
   /// workspace's coordinates.
-  std::vector<Mantid::API::CoordTransform *> m_transforms_FromOriginal;
+  std::vector<boost::shared_ptr<const Mantid::API::CoordTransform> > m_transforms_FromOriginal;
 
   /// Coordinate Transformation that goes from this workspace's coordinates to
   /// the original workspace coordinates.
-  std::vector<Mantid::API::CoordTransform *> m_transforms_ToOriginal;
+  std::vector<boost::shared_ptr<const Mantid::API::CoordTransform> > m_transforms_ToOriginal;
 
   /// Poco delete notification observer object
   Poco::NObserver<MDGeometry, Mantid::API::WorkspacePreDeleteNotification>
diff --git a/Code/Mantid/Framework/API/src/MDGeometry.cpp b/Code/Mantid/Framework/API/src/MDGeometry.cpp
index f2038971accb25c43412e56bf1b94bcbfb24d696..5b303f3405054fdc605c265591f6a5a045d11d37 100644
--- a/Code/Mantid/Framework/API/src/MDGeometry.cpp
+++ b/Code/Mantid/Framework/API/src/MDGeometry.cpp
@@ -41,21 +41,21 @@ MDGeometry::MDGeometry(const MDGeometry &other)
   this->initGeometry(dimensions);
 
   // Perform a deep copy of the coordinate transformations
-  std::vector<CoordTransform *>::const_iterator it;
+  std::vector<CoordTransform_const_sptr>::const_iterator it;
   for (it = other.m_transforms_FromOriginal.begin();
        it != other.m_transforms_FromOriginal.end(); ++it) {
     if (*it)
-      m_transforms_FromOriginal.push_back((*it)->clone());
+      m_transforms_FromOriginal.push_back(CoordTransform_const_sptr((*it)->clone()));
     else
-      m_transforms_FromOriginal.push_back(NULL);
+      m_transforms_FromOriginal.push_back(CoordTransform_const_sptr());
   }
 
   for (it = other.m_transforms_ToOriginal.begin();
        it != other.m_transforms_ToOriginal.end(); ++it) {
     if (*it)
-      m_transforms_ToOriginal.push_back((*it)->clone());
+      m_transforms_ToOriginal.push_back(CoordTransform_const_sptr((*it)->clone()));
     else
-      m_transforms_ToOriginal.push_back(NULL);
+      m_transforms_ToOriginal.push_back(CoordTransform_const_sptr());
   }
 
   // Copy the references to the original workspaces
@@ -65,14 +65,26 @@ MDGeometry::MDGeometry(const MDGeometry &other)
     this->setOriginalWorkspace(other.m_originalWorkspaces[i], i);
 }
 
+/**
+ * Clear all transforms to and from original workspaces.
+ */
+void MDGeometry::clearTransforms() {
+    m_transforms_ToOriginal.clear();
+    m_transforms_FromOriginal.clear();
+}
+
+/**
+ * Clear the original workspaces
+ */
+void MDGeometry::clearOriginalWorkspaces() {
+    m_originalWorkspaces.clear();
+}
+
 //----------------------------------------------------------------------------------------------
 /** Destructor
  */
 MDGeometry::~MDGeometry() {
-  for (size_t i = 0; i < m_transforms_FromOriginal.size(); i++)
-    delete m_transforms_FromOriginal[i];
-  for (size_t i = 0; i < m_transforms_ToOriginal.size(); i++)
-    delete m_transforms_ToOriginal[i];
+
   if (m_observingDelete) {
     // Stop watching once object is deleted
     API::AnalysisDataService::Instance().notificationCenter.removeObserver(
@@ -400,12 +412,12 @@ void MDGeometry::deleteNotificationReceived(
  * @return CoordTransform pointer
  * @param index :: index into the array of original workspaces
  */
-Mantid::API::CoordTransform *
+Mantid::API::CoordTransform const *
 MDGeometry::getTransformFromOriginal(size_t index) const {
   if (index >= m_transforms_FromOriginal.size())
     throw std::runtime_error(
         "MDGeometry::getTransformFromOriginal(): invalid index.");
-  return m_transforms_FromOriginal[index];
+  return m_transforms_FromOriginal[index].get();
 }
 
 //---------------------------------------------------------------------------------------------------
@@ -422,11 +434,10 @@ MDGeometry::getTransformFromOriginal(size_t index) const {
 void
 MDGeometry::setTransformFromOriginal(Mantid::API::CoordTransform *transform,
                                      size_t index) {
-  if (index >= m_transforms_FromOriginal.size())
+  if (index >= m_transforms_FromOriginal.size()) {
     m_transforms_FromOriginal.resize(index + 1);
-  if (m_transforms_FromOriginal[index])
-    delete m_transforms_FromOriginal[index];
-  m_transforms_FromOriginal[index] = transform;
+  }
+  m_transforms_FromOriginal[index] = CoordTransform_const_sptr(transform);
 }
 
 //---------------------------------------------------------------------------------------------------
@@ -441,12 +452,12 @@ MDGeometry::setTransformFromOriginal(Mantid::API::CoordTransform *transform,
  * @return CoordTransform pointer
  * @param index :: index into the array of original workspaces
  */
-Mantid::API::CoordTransform *
+Mantid::API::CoordTransform const *
 MDGeometry::getTransformToOriginal(size_t index) const {
   if (index >= m_transforms_ToOriginal.size())
     throw std::runtime_error(
         "MDGeometry::getTransformFromOriginal(): invalid index.");
-  return m_transforms_ToOriginal[index];
+  return m_transforms_ToOriginal[index].get();
 }
 
 //---------------------------------------------------------------------------------------------------
@@ -463,11 +474,10 @@ MDGeometry::getTransformToOriginal(size_t index) const {
  */
 void MDGeometry::setTransformToOriginal(Mantid::API::CoordTransform *transform,
                                         size_t index) {
-  if (index >= m_transforms_ToOriginal.size())
+  if (index >= m_transforms_ToOriginal.size()) {
     m_transforms_ToOriginal.resize(index + 1);
-  if (m_transforms_ToOriginal[index])
-    delete m_transforms_ToOriginal[index];
-  m_transforms_ToOriginal[index] = transform;
+  }
+  m_transforms_ToOriginal[index] = CoordTransform_const_sptr(transform);
 }
 
 //---------------------------------------------------------------------------------------------------
diff --git a/Code/Mantid/Framework/API/test/MDGeometryTest.h b/Code/Mantid/Framework/API/test/MDGeometryTest.h
index 0763cb7250d5f53d377917a53525e5f439fb2f6e..15f35676ff5c379e2ff2ef012438e86d3176f9ab 100644
--- a/Code/Mantid/Framework/API/test/MDGeometryTest.h
+++ b/Code/Mantid/Framework/API/test/MDGeometryTest.h
@@ -54,6 +54,37 @@ public:
     TS_ASSERT_DELTA( binSizes[1], 0.1, 1e-6);
   }
 
+  void test_clear_transforms_to_original()
+  {
+      MDGeometry geometry;
+      geometry.setTransformToOriginal(new NullCoordTransform, 0);
+      geometry.setTransformToOriginal(new NullCoordTransform, 1);
+      TS_ASSERT_EQUALS(2, geometry.getNumberTransformsToOriginal());
+      TS_ASSERT_THROWS_NOTHING(geometry.clearTransforms());
+      TSM_ASSERT_EQUALS("Should have no transforms", 0, geometry.getNumberTransformsToOriginal());
+  }
+
+  void test_clear_transforms_from_original()
+  {
+      MDGeometry geometry;
+      geometry.setTransformFromOriginal(new NullCoordTransform, 0);
+      geometry.setTransformFromOriginal(new NullCoordTransform, 1);
+      TS_ASSERT_EQUALS(2, geometry.getNumberTransformsFromOriginal());
+      TS_ASSERT_THROWS_NOTHING(geometry.clearTransforms());
+      TSM_ASSERT_EQUALS("Should have no transforms", 0, geometry.getNumberTransformsFromOriginal());
+  }
+
+  void test_clear_original_workspaces()
+  {
+      MDGeometry geometry;
+      boost::shared_ptr<WorkspaceTester> ws0(new WorkspaceTester());
+      boost::shared_ptr<WorkspaceTester> ws1(new WorkspaceTester());
+      geometry.setOriginalWorkspace(ws0, 0);
+      geometry.setOriginalWorkspace(ws1, 1);
+      TS_ASSERT_EQUALS(2, geometry.numOriginalWorkspaces());
+      TS_ASSERT_THROWS_NOTHING(geometry.clearOriginalWorkspaces());
+      TS_ASSERT_EQUALS(0, geometry.numOriginalWorkspaces());
+  }
 
   void test_copy_constructor()
   {
diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h
index 12b0106eb095d6508ce10638b32fc77377d72b0e..5c6c076cfb9ef63a225b49c0c0290344e6fee761 100644
--- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h
+++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/MDBoxFlatTree.h
@@ -144,7 +144,7 @@ public:
   static void saveAffineTransformMatricies(::NeXus::File *const file,
                                            API::IMDWorkspace_const_sptr ws);
   static void saveAffineTransformMatrix(::NeXus::File *const file,
-                                        API::CoordTransform *transform,
+                                        API::CoordTransform const *transform,
                                         std::string entry_name);
 
   static void saveWSGenericInfo(::NeXus::File *const file,
diff --git a/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp b/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp
index 152bc6ff62fe6a306bf270bc4ac68501f13eccfe..3ff70adccbb15a821235e11dd5bfbfdbac8a03fb 100644
--- a/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/MDBoxFlatTree.cpp
@@ -798,7 +798,7 @@ MDBoxFlatTree::saveAffineTransformMatricies(::NeXus::File *const file,
  * @param entry_name : the tag in the NeXus file to save under
  */
 void MDBoxFlatTree::saveAffineTransformMatrix(::NeXus::File *const file,
-                                              API::CoordTransform *transform,
+                                              API::CoordTransform const *transform,
                                               std::string entry_name) {
   Kernel::Matrix<coord_t> matrix = transform->makeAffineMatrix();
   g_log.debug() << "TRFM: " << matrix.str() << std::endl;
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp b/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp
index 25772e258465cd89adab2cf7a22e137605b6b035..051cfa50c9fa267fcdb4afbf65fee35ff78de5ce 100644
--- a/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp
+++ b/Code/Mantid/Framework/MDAlgorithms/src/BinMD.cpp
@@ -408,6 +408,17 @@ void BinMD::exec() {
     IterateEvents = true;
   }
 
+  /*
+  We should fail noisily here. CALL_MDEVENT_FUNCTION will silently allow IMDHistoWorkspaces to cascade through to the end
+  and result in an empty output. The only way we allow InputWorkspaces to be IMDHistoWorkspaces is if they also happen to contain original workspaces
+  that are MDEventWorkspaces.
+  */
+  if(boost::dynamic_pointer_cast<IMDHistoWorkspace>(m_inWS))
+  {
+      throw std::runtime_error("Cannot rebin a workspace that is histogrammed and has no original workspace that is an MDEventWorkspace. "
+                               "Reprocess the input so that it contains full MDEvents.");
+  }
+
   CALL_MDEVENT_FUNCTION(this->binByIterating, m_inWS);
 
   // Copy the
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp b/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp
index 5967cd572d6e40c35c7a533cc9250ac3b51a8c8b..c4fc75c346c13e51ee0ef66861cf45d8f95cce8a 100644
--- a/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp
+++ b/Code/Mantid/Framework/MDAlgorithms/src/ConvertMDHistoToMatrixWorkspace.cpp
@@ -197,11 +197,11 @@ void ConvertMDHistoToMatrixWorkspace::make1DWorkspace() {
   const size_t numberTransformsToOriginal =
       inputWorkspace->getNumberTransformsToOriginal();
 
-  boost::shared_ptr<CoordTransform> transform =
+  CoordTransform_const_sptr transform =
       boost::make_shared<NullCoordTransform>(inputWorkspace->getNumDims());
   if (numberTransformsToOriginal > 0) {
     const size_t indexToLastTransform = numberTransformsToOriginal - 1;
-    transform = boost::shared_ptr<CoordTransform>(
+    transform = CoordTransform_const_sptr(
         inputWorkspace->getTransformToOriginal(indexToLastTransform),
         NullDeleter());
   }
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp b/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp
index 3acef97437ba3a95d5f8d131bc388df7a2fa726c..3deac2121dfc386f33aea1c3bac8969deeb9d612 100644
--- a/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp
+++ b/Code/Mantid/Framework/MDAlgorithms/src/CutMD.cpp
@@ -379,7 +379,13 @@ void CutMD::exec() {
                                    true);
   }
 
-  // Done!
+  auto geometry = boost::dynamic_pointer_cast<Mantid::API::MDGeometry>(sliceWS);
+
+  /* Original workspace and transformation information does not make sense for self-contained Horace-style
+   * cuts, so clear it out. */
+  geometry->clearTransforms();
+  geometry->clearOriginalWorkspaces();
+
   setProperty("OutputWorkspace", sliceWS);
 }
 
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp b/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp
index 6590cf97bf0b72b3504ee3708249577e2d3c0043..284bbe1edddd12298b87d0cbdf35cab95fd1f9a9 100644
--- a/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp
+++ b/Code/Mantid/Framework/MDAlgorithms/src/QueryMDWorkspace.cpp
@@ -103,6 +103,8 @@ void QueryMDWorkspace::init() {
                   "  volume: Normalise by the volume.\n"
                   "  number of events: Normalise by the number of events.");
 
+  declareProperty("TransformCoordsToOriginal", true, "Output box coordinates in terms of original workspace coordinates");
+
   declareProperty(
       new WorkspaceProperty<ITableWorkspace>(
           "BoxDataTable", "", Direction::Output,
@@ -191,6 +193,9 @@ void QueryMDWorkspace::exec() {
   MDNormalization requestedNormalisation = whichNormalisation(strNormalisation);
 
   IMDWorkspace_sptr input = getProperty("InputWorkspace");
+
+  const bool transformCoordsToOriginal = getProperty("TransformCoordsToOriginal");
+
   // Define a table workspace with a specific column schema.
   ITableWorkspace_sptr output = WorkspaceFactory::Instance().createTable();
   const std::string signalColumnName = "Signal/" + strNormalisation;
@@ -234,9 +239,9 @@ void QueryMDWorkspace::exec() {
     output->cell<int>(rowCounter, cellIndex++) = int(it->getNumEvents());
     VMD center = it->getCenter();
     const size_t numberOriginal = input->getNumberTransformsToOriginal();
-    if (numberOriginal > 0) {
+    if (transformCoordsToOriginal && numberOriginal > 0) {
       const size_t index = numberOriginal - 1;
-      CoordTransform *transform = input->getTransformToOriginal(index);
+      CoordTransform const *transform = input->getTransformToOriginal(index);
       VMD temp = transform->applyVMD(center);
       center = temp;
     }
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp b/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp
index 91dec0e942120bf8871144bf4a2a8150154b90fd..3e3057530fd1b0c4609e60dd86776d21cddc877f 100644
--- a/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp
+++ b/Code/Mantid/Framework/MDAlgorithms/src/SlicingAlgorithm.cpp
@@ -219,7 +219,7 @@ void SlicingAlgorithm::makeBasisVectorFromString(const std::string &str) {
     VMD basis0(this->m_inWS->getNumDims());
     VMD basis1 = basis;
     // Convert the points to the original coordinates (from inWS to originalWS)
-    CoordTransform *toOrig = m_inWS->getTransformToOriginal();
+    CoordTransform const *toOrig = m_inWS->getTransformToOriginal();
     VMD origBasis0 = toOrig->applyVMD(basis0);
     VMD origBasis1 = toOrig->applyVMD(basis1);
     // New basis vector, now in the original workspace
@@ -378,7 +378,7 @@ void SlicingAlgorithm::createGeneralTransform() {
   // Now, convert the original vector to the coordinates of the ORIGNAL ws, if
   // any
   if (m_originalWS) {
-    CoordTransform *toOrig = m_inWS->getTransformToOriginal();
+    CoordTransform const*toOrig = m_inWS->getTransformToOriginal();
     m_translation = toOrig->applyVMD(m_translation);
   }
 
@@ -686,7 +686,7 @@ void SlicingAlgorithm::createTransform() {
   if (m_originalWS) {
     // The intermediate workspace is the MDHistoWorkspace being BINNED
     m_intermediateWS = m_inWS;
-    CoordTransform *originalToIntermediate =
+    CoordTransform const *originalToIntermediate =
         m_intermediateWS->getTransformFromOriginal();
     if (originalToIntermediate &&
         (m_originalWS->getNumDims() == m_intermediateWS->getNumDims())) {
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h b/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h
index 41efb7d551f77af1dc3f14b7e77b0236e0fa2bd3..70cfe7ea0628ba2a783c376a361a87a8d447acf6 100644
--- a/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h
+++ b/Code/Mantid/Framework/MDAlgorithms/test/BinMDTest.h
@@ -174,7 +174,7 @@ public:
     TS_ASSERT_EQUALS( out->getBasisVector(0), expectBasisX);
     if (out->getNumDims() > 1) { TS_ASSERT_EQUALS( out->getBasisVector(1), expectBasisY); }
     if (out->getNumDims() > 2) { TS_ASSERT_EQUALS( out->getBasisVector(2), expectBasisZ); }
-    const CoordTransform * ctFrom = out->getTransformFromOriginal();
+    CoordTransform const * ctFrom = out->getTransformFromOriginal();
     TS_ASSERT(ctFrom);
     // Experiment Infos were copied
     TS_ASSERT_EQUALS( out->getNumExperimentInfo(), in_ws->getNumExperimentInfo());
@@ -459,9 +459,9 @@ public:
     { TS_ASSERT_EQUALS( out->getBasisVector(1), baseY);
       TS_ASSERT_EQUALS( out->getBasisVector(2), baseZ); }
 
-    const CoordTransform * ctFrom = out->getTransformFromOriginal();
+    CoordTransform const * ctFrom = out->getTransformFromOriginal();
     TS_ASSERT(ctFrom);
-    const CoordTransform * ctTo = out->getTransformToOriginal();
+    CoordTransform const * ctTo = out->getTransformToOriginal();
     TS_ASSERT(ctTo);
     if (!ctTo) return;
 
@@ -594,8 +594,8 @@ public:
     TS_ASSERT_EQUALS( binned1->numOriginalWorkspaces(), 2);
     TS_ASSERT_EQUALS( binned1->getOriginalWorkspace(1)->name(), "binned0");
     // Transforms to/from the INTERMEDIATE workspace exist
-    CoordTransform * toIntermediate = binned1->getTransformToOriginal(1);
-    CoordTransform * fromIntermediate = binned1->getTransformFromOriginal(1);
+    CoordTransform const * toIntermediate = binned1->getTransformToOriginal(1);
+    CoordTransform const * fromIntermediate = binned1->getTransformFromOriginal(1);
     TS_ASSERT( toIntermediate);
     TS_ASSERT( fromIntermediate );
 
@@ -642,14 +642,14 @@ public:
     TS_ASSERT_EQUALS( binned1->numOriginalWorkspaces(), 2);
     TS_ASSERT_EQUALS( binned1->getOriginalWorkspace(1)->name(), "binned0");
     // Transforms to/from the INTERMEDIATE workspace exist
-    CoordTransform * toIntermediate = binned1->getTransformToOriginal(1);
-    CoordTransform * fromIntermediate = binned1->getTransformFromOriginal(1);
+    CoordTransform const * toIntermediate = binned1->getTransformToOriginal(1);
+    CoordTransform const * fromIntermediate = binned1->getTransformFromOriginal(1);
     TS_ASSERT( toIntermediate);
     TS_ASSERT( fromIntermediate );
 
     // Transforms to/from the REALLY ORIGINAL workspace exist
-    CoordTransform * toOriginal = binned1->getTransformToOriginal(0);
-    CoordTransform * fromOriginal = binned1->getTransformFromOriginal(0);
+    CoordTransform const * toOriginal = binned1->getTransformToOriginal(0);
+    CoordTransform const * fromOriginal = binned1->getTransformFromOriginal(0);
     TS_ASSERT( toOriginal);
     TS_ASSERT( fromOriginal );
 
@@ -720,14 +720,14 @@ public:
     TS_ASSERT_EQUALS( binned1->numOriginalWorkspaces(), 2);
     TS_ASSERT_EQUALS( binned1->getOriginalWorkspace(1)->name(), "binned0");
     // Transforms to/from the INTERMEDIATE workspace exist
-    CoordTransform * toIntermediate = binned1->getTransformToOriginal(1);
-    CoordTransform * fromIntermediate = binned1->getTransformFromOriginal(1);
+    CoordTransform const * toIntermediate = binned1->getTransformToOriginal(1);
+    CoordTransform const * fromIntermediate = binned1->getTransformFromOriginal(1);
     TS_ASSERT( toIntermediate);
     TS_ASSERT( fromIntermediate );
 
     // Transforms to/from the REALLY ORIGINAL workspace exist
-    CoordTransform * toOriginal = binned1->getTransformToOriginal(0);
-    CoordTransform * fromOriginal = binned1->getTransformFromOriginal(0);
+    CoordTransform const * toOriginal = binned1->getTransformToOriginal(0);
+    CoordTransform const * fromOriginal = binned1->getTransformFromOriginal(0);
     TS_ASSERT( toOriginal);
     TS_ASSERT( fromOriginal );
 
@@ -944,12 +944,12 @@ public:
 
     VMD out;
     // Check the mapping of coordinates from C to B
-    CoordTransform * transf_C_to_B = C->getTransformToOriginal(1);
+    CoordTransform const * transf_C_to_B = C->getTransformToOriginal(1);
     out = transf_C_to_B->applyVMD(VMD(-1.5, -1.5));
     TS_ASSERT_EQUALS( out, VMD(-4, -4) );
 
     // And this is the mapping to the A workspace
-    CoordTransform * transf_C_to_A = C->getTransformToOriginal(0);
+    CoordTransform const * transf_C_to_A = C->getTransformToOriginal(0);
     out = transf_C_to_A->applyVMD(VMD(-1.5, -1.5));
     TS_ASSERT_EQUALS( out, VMD(-10, -10) );
   }
@@ -988,6 +988,23 @@ public:
         "OutputBins", "10,10");
     TSM_ASSERT( "Algorithm threw an error, as expected", !alg->isExecuted())
   }
+
+  void test_throws_if_InputWorkspace_pure_IMDHistWorkspace()
+  {
+      BinMD alg;
+      alg.setChild(true);
+      alg.setRethrows(true);
+      alg.initialize();
+      // Histoworkspace with no original workspace or transforms
+      IMDHistoWorkspace_sptr inWS = MDEventsTestHelper::makeFakeMDHistoWorkspace(1 /*signal*/, 2 /*numDims*/, 10 /*numBins*/);
+
+      alg.setProperty("InputWorkspace", inWS); // Input workspace - Pure histogram
+      alg.setProperty("AlignedDim0", "x,0,10,10"); // Values not relevant to this test
+      alg.setProperty("AlignedDim1", "y,0,10,10"); // Values not relevant to this test
+      alg.setPropertyValue("OutputWorkspace", "dummy");
+      TSM_ASSERT_THROWS("Cannot allow BinMD on a pure MDHistoWorkspace. Should throw.", alg.execute(), std::runtime_error&);
+  }
+
 };
 
 
@@ -1054,7 +1071,7 @@ public:
     for (size_t i=0; i<1; i++)
       do_test("2.0,8.0, 1", true);
   }
-private: 
+
 
 };
 
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h b/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h
index e2e8992c482d67d477fb87b07c1b3de4db7f22ec..607893fe75af0be13bef6b6de57e86c833f38d75 100644
--- a/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h
+++ b/Code/Mantid/Framework/MDAlgorithms/test/QueryMDWorkspaceTest.h
@@ -198,25 +198,32 @@ public:
     TSM_ASSERT_EQUALS("Wrong number of rows", 3, table->rowCount());
   }
 
+  IMDWorkspace_sptr createSlice() {
+
+      auto in_ws = MDEventsTestHelper::makeMDEW<2>(2, -10.0, 10, 3);
+
+      // Create a line slice at 45 degrees to the original workspace.
+      IAlgorithm_sptr binMDAlg = AlgorithmManager::Instance().create("BinMD");
+      binMDAlg->setRethrows(true);
+      binMDAlg->initialize();
+      binMDAlg->setChild(true);
+      binMDAlg->setProperty("InputWorkspace", in_ws);
+      binMDAlg->setProperty("AxisAligned", false);
+      binMDAlg->setPropertyValue("BasisVector0", "X,units,0.7071,0.7071"); // cos 45 to in_ws x-axis (consistent with a 45 degree anti-clockwise rotation)
+      binMDAlg->setPropertyValue("BasisVector1", "Y,units,-0.7071,0.7071"); // cos 45 to in_ws y-axis (consistent with a 45 degree anti-clockwise rotation)
+      binMDAlg->setPropertyValue("OutputExtents", "0,28.284,-1,1"); // 0 to sqrt((-10-10)^2 + (-10-10)^2), -1 to 1 (in new coordinate axes)
+      binMDAlg->setPropertyValue("OutputBins", "10,1");
+      binMDAlg->setPropertyValue("OutputWorkspace", "temp");
+      binMDAlg->execute();
+      Workspace_sptr temp = binMDAlg->getProperty("OutputWorkspace");
+      auto slice = boost::dynamic_pointer_cast<IMDWorkspace>(temp);
+      return slice;
+  }
+
   void testOnSlice()
   {
-    auto in_ws = MDEventsTestHelper::makeMDEW<2>(2, -10.0, 10, 3);
-
-    // Create a line slice at 45 degrees to the original workspace.
-    IAlgorithm_sptr binMDAlg = AlgorithmManager::Instance().create("BinMD");
-    binMDAlg->setRethrows(true);
-    binMDAlg->initialize();
-    binMDAlg->setChild(true);
-    binMDAlg->setProperty("InputWorkspace", in_ws);
-    binMDAlg->setProperty("AxisAligned", false);
-    binMDAlg->setPropertyValue("BasisVector0", "X,units,0.7071,0.7071"); // cos 45 to in_ws x-axis (consistent with a 45 degree anti-clockwise rotation)
-    binMDAlg->setPropertyValue("BasisVector1", "Y,units,-0.7071,0.7071"); // cos 45 to in_ws y-axis (consistent with a 45 degree anti-clockwise rotation)
-    binMDAlg->setPropertyValue("OutputExtents", "0,28.284,-1,1"); // 0 to sqrt((-10-10)^2 + (-10-10)^2), -1 to 1 (in new coordinate axes)
-    binMDAlg->setPropertyValue("OutputBins", "10,1");
-    binMDAlg->setPropertyValue("OutputWorkspace", "temp");
-    binMDAlg->execute();
-    Workspace_sptr temp = binMDAlg->getProperty("OutputWorkspace");
-    auto slice = boost::dynamic_pointer_cast<IMDWorkspace>(temp);
+
+    IMDWorkspace_sptr slice = createSlice();
 
     QueryMDWorkspace query;
     query.setRethrows(true);
@@ -228,7 +235,7 @@ public:
     ITableWorkspace_sptr table =  query.getProperty("OutputWorkspace");
 
     TSM_ASSERT("Workspace output is not an ITableWorkspace", table !=NULL);
-    size_t expectedCount = 3 + in_ws->getNumDims(); //3 fixed columns are Signal, Error, nEvents
+    size_t expectedCount = 3 + 2; //3 fixed columns are Signal, Error, nEvents and then data is 2D
     TSM_ASSERT_EQUALS("Six columns expected", expectedCount, table->columnCount());
     TSM_ASSERT_EQUALS("Wrong number of rows", 10, table->rowCount());
 
@@ -250,6 +257,50 @@ public:
 
   }
 
+  void testOnSlice_without_transform_to_original()
+  {
+      IMDWorkspace_sptr slice = createSlice();
+
+      QueryMDWorkspace query;
+      query.setRethrows(true);
+      query.setChild(true);
+      query.initialize();
+      query.setProperty("TransformCoordsToOriginal", false); // DO NOT, use the original workspace coordinates.
+      query.setProperty("InputWorkspace", slice);
+      query.setPropertyValue("OutputWorkspace", "QueryWS");
+      query.execute();
+      ITableWorkspace_sptr table =  query.getProperty("OutputWorkspace");
+
+      TSM_ASSERT("Workspace output is not an ITableWorkspace", table !=NULL);
+      size_t expectedCount = 3 + 2; //3 fixed columns are Signal, Error, nEvents and then data is 2D
+      TSM_ASSERT_EQUALS("Six columns expected", expectedCount, table->columnCount());
+      TSM_ASSERT_EQUALS("Wrong number of rows", 10, table->rowCount());
+
+      /*
+       Since we were displaying the results in the new coordinate system
+       then y == 0 and x would increment from 0 to sqrt((-10-10)^2 + (-10-10)^2).
+
+       Note that what we do in the following is to check that the y and x coordinates are NOT the same. They will ONLY be the same in the
+       original coordinate system owing to the way that they have been rotated.
+       */
+      const double xMax = std::sqrt( 20 * 20 * 2);
+      const double xMin = 0;
+
+      auto xColumn = table->getColumn(3);
+      auto yColumn = table->getColumn(4);
+
+
+      TS_ASSERT_EQUALS(0, yColumn->toDouble(0));// Always zero
+      TS_ASSERT_EQUALS(0, yColumn->toDouble(table->rowCount()-1));
+
+
+      const double binHalfWidth = 1.5;
+      TSM_ASSERT_DELTA("From zero", xMin, xColumn->toDouble(0), binHalfWidth /*account for bin widths*/);
+      TSM_ASSERT_DELTA("To max", xMax, xColumn->toDouble(table->rowCount()-1), binHalfWidth /*account for bin widths*/);
+
+
+  }
+
 
 };
 
diff --git a/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp b/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp
index 88a8f408b313a41071281e46736b7fce89b511b3..1212cf2cb5fab46b2bdc95e6adf562b5ae86d28f 100644
--- a/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp
+++ b/Code/Mantid/MantidQt/API/src/MantidQwtIMDWorkspaceData.cpp
@@ -348,7 +348,7 @@ void MantidQwtIMDWorkspaceData::setPreviewMode(bool preview)
   else
   {
     const size_t indexOfTransform = nTransformsToOriginal-1; // Get the last transform
-    CoordTransform * temp = m_workspace->getTransformToOriginal(indexOfTransform);
+    CoordTransform const * temp = m_workspace->getTransformToOriginal(indexOfTransform);
     if (temp)
           m_transform = temp->clone();
   }
diff --git a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp
index 9650d810c0c03bfe8715ee14d154aae00e801fba..facd7c614295268a10843406af5671d486025864 100644
--- a/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp
+++ b/Code/Mantid/MantidQt/SliceViewer/src/SliceViewer.cpp
@@ -667,7 +667,7 @@ void SliceViewer::setWorkspace(Mantid::API::IMDWorkspace_sptr ws) {
   if (m_ws->hasOriginalWorkspace()) {
     IMDWorkspace_sptr origWS =
         boost::dynamic_pointer_cast<IMDWorkspace>(m_ws->getOriginalWorkspace());
-    CoordTransform *toOrig = m_ws->getTransformToOriginal();
+    auto toOrig = m_ws->getTransformToOriginal();
     if (toOrig) {
       ui.frmMouseInfo->setVisible(true);
       ui.lblOriginalWorkspace->setText(
@@ -1335,7 +1335,7 @@ void SliceViewer::showInfoAt(double x, double y) {
   if (m_ws->hasOriginalWorkspace()) {
     IMDWorkspace_sptr origWS =
         boost::dynamic_pointer_cast<IMDWorkspace>(m_ws->getOriginalWorkspace());
-    CoordTransform *toOrig = m_ws->getTransformToOriginal();
+    auto toOrig = m_ws->getTransformToOriginal();
     if (toOrig) {
       // Transform the coordinates
       VMD orig = toOrig->applyVMD(coords);
diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp
index eb769d1ed4decd5beb93b1157e131492d4b0120d..e75428c6a6c31f74a8d3c299b32c32c2cb92896c 100644
--- a/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp
+++ b/Code/Mantid/Vates/VatesAPI/src/vtkDataSetToNonOrthogonalDataSet.cpp
@@ -114,7 +114,7 @@ void vtkDataSetToNonOrthogonalDataSet::execute()
       wMatArr = run.getPropertyValueAsType<std::vector<double > >("W_MATRIX");
       try
       {
-        API::CoordTransform *transform = infoWs->getTransformToOriginal();
+        API::CoordTransform const *transform = infoWs->getTransformToOriginal();
         affMat = transform->makeAffineMatrix();
       }
       catch (std::runtime_error &)
@@ -149,7 +149,7 @@ void vtkDataSetToNonOrthogonalDataSet::execute()
       wMatArr = run.getPropertyValueAsType<std::vector<double > >("W_MATRIX");
       try
       {
-        API::CoordTransform *transform = infoWs->getTransformToOriginal();
+        API::CoordTransform const *transform = infoWs->getTransformToOriginal();
         affMat = transform->makeAffineMatrix();
       }
       catch (std::runtime_error &)
diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp
index a9e5bf239d39e1164ec917ac8e5825400863b6fc..542279787b5bf392132c36c340e52080a7b5ef20 100644
--- a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp
+++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoHexFactory.cpp
@@ -181,7 +181,7 @@ namespace VATES
     std::cout << tim << " to check all the signal values." << std::endl;
 
     // Get the transformation that takes the points in the TRANSFORMED space back into the ORIGINAL (not-rotated) space.
-    Mantid::API::CoordTransform* transform = NULL;
+    Mantid::API::CoordTransform const * transform = NULL;
     if (m_useTransform)
       transform = m_workspace->getTransformToOriginal();
 
diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp
index 7f31e7343cf5a079a9d6011187485a828b264d12..dd30c422155a5aff6963394b795dca1f8de572ab 100644
--- a/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp
+++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDHistoQuadFactory.cpp
@@ -142,7 +142,7 @@ namespace Mantid
         std::cout << tim << " to check all the signal values." << std::endl;
 
         // Get the transformation that takes the points in the TRANSFORMED space back into the ORIGINAL (not-rotated) space.
-        Mantid::API::CoordTransform* transform = NULL;
+        Mantid::API::CoordTransform const* transform = NULL;
         if (m_useTransform)
           transform = m_workspace->getTransformToOriginal();
 
diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp
index fdf2398d98deec07734dfa0e24a514a70f7c0ebc..d6b392cc3b06635aa21d80a7d2bc6b650616b00f 100644
--- a/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp
+++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDLineFactory.cpp
@@ -86,7 +86,7 @@ namespace Mantid
         vtkIdList * linePointList = vtkIdList::New();
         linePointList->SetNumberOfIds(2);
 
-        Mantid::API::CoordTransform* transform = NULL;
+        Mantid::API::CoordTransform const* transform = NULL;
         if (m_useTransform)
         {
           transform = imdws->getTransformToOriginal();
diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp
index e894c7ac25ec3c5aa301c2063a96bf766fb2e8b5..b1a096fa9597155d821045b414a1f57c68201623 100644
--- a/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp
+++ b/Code/Mantid/Vates/VatesAPI/src/vtkMDQuadFactory.cpp
@@ -82,7 +82,7 @@ namespace Mantid
         vtkIdList * quadPointList = vtkIdList::New();
         quadPointList->SetNumberOfIds(4);
 
-        Mantid::API::CoordTransform* transform = NULL;
+        Mantid::API::CoordTransform const* transform = NULL;
         if (m_useTransform)
         {
           transform = imdws->getTransformToOriginal();
diff --git a/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp b/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp
index 0182401e60d7e2de6f3b0f3a89ea9b844b6eb83e..16838694fe3716bf71bbd285c263ae4e20bd736b 100644
--- a/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp
+++ b/Code/Mantid/Vates/VatesAPI/src/vtkSplatterPlotFactory.cpp
@@ -379,7 +379,7 @@ namespace VATES
     bool do4D = doMDHisto4D(workspace);
 
     // Get the transformation that takes the points in the TRANSFORMED space back into the ORIGINAL (not-rotated) space.
-    Mantid::API::CoordTransform* transform = NULL;
+    Mantid::API::CoordTransform const* transform = NULL;
     if (m_useTransform)
     {
      transform = workspace->getTransformToOriginal();