diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/ExperimentInfo.h b/Code/Mantid/Framework/API/inc/MantidAPI/ExperimentInfo.h
index 56dda258385e47e8c27c3f35be08c03e0e8129f5..ba59b8b4777280f08c5e748c82d6e396fb4319f9 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/ExperimentInfo.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/ExperimentInfo.h
@@ -4,9 +4,7 @@
 #include "MantidKernel/System.h"
 #include "MantidAPI/Sample.h"
 #include "MantidAPI/Run.h"
-#include "MantidGeometry/Instrument/Instrument.h"
-#include "MantidGeometry/IInstrument.h"
-
+#include "MantidGeometry/Instrument.h"
 
 namespace Mantid
 {
@@ -34,8 +32,8 @@ namespace API
     ExperimentInfo * cloneExperimentInfo();
 
     /// Instrument accessors
-    void setInstrument(const Geometry::IInstrument_sptr&);
-    Geometry::IInstrument_sptr getInstrument() const;
+    void setInstrument(const Geometry::Instrument_sptr&);
+    Geometry::Instrument_sptr getInstrument() const;
     boost::shared_ptr<Geometry::Instrument> getBaseInstrument() const;
 
     /// Returns the set of parameters modifying the base instrument
diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/IPeak.h b/Code/Mantid/Framework/API/inc/MantidAPI/IPeak.h
index b6b20a176eb002036b6da2bf99b3855438964caf..1615c88a1deb79c9d5ada0cabf3a760802cedcad 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/IPeak.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/IPeak.h
@@ -2,12 +2,10 @@
 #define MANTID_API_IPEAK_H_
     
 #include "MantidAPI/DllConfig.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/Matrix.h"
 #include "MantidKernel/V3D.h"
 #include "MantidKernel/PhysicalConstants.h"
-//#include "MantidKernel/System.h"
-
 
 namespace Mantid
 {
@@ -25,12 +23,12 @@ namespace API
 
     virtual ~IPeak();
 
-    virtual void setInstrument(Mantid::Geometry::IInstrument_const_sptr inst) = 0;
+    virtual void setInstrument(Geometry::Instrument_const_sptr inst) = 0;
 
     virtual int getDetectorID() const = 0;
     virtual void setDetectorID(int m_DetectorID) = 0;
-    virtual Mantid::Geometry::IDetector_const_sptr getDetector() const = 0;
-    virtual Mantid::Geometry::IInstrument_const_sptr getInstrument() const = 0;
+    virtual Geometry::IDetector_const_sptr getDetector() const = 0;
+    virtual Geometry::Instrument_const_sptr getInstrument() const = 0;
 
     virtual int getRunNumber() const = 0;
     virtual void setRunNumber(int m_RunNumber) = 0;
diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/IPeaksWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/IPeaksWorkspace.h
index 5a4c8b0dfa2643ee953f93583f4ecec9f35f4f0c..aeaf0af4b7554978477f3547af4371c5931ebd55 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/IPeaksWorkspace.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/IPeaksWorkspace.h
@@ -58,7 +58,7 @@ namespace API
     virtual ~IPeaksWorkspace();
 
     //boost::shared_ptr<IPeaksWorkspace> clone() = 0;
-    //void appendFile( std::string filename, Mantid::Geometry::IInstrument_sptr inst) = 0;
+    //void appendFile( std::string filename, Mantid::Geometry::Instrument_sptr inst) = 0;
 
     //---------------------------------------------------------------------------------------------
     /** @return the number of peaks
diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/InstrumentDataService.h b/Code/Mantid/Framework/API/inc/MantidAPI/InstrumentDataService.h
index c175985f93f52d10a1032d4402a835472dd22b68..bea178fbe2582d1e605357c9e62364157814aefa 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/InstrumentDataService.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/InstrumentDataService.h
@@ -3,7 +3,7 @@
 
 #include "MantidAPI/DllConfig.h"
 #include "MantidKernel/DataService.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/SingletonHolder.h"
 
 namespace Mantid
diff --git a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h
index ad151699f33413cb72ef06b2a37a0cf2fb534114..05ec077cf05175fb578cddf5b514985c07075707 100644
--- a/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h
+++ b/Code/Mantid/Framework/API/inc/MantidAPI/MatrixWorkspace.h
@@ -15,7 +15,7 @@
 #include "MantidAPI/WorkspaceHistory.h"
 #include "MantidAPI/WorkspaceIterator.h"
 #include "MantidGeometry/IDetector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/NearestNeighbours.h"
 #include "MantidKernel/cow_ptr.h"
 #include "MantidKernel/Exception.h"
diff --git a/Code/Mantid/Framework/API/src/ExperimentInfo.cpp b/Code/Mantid/Framework/API/src/ExperimentInfo.cpp
index 53309ace2199536944d278a001d55b42a32b5342..f1f69b5640039f113b9abaa3b49a1c69ae8b58aa 100644
--- a/Code/Mantid/Framework/API/src/ExperimentInfo.cpp
+++ b/Code/Mantid/Framework/API/src/ExperimentInfo.cpp
@@ -1,7 +1,6 @@
 #include "MantidAPI/ExperimentInfo.h"
 #include "MantidAPI/MatrixWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/ParameterMap.h"
 #include "MantidGeometry/Instrument/ParComponentFactory.h"
 #include "MantidGeometry/Instrument/XMLlogfile.h"
@@ -64,17 +63,16 @@ namespace API
   *
   * @param instr :: Shared pointer to an instrument.
   */
-  void ExperimentInfo::setInstrument(const IInstrument_sptr& instr)
+  void ExperimentInfo::setInstrument(const Instrument_sptr& instr)
   {
-    boost::shared_ptr<Instrument> tmp = boost::dynamic_pointer_cast<Instrument>(instr);
-    if (tmp->isParametrized())
+    if (instr->isParametrized())
     {
-      sptr_instrument = tmp->baseInstrument();
-      m_parmap = tmp->getParameterMap();
+      sptr_instrument = instr->baseInstrument();
+      m_parmap = instr->getParameterMap();
     }
     else
     {
-      sptr_instrument=tmp;
+      sptr_instrument = instr;
     }
   }
 
@@ -84,7 +82,7 @@ namespace API
   *
   *  @return The instrument class
   */
-  IInstrument_sptr ExperimentInfo::getInstrument()const
+  Instrument_sptr ExperimentInfo::getInstrument()const
   {
     return Geometry::ParComponentFactory::createInstrument(sptr_instrument, m_parmap);
   }
diff --git a/Code/Mantid/Framework/API/src/IFunctionMW.cpp b/Code/Mantid/Framework/API/src/IFunctionMW.cpp
index 9fc1cb1928db4f98fbaa660c414f4bdd362b1cca..30c5f8fa0321044f955dbd2083ccf57c09250940 100644
--- a/Code/Mantid/Framework/API/src/IFunctionMW.cpp
+++ b/Code/Mantid/Framework/API/src/IFunctionMW.cpp
@@ -268,7 +268,7 @@ void IFunctionMW::setMatrixWorkspace(boost::shared_ptr<const API::MatrixWorkspac
     // the detector returned by det->getID()
     if ( boost::dynamic_pointer_cast<Geometry::DetectorGroup>(det) )
     {
-      IInstrument_sptr inst = m_workspace->getInstrument();
+      Instrument_sptr inst = m_workspace->getInstrument();
       det = inst->getDetector(det->getID());
     }
 
@@ -436,7 +436,7 @@ double IFunctionMW::convertValue(double value, Kernel::Unit_sptr& outUnit,
       double l1,l2,twoTheta;
 
       // Get l1, l2 and theta  (see also RemoveBins.calculateDetectorPosition())
-      IInstrument_const_sptr instrument = ws->getInstrument();
+      Instrument_const_sptr instrument = ws->getInstrument();
       Geometry::IObjComponent_const_sptr sample = instrument->getSample();
       if (sample == NULL)
       {
@@ -498,7 +498,7 @@ void IFunctionMW::convertValue(std::vector<double>& values, Kernel::Unit_sptr& o
       double l1,l2,twoTheta;
 
       // Get l1, l2 and theta  (see also RemoveBins.calculateDetectorPosition())
-      IInstrument_const_sptr instrument = ws->getInstrument();
+      Instrument_const_sptr instrument = ws->getInstrument();
       Geometry::IObjComponent_const_sptr sample = instrument->getSample();
       if (sample == NULL)
       {
diff --git a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp
index 0c3c073e616916df45cfc3e8106e139a6a66e6cc..439189d94f4bff080d4aff4dec3cd96693706487 100644
--- a/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp
+++ b/Code/Mantid/Framework/API/src/MatrixWorkspace.cpp
@@ -7,7 +7,7 @@
 #include "MantidAPI/WorkspaceIterator.h"
 #include "MantidAPI/WorkspaceIteratorCode.h"
 #include "MantidAPI/SpectraDetectorMap.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/ParameterMap.h"
 #include "MantidGeometry/Instrument/ParComponentFactory.h"
 #include "MantidGeometry/Instrument/XMLlogfile.h"
@@ -709,7 +709,7 @@ namespace Mantid
         throw Kernel::Exception::NotFoundError("MatrixWorkspace::getDetector(): NULL spectrum found at the given workspace index.", "");
 
       const std::set<detid_t> dets = spec->getDetectorIDs();
-      IInstrument_sptr localInstrument = getInstrument();
+      Instrument_sptr localInstrument = getInstrument();
       if( !localInstrument )
       {
         g_log.debug() << "No instrument defined.\n";
diff --git a/Code/Mantid/Framework/API/test/ExperimentInfoTest.h b/Code/Mantid/Framework/API/test/ExperimentInfoTest.h
index 8e1e57fafc02732be9a9610d1084e6826db19a91..fb5a88c00bcf867c1076ff0716f740c8a5a2cb81 100644
--- a/Code/Mantid/Framework/API/test/ExperimentInfoTest.h
+++ b/Code/Mantid/Framework/API/test/ExperimentInfoTest.h
@@ -19,7 +19,7 @@ public:
   void test_GetInstrument_default()
   {
     ExperimentInfo ws;
-    boost::shared_ptr<IInstrument> i = ws.getInstrument();
+    boost::shared_ptr<Instrument> i = ws.getInstrument();
     TSM_ASSERT( "ExperimentInfo gets a default, empty Instrument.", i);
     TS_ASSERT_EQUALS( ws.getInstrument()->type(), "Instrument" );
   }
@@ -27,16 +27,16 @@ public:
   void test_GetSetInstrument_default()
   {
     ExperimentInfo ws;
-    boost::shared_ptr<IInstrument> inst1(new Instrument());
+    boost::shared_ptr<Instrument> inst1(new Instrument());
     inst1->setName("MyTestInst");
     ws.setInstrument(inst1);
 
     // Instruments don't point to the same base place since they
-    boost::shared_ptr<IInstrument> inst2 = ws.getInstrument();
+    boost::shared_ptr<Instrument> inst2 = ws.getInstrument();
     TS_ASSERT_EQUALS( inst2->getName(), "MyTestInst");
 
     // But the base instrument does!
-    boost::shared_ptr<IInstrument> inst3 = ws.getBaseInstrument();
+    boost::shared_ptr<Instrument> inst3 = ws.getBaseInstrument();
     TS_ASSERT_EQUALS( inst3.get(), inst1.get());
     TS_ASSERT_EQUALS( inst3->getName(), "MyTestInst");
   }
@@ -89,7 +89,7 @@ public:
     ws.mutableRun().setProtonCharge(1.234);
     ws.mutableSample().setName("test");
     ws.mutableSample().setOrientedLattice( new OrientedLattice(1,2,3,90,90,90) );
-    boost::shared_ptr<IInstrument> inst1(new Instrument());
+    boost::shared_ptr<Instrument> inst1(new Instrument());
     inst1->setName("MyTestInst");
     ws.setInstrument(inst1);
 
@@ -104,7 +104,7 @@ public:
     ws.mutableRun().setProtonCharge(1.234);
     ws.mutableSample().setName("test");
     ws.mutableSample().setOrientedLattice( new OrientedLattice(1,2,3,90,90,90) );
-    boost::shared_ptr<IInstrument> inst1(new Instrument());
+    boost::shared_ptr<Instrument> inst1(new Instrument());
     inst1->setName("MyTestInst");
     ws.setInstrument(inst1);
 
diff --git a/Code/Mantid/Framework/API/test/IMDWorkspaceTest.h b/Code/Mantid/Framework/API/test/IMDWorkspaceTest.h
index 14412166bffbfc3991e4605f120f0ce705a225de..ad0956a983d81187d16ad5a45124c57def7616e3 100644
--- a/Code/Mantid/Framework/API/test/IMDWorkspaceTest.h
+++ b/Code/Mantid/Framework/API/test/IMDWorkspaceTest.h
@@ -8,7 +8,7 @@
 #include "MantidAPI/WorkspaceFactory.h"
 #include "MantidAPI/NumericAxis.h"
 #include "MantidAPI/SpectraAxis.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/MDGeometry/IMDDimension.h"
 #include "MantidGeometry/MDGeometry/MDPoint.h"
 #include "MantidGeometry/MDGeometry/MDCell.h"
diff --git a/Code/Mantid/Framework/API/test/InstrumentDataServiceTest.h b/Code/Mantid/Framework/API/test/InstrumentDataServiceTest.h
index fbc97d43bc8510d07d8770dfcb45d3e645a1c9ea..ac311cd5e9ba3b3949526e8f1cfbb70a5d5b9c17 100644
--- a/Code/Mantid/Framework/API/test/InstrumentDataServiceTest.h
+++ b/Code/Mantid/Framework/API/test/InstrumentDataServiceTest.h
@@ -4,7 +4,7 @@
 #include <cxxtest/TestSuite.h>
 #include "MantidAPI/FrameworkManager.h"
 #include "MantidAPI/InstrumentDataService.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/Exception.h"
 #include <iostream>
 
diff --git a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h
index ab48c05d5ba86f6a632da10fe5c3b90e782e5fda..4baa94df104b33cc00c3eada4557307e7e9a1923 100644
--- a/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h
+++ b/Code/Mantid/Framework/API/test/MatrixWorkspaceTest.h
@@ -8,7 +8,7 @@
 #include "MantidAPI/SpectraAxis.h"
 #include "MantidAPI/SpectraDetectorMap.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/OneToOneSpectraDetectorMap.h"
 #include <boost/scoped_ptr.hpp>
 #include <cxxtest/TestSuite.h>
diff --git a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/InputWSDetectorInfo.h b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/InputWSDetectorInfo.h
index 60147d5f0e10bdeed5dd7083f2b91e8d9f4e72f7..0e52345a95a7bae9a1bfbad47ff1c8662caa56be 100644
--- a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/InputWSDetectorInfo.h
+++ b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/InputWSDetectorInfo.h
@@ -57,7 +57,7 @@ namespace Mantid
       /// following the example MaskDetectors write to this version of the instrument
       boost::shared_ptr<Geometry::Instrument> m_WInstru;
       /// when we read need to read from here
-      Geometry::IInstrument_sptr m_RInstru;
+      Geometry::Instrument_const_sptr m_RInstru;
       /// pointer to the map that links detectors to their masking with the input workspace
       Geometry::ParameterMap* m_Pmap;
     };
diff --git a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RemoveLowResTOF.h b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RemoveLowResTOF.h
index 39dc2b0327d141aae263e859b0dc9da359a34fb3..f6d192f6f1e20757860dad0a1d2eb794b3d61be0 100644
--- a/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RemoveLowResTOF.h
+++ b/Code/Mantid/Framework/Algorithms/inc/MantidAlgorithms/RemoveLowResTOF.h
@@ -30,7 +30,7 @@ private:
   void getTminData(const bool);
   double m_DIFCref; ///< The reference value for DIFC to filter with
   double m_K; ///< Mystery variable that I'm not sure what it is for
-  Geometry::IInstrument_const_sptr m_instrument; //< The instrument
+  Geometry::Instrument_const_sptr m_instrument; //< The instrument
   double m_L1; ///< The instrument initial flightpath
   double m_Tmin; ///< The start of the time-of-flight frame
   std::size_t m_numberOfSpectra; ///< The number of spectra in the workspace
diff --git a/Code/Mantid/Framework/Algorithms/src/AlignDetectors.cpp b/Code/Mantid/Framework/Algorithms/src/AlignDetectors.cpp
index 4674a72c55949fb28fc3fce856807bf461cb6aa8..965f7082564edb5a4239b1591948fe551c738b61 100644
--- a/Code/Mantid/Framework/Algorithms/src/AlignDetectors.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/AlignDetectors.cpp
@@ -60,7 +60,7 @@ std::map<detid_t, double> * AlignDetectors::calcTofToD_ConversionMap(Mantid::API
                                   bool vulcancorrection)
 {
   // Get a pointer to the instrument contained in the workspace
-  IInstrument_const_sptr instrument = inputWS->getInstrument();
+  Instrument_const_sptr instrument = inputWS->getInstrument();
 
   double l1;
   Kernel::V3D beamline,samplePos;
diff --git a/Code/Mantid/Framework/Algorithms/src/CaltoDspacemap.cpp b/Code/Mantid/Framework/Algorithms/src/CaltoDspacemap.cpp
index 95d9ff9243563618539a56a81fc366f48c4b0715..18ef009a1d430e37b5a5ea674e83be30c674334a 100644
--- a/Code/Mantid/Framework/Algorithms/src/CaltoDspacemap.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/CaltoDspacemap.cpp
@@ -8,7 +8,7 @@
 #include "MantidAPI/WorkspaceValidators.h"
 #include "MantidDataObjects/EventWorkspace.h"
 #include "MantidDataObjects/OffsetsWorkspace.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/V3D.h"
 #include "MantidKernel/BinaryFile.h"
 #include "MantidKernel/PhysicalConstants.h"
@@ -36,7 +36,6 @@ void CaltoDspacemap::initDocs()
 using namespace Kernel;
 using namespace API;
 using namespace DataObjects;
-using Geometry::IInstrument_const_sptr;
 using DataObjects::EventList;
 using DataObjects::EventWorkspace;
 using DataObjects::EventWorkspace_sptr;
diff --git a/Code/Mantid/Framework/Algorithms/src/ConvertUnits.cpp b/Code/Mantid/Framework/Algorithms/src/ConvertUnits.cpp
index 8b9174b6145070bc733c637264a6b825a9d0859f..856da1ed42d9e6c3cd46e9010b305b7fca009286 100644
--- a/Code/Mantid/Framework/Algorithms/src/ConvertUnits.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/ConvertUnits.cpp
@@ -332,7 +332,7 @@ void ConvertUnits::convertViaTOF(Kernel::Unit_const_sptr fromUnit, API::MatrixWo
   int64_t numberOfSpectra_i = static_cast<int64_t>(m_numberOfSpectra); // cast to make openmp happy
 
   // Get a pointer to the instrument contained in the workspace
-  IInstrument_const_sptr instrument = outputWS->getInstrument();
+  Instrument_const_sptr instrument = outputWS->getInstrument();
   // Get the parameter map
   const ParameterMap& pmap = outputWS->constInstrumentParameters();
 
diff --git a/Code/Mantid/Framework/Algorithms/src/CreateCalFileByNames.cpp b/Code/Mantid/Framework/Algorithms/src/CreateCalFileByNames.cpp
index 86c431b018815b30f8cc79f0af691322c715740c..87f212fa001c553e8eecd19b9eacb80a4d4548b2 100644
--- a/Code/Mantid/Framework/Algorithms/src/CreateCalFileByNames.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/CreateCalFileByNames.cpp
@@ -6,7 +6,6 @@
 #include "MantidAPI/InstrumentDataService.h"
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidAPI/WorkspaceProperty.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/ConfigService.h"
 #include <boost/algorithm/string/detail/classification.hpp>
 #include <boost/algorithm/string/split.hpp>
@@ -37,7 +36,7 @@ namespace Mantid
     using namespace Kernel;
     using API::Progress;
     using API::FileProperty;
-    using Geometry::IInstrument_sptr;
+    using Geometry::Instrument_sptr;
 
     CreateCalFileByNames::CreateCalFileByNames():API::Algorithm(),group_no(0)
     {
@@ -75,7 +74,7 @@ namespace Mantid
         throw std::runtime_error("Workspace not found!");
 
       // Get the instrument.
-      IInstrument_sptr inst = ws->getInstrument();
+      Instrument_sptr inst = ws->getInstrument();
       if (!inst)
         throw std::runtime_error("No instrument found in the workspace " + ws->getName());
 
diff --git a/Code/Mantid/Framework/Algorithms/src/CreateDummyCalFile.cpp b/Code/Mantid/Framework/Algorithms/src/CreateDummyCalFile.cpp
index 70529db8173eb0b63b7e5d9c22d48cb837e6dfb9..472a4cb7ba9636019c85897014be8c65bf189742 100644
--- a/Code/Mantid/Framework/Algorithms/src/CreateDummyCalFile.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/CreateDummyCalFile.cpp
@@ -6,7 +6,6 @@
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidAPI/InstrumentDataService.h"
-#include "MantidGeometry/IInstrument.h"
 
 #include <queue>
 #include <fstream>
@@ -84,7 +83,7 @@ namespace Mantid
         throw std::invalid_argument("No InputWorkspace");
 
       //Get some stuff from the input workspace
-      IInstrument_sptr inst = inputW->getInstrument();
+      Instrument_sptr inst = inputW->getInstrument();
       std::string instname = inst->getName();
 
       // Check that the instrument is in store
diff --git a/Code/Mantid/Framework/Algorithms/src/CreateGroupingWorkspace.cpp b/Code/Mantid/Framework/Algorithms/src/CreateGroupingWorkspace.cpp
index 48e766edc7f77dd6501cc3f12c3a1471dd80bab6..021e4ff0b60d4aec40f957b61dbdc8fd19d02773 100644
--- a/Code/Mantid/Framework/Algorithms/src/CreateGroupingWorkspace.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/CreateGroupingWorkspace.cpp
@@ -129,7 +129,7 @@ namespace Algorithms
    * @param detIDtoGroup :: output: map of detID: to group number
    * @param prog :: progress report
    */
-  void makeGroupingByNames(std::string GroupNames, IInstrument_sptr inst, std::map<detid_t, int> & detIDtoGroup, Progress & prog)
+  void makeGroupingByNames(std::string GroupNames, Instrument_sptr inst, std::map<detid_t, int> & detIDtoGroup, Progress & prog)
   {
     // Split the names of the group and insert in a vector
     std::vector<std::string> vgroups;
@@ -232,7 +232,7 @@ namespace Algorithms
       throw std::invalid_argument("You must specify either to use the OldCalFilename parameter OR GroupNames but not both!");
 
     // ---------- Get the instrument one of 3 ways ---------------------------
-    IInstrument_sptr inst;
+    Instrument_sptr inst;
     if (inWS)
     {
       inst = inWS->getInstrument();
diff --git a/Code/Mantid/Framework/Algorithms/src/DiffractionEventCalibrateDetectors.cpp b/Code/Mantid/Framework/Algorithms/src/DiffractionEventCalibrateDetectors.cpp
index a73cccf363ea03b12e1ea2e4fbe4c092f2e16df9..850562ea95145008df0dfc0f208dc83dd841af0c 100644
--- a/Code/Mantid/Framework/Algorithms/src/DiffractionEventCalibrateDetectors.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/DiffractionEventCalibrateDetectors.cpp
@@ -296,7 +296,7 @@ namespace Algorithms
     const std::string rb_params=getProperty("Params");
 
     //Get some stuff from the input workspace
-    IInstrument_sptr inst = inputW->getInstrument();
+    Instrument_sptr inst = inputW->getInstrument();
     if (!inst)
       throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
 
diff --git a/Code/Mantid/Framework/Algorithms/src/DiffractionEventReadDetCal.cpp b/Code/Mantid/Framework/Algorithms/src/DiffractionEventReadDetCal.cpp
index 9fdd1305f474f9cdc7f55afb089cf22f7e077c3f..75c97533a83e2b057a270aa7f3a63c3a6b60d53f 100644
--- a/Code/Mantid/Framework/Algorithms/src/DiffractionEventReadDetCal.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/DiffractionEventReadDetCal.cpp
@@ -106,7 +106,7 @@ namespace Algorithms
     MatrixWorkspace_sptr inputW = getProperty("InputWorkspace");
 
     //Get some stuff from the input workspace
-    IInstrument_sptr inst = inputW->getInstrument();
+    Instrument_sptr inst = inputW->getInstrument();
     if (!inst)
       throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
     std::string instname = inst->getName();
@@ -245,7 +245,7 @@ namespace Algorithms
         Quat Rot = Q2 * Q1;
 
         // Then find the corresponding relative position
-        boost::shared_ptr<IComponent> comp = inst->getComponentByName(detname);
+        boost::shared_ptr<const IComponent> comp = inst->getComponentByName(detname);
         boost::shared_ptr<const IComponent> parent = comp->getParent();
         if (parent)
         {
diff --git a/Code/Mantid/Framework/Algorithms/src/DiffractionFocussing2.cpp b/Code/Mantid/Framework/Algorithms/src/DiffractionFocussing2.cpp
index f5ef97446483d01517a9ece171c65ee3fc60106a..5201bc0989197f4bd14a3d4919450bad912c983d 100644
--- a/Code/Mantid/Framework/Algorithms/src/DiffractionFocussing2.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/DiffractionFocussing2.cpp
@@ -391,7 +391,7 @@ void DiffractionFocussing2::execEvent()
     // ------------- Pre-allocate Event Lists ----------------------------
     std::vector< std::vector<int> > ws_indices(nGroups+1);
     std::vector<size_t> size_required(nGroups+1,0);
-    Geometry::IInstrument_const_sptr instrument = eventW->getInstrument();
+    Geometry::Instrument_const_sptr instrument = eventW->getInstrument();
     Geometry::IObjComponent_const_sptr source;
     Geometry::IObjComponent_const_sptr sample;
     if (instrument != NULL)
diff --git a/Code/Mantid/Framework/Algorithms/src/EQSANSTofStructure.cpp b/Code/Mantid/Framework/Algorithms/src/EQSANSTofStructure.cpp
index 0fd55b7f07eacf3ec94553ddc64e9e51653f66ff..b1e3f103b06594b439a7aba01bf6e509e438d62e 100644
--- a/Code/Mantid/Framework/Algorithms/src/EQSANSTofStructure.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/EQSANSTofStructure.cpp
@@ -7,7 +7,7 @@
 #include "MantidDataObjects/Events.h"
 #include "MantidDataObjects/EventList.h"
 #include "MantidDataObjects/EventWorkspace.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 
 #include <vector>
 
diff --git a/Code/Mantid/Framework/Algorithms/src/FilterBadPulses.cpp b/Code/Mantid/Framework/Algorithms/src/FilterBadPulses.cpp
index 866f8c56540f2d0ca7612cc8995cfcb8aaeaf548..888b459b1f93285fbf5ed401013fddd0230627b7 100644
--- a/Code/Mantid/Framework/Algorithms/src/FilterBadPulses.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/FilterBadPulses.cpp
@@ -30,7 +30,6 @@ void FilterBadPulses::initDocs()
 
 using namespace Kernel;
 using namespace API;
-using Geometry::IInstrument_const_sptr;
 using DataObjects::EventList;
 using DataObjects::EventWorkspace;
 using DataObjects::EventWorkspace_sptr;
diff --git a/Code/Mantid/Framework/Algorithms/src/MultipleScatteringAbsorption.cpp b/Code/Mantid/Framework/Algorithms/src/MultipleScatteringAbsorption.cpp
index c843dacc3776967d117aa0b122e3f7237997dc97..cf9f46a2af5c08598681f6480df47bd9c7eec105 100644
--- a/Code/Mantid/Framework/Algorithms/src/MultipleScatteringAbsorption.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/MultipleScatteringAbsorption.cpp
@@ -85,7 +85,7 @@ void MultipleScatteringAbsorption::exec()
 
   // geometry stuff
   size_t nHist = in_WS->getNumberHistograms();
-  Geometry::IInstrument_const_sptr instrument = in_WS->getInstrument();
+  Geometry::Instrument_const_sptr instrument = in_WS->getInstrument();
   if (instrument == NULL)
     throw std::runtime_error("Failed to find instrument attached to InputWorkspace");
   Geometry::IObjComponent_const_sptr source = instrument->getSource();
diff --git a/Code/Mantid/Framework/Algorithms/src/ReadGroupsFromFile.cpp b/Code/Mantid/Framework/Algorithms/src/ReadGroupsFromFile.cpp
index 753b228ecfe495900b476383b46ba49a73a59083..d3da83bf75b666553b276df19f51779297c23f13 100644
--- a/Code/Mantid/Framework/Algorithms/src/ReadGroupsFromFile.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/ReadGroupsFromFile.cpp
@@ -9,7 +9,6 @@
 #include "MantidAPI/SpectraDetectorMap.h"
 #include "MantidAPI/WorkspaceProperty.h"
 #include "MantidDataObjects/Workspace2D.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/System.h"
 
@@ -101,7 +100,7 @@ namespace Algorithms
       throw std::runtime_error("Workspace not found!");
 
     // Get the instrument.
-    IInstrument_sptr inst = ws->getInstrument();
+    Instrument_sptr inst = ws->getInstrument();
     if (!inst)
       throw std::runtime_error("No instrument found in the workspace " + ws->getName());
 
diff --git a/Code/Mantid/Framework/Algorithms/src/RemoveBins.cpp b/Code/Mantid/Framework/Algorithms/src/RemoveBins.cpp
index 8dd5a51cb74b9224df65ac9e6c7ec95f5c02b893..e2ec20a0f3cc6df9cf1ddd7d71b64ab361aaeb71 100644
--- a/Code/Mantid/Framework/Algorithms/src/RemoveBins.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/RemoveBins.cpp
@@ -13,7 +13,6 @@ namespace Algorithms
 
 using namespace Kernel;
 using namespace API;
-using Geometry::IInstrument_const_sptr;
 
 // Register the class into the algorithm factory
 DECLARE_ALGORITHM(RemoveBins)
@@ -270,7 +269,7 @@ void RemoveBins::transformRangeUnit(const int& index, double& startX, double& en
 void RemoveBins::calculateDetectorPosition(const int& index, double& l1, double& l2, double& twoTheta)
 {
   // Get a pointer to the instrument contained in the workspace
-  IInstrument_const_sptr instrument = m_inputWorkspace->getInstrument();
+  Geometry::Instrument_const_sptr instrument = m_inputWorkspace->getInstrument();
   // Get the distance between the source and the sample (assume in metres)
   Geometry::IObjComponent_const_sptr sample = instrument->getSample();
   // Check for valid instrument
diff --git a/Code/Mantid/Framework/Algorithms/src/RemoveLowResTOF.cpp b/Code/Mantid/Framework/Algorithms/src/RemoveLowResTOF.cpp
index ecb373a0a2d071b4f710bf638012e03f1fb7f729..eb03665ee2a4be21438365a78f85ad16f1cd165b 100644
--- a/Code/Mantid/Framework/Algorithms/src/RemoveLowResTOF.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/RemoveLowResTOF.cpp
@@ -1,7 +1,7 @@
 #include "MantidAlgorithms/AlignDetectors.h"
 #include "MantidAlgorithms/RemoveLowResTOF.h"
 #include "MantidAPI/WorkspaceValidators.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include <limits>
 #include <map>
 #include <math.h>
@@ -15,7 +15,6 @@ using namespace Kernel;
 using namespace API;
 using namespace Geometry;
 using DataObjects::EventWorkspace;
-using Geometry::IInstrument_const_sptr;
 using Kernel::Exception::InstrumentDefinitionError;
 using Kernel::Exception::NotFoundError;
 using std::size_t;
diff --git a/Code/Mantid/Framework/Algorithms/src/SmoothNeighbours.cpp b/Code/Mantid/Framework/Algorithms/src/SmoothNeighbours.cpp
index 53e9cc0be5ebbe44aaf74875a8c70fae6569347d..69615788c386cda7ee67685345b466fba0fc8a2e 100644
--- a/Code/Mantid/Framework/Algorithms/src/SmoothNeighbours.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/SmoothNeighbours.cpp
@@ -76,7 +76,7 @@ void SmoothNeighbours::exec()
   //Get some stuff from the input workspace
   const size_t numberOfSpectra = inWS->getNumberHistograms();
   const int YLength = static_cast<int>(inWS->blocksize());
-  IInstrument_sptr inst = inWS->getInstrument();
+  Instrument_sptr inst = inWS->getInstrument();
   if (!inst)
     throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
 
diff --git a/Code/Mantid/Framework/Algorithms/src/SofQW.cpp b/Code/Mantid/Framework/Algorithms/src/SofQW.cpp
index 691931155736bcbaead12d890c1d0aeeaa58f29c..08f3c660b4ae7d8ab5d8f556dacd9f04ffe9cfc2 100644
--- a/Code/Mantid/Framework/Algorithms/src/SofQW.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/SofQW.cpp
@@ -77,7 +77,7 @@ void SofQW::exec()
   else if (emodeStr == "Indirect") emode=2;
   
   // Get a pointer to the instrument contained in the workspace
-  IInstrument_const_sptr instrument = inputWorkspace->getInstrument();
+  Instrument_const_sptr instrument = inputWorkspace->getInstrument();
   // Get the parameter map
   const ParameterMap& pmap = inputWorkspace->constInstrumentParameters();
   // Get the distance between the source and the sample (assume in metres)
diff --git a/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp b/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp
index 535778446062801fd17b783142d6a87269c7e326..58c54adf4bfb6a84be5d248118144b05264882d7 100755
--- a/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/SofQW2.cpp
@@ -242,7 +242,7 @@ namespace Mantid
         (PhysicalConstants::h*PhysicalConstants::h);
 
       // Get a pointer to the instrument contained in the workspace
-      Geometry::IInstrument_const_sptr instrument = workspace->getInstrument();
+      Geometry::Instrument_const_sptr instrument = workspace->getInstrument();
       // Get the distance between the source and the sample (assume in metres)
       Geometry::IObjComponent_const_sptr source = instrument->getSource();
       Geometry::IObjComponent_const_sptr sample = instrument->getSample();
diff --git a/Code/Mantid/Framework/Algorithms/src/SolidAngle.cpp b/Code/Mantid/Framework/Algorithms/src/SolidAngle.cpp
index 0c26edc4e68b1e80444b0044fa95641edc739f44..4bb9ff03d8423fbf2a14e3c791245297d82545d9 100644
--- a/Code/Mantid/Framework/Algorithms/src/SolidAngle.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/SolidAngle.cpp
@@ -26,7 +26,6 @@ namespace Mantid
 
     using namespace Kernel;
     using namespace API;
-    using Geometry::IInstrument_const_sptr;
 
     /// Default constructor
     SolidAngle::SolidAngle() : Algorithm()
@@ -95,7 +94,7 @@ namespace Mantid
       setProperty("OutputWorkspace",outputWS);
 
       // Get a pointer to the instrument contained in the workspace
-      IInstrument_const_sptr instrument = inputWS->getInstrument();
+      Geometry::Instrument_const_sptr instrument = inputWS->getInstrument();
 
       // Get the distance between the source and the sample (assume in metres)
       Geometry::IObjComponent_const_sptr sample = instrument->getSample();
diff --git a/Code/Mantid/Framework/Algorithms/src/SpatialGrouping.cpp b/Code/Mantid/Framework/Algorithms/src/SpatialGrouping.cpp
index f41bef4b563143e7258b636519252516e124ee4b..c543a5e857ebf1a14a2a6504dc4f69b907c62df2 100644
--- a/Code/Mantid/Framework/Algorithms/src/SpatialGrouping.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/SpatialGrouping.cpp
@@ -3,7 +3,6 @@
 //----------------------------------------------------------------------
 #include "MantidAlgorithms/SpatialGrouping.h"
 
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/IDetector.h"
 #include "MantidGeometry/Objects/BoundingBox.h"
 #include "MantidGeometry/ISpectraDetectorMap.h"
diff --git a/Code/Mantid/Framework/Algorithms/src/SumNeighbours.cpp b/Code/Mantid/Framework/Algorithms/src/SumNeighbours.cpp
index fedacebd3eee69d546b840a9df05c3936189334b..30e227886c58f28dcc45e0064ac158c6f5ffaa49 100644
--- a/Code/Mantid/Framework/Algorithms/src/SumNeighbours.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/SumNeighbours.cpp
@@ -87,7 +87,7 @@ void SumNeighbours::exec()
   //Get some stuff from the input workspace
   //const size_t numberOfSpectra = inWS->getNumberHistograms();
   const int YLength = static_cast<int>(inWS->blocksize());
-  IInstrument_sptr inst = inWS->getInstrument();
+  Instrument_sptr inst = inWS->getInstrument();
   if (!inst)
     throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
 
diff --git a/Code/Mantid/Framework/Algorithms/src/Unwrap.cpp b/Code/Mantid/Framework/Algorithms/src/Unwrap.cpp
index 5bad5c05f89fe5341d9062895d8f98e7fe83af09..5e8e16228b7ff7d02635b469d5a88839a2035abe 100644
--- a/Code/Mantid/Framework/Algorithms/src/Unwrap.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/Unwrap.cpp
@@ -10,10 +10,6 @@ namespace Algorithms
 
 DECLARE_ALGORITHM(Unwrap)
 
-using namespace Kernel;
-using namespace API;
-using Geometry::IInstrument_const_sptr;
-
 /// Default constructor
 Unwrap::Unwrap()
 {
diff --git a/Code/Mantid/Framework/Algorithms/src/UnwrapMonitor.cpp b/Code/Mantid/Framework/Algorithms/src/UnwrapMonitor.cpp
index cb81160426ad098ec5ef27d2d97a61fdcb169317..540301b21f3e2143d37027a98709f0436327d876 100644
--- a/Code/Mantid/Framework/Algorithms/src/UnwrapMonitor.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/UnwrapMonitor.cpp
@@ -23,7 +23,6 @@ void UnwrapMonitor::initDocs()
 
 using namespace Kernel;
 using namespace API;
-using Geometry::IInstrument_const_sptr;
 
 /// Default constructor
 UnwrapMonitor::UnwrapMonitor():m_progress(NULL)
@@ -149,7 +148,7 @@ void UnwrapMonitor::exec()
 double UnwrapMonitor::getPrimaryFlightpath() const
 {
   // Get a pointer to the instrument contained in the input workspace
-  IInstrument_const_sptr instrument = m_inputWS->getInstrument();
+  Geometry::Instrument_const_sptr instrument = m_inputWS->getInstrument();
   // Get the distance between the source and the sample
   Geometry::IObjComponent_const_sptr sample = instrument->getSample();
   double L1;
@@ -158,7 +157,7 @@ double UnwrapMonitor::getPrimaryFlightpath() const
     L1 = instrument->getSource()->getDistance(*sample);
     g_log.debug() << "Source-sample distance (in metres): " << L1 << std::endl;
   }
-  catch (Exception::NotFoundError e)
+  catch (Exception::NotFoundError&)
   {
     g_log.error("Unable to calculate source-sample distance");
     throw Exception::InstrumentDefinitionError("Unable to calculate source-sample distance", m_inputWS->getTitle());
@@ -196,7 +195,7 @@ double UnwrapMonitor::calculateFlightpath(const int& spectrum, const double& L1,
       Ld = det->getDistance(*(m_inputWS->getInstrument()->getSource()));
     }
   }
-  catch (Exception::NotFoundError)
+  catch (Exception::NotFoundError&)
   {
     // If the detector information is missing, return a negative number
   }
diff --git a/Code/Mantid/Framework/Algorithms/src/UnwrapSNS.cpp b/Code/Mantid/Framework/Algorithms/src/UnwrapSNS.cpp
index 2f3858a21718be80daaf35554c63ebba3f5b6f47..c0a9bd9540d254cb8362d6969fcd30965f1705f8 100644
--- a/Code/Mantid/Framework/Algorithms/src/UnwrapSNS.cpp
+++ b/Code/Mantid/Framework/Algorithms/src/UnwrapSNS.cpp
@@ -27,7 +27,6 @@ using namespace Kernel;
 using namespace API;
 using DataObjects::EventList;
 using DataObjects::EventWorkspace;
-using Geometry::IInstrument_const_sptr;
 using Kernel::Exception::InstrumentDefinitionError;
 using Kernel::Exception::NotFoundError;
 using std::size_t;
@@ -109,11 +108,11 @@ void UnwrapSNS::exec()
 
   // without the primary flight path the algorithm cannot work
   try {
-    IInstrument_const_sptr instrument = m_inputWS->getInstrument();
+    Geometry::Instrument_const_sptr instrument = m_inputWS->getInstrument();
     Geometry::IObjComponent_const_sptr sample = instrument->getSample();
     m_L1 = instrument->getSource()->getDistance(*sample);
   }
-  catch (NotFoundError e)
+  catch (NotFoundError&)
   {
     throw InstrumentDefinitionError("Unable to calculate source-sample distance",
         m_inputWS->getTitle());
diff --git a/Code/Mantid/Framework/Algorithms/test/CreateCalFileByNamesTest.h b/Code/Mantid/Framework/Algorithms/test/CreateCalFileByNamesTest.h
index 5d76358abf4c723acaf2b526e0666e6d6f0974b1..68fc70ddc11fdec36cd98b1905fd37731854bdbc 100644
--- a/Code/Mantid/Framework/Algorithms/test/CreateCalFileByNamesTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/CreateCalFileByNamesTest.h
@@ -6,7 +6,7 @@
 #include "MantidAlgorithms/CreateCalFileByNames.h"
 #include "MantidDataHandling/LoadEmptyInstrument.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
diff --git a/Code/Mantid/Framework/Algorithms/test/CreateDummyCalFileTest.h b/Code/Mantid/Framework/Algorithms/test/CreateDummyCalFileTest.h
index 8610467e0b6a4c387159ef17e014e628a1bd530f..22e3cbe8aeb74ff5c587a07be980dab905eec5fd 100644
--- a/Code/Mantid/Framework/Algorithms/test/CreateDummyCalFileTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/CreateDummyCalFileTest.h
@@ -6,7 +6,7 @@
 #include "MantidAlgorithms/CreateDummyCalFile.h"
 #include "MantidDataHandling/LoadEmptyInstrument.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
diff --git a/Code/Mantid/Framework/Algorithms/test/CreatePSDBleedMaskTest.h b/Code/Mantid/Framework/Algorithms/test/CreatePSDBleedMaskTest.h
index ca7053b29216b17263cf96648aed7d3781182879..898fab0706809d2a698482f9dbdaf6945dc419af 100644
--- a/Code/Mantid/Framework/Algorithms/test/CreatePSDBleedMaskTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/CreatePSDBleedMaskTest.h
@@ -6,13 +6,13 @@
 
 #include "MantidTestHelpers/WorkspaceCreationHelper.h"
 #include "MantidTestHelpers/ComponentCreationHelper.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/OneToOneSpectraDetectorMap.h"
 #include "MantidGeometry/Instrument/CompAssembly.h"
 #include "MantidGeometry/Instrument/Detector.h"
 
 using Mantid::DataObjects::Workspace2D_sptr;
-using Mantid::Geometry::IInstrument_sptr;
+using Mantid::Geometry::Instrument_sptr;
 
 class CreatePSDBleedMaskTest : public CxxTest::TestSuite
 {
@@ -113,9 +113,8 @@ private:
     return testWS;
   }
 
-  Mantid::Geometry::IInstrument_sptr createTestInstrument(const int nTubes = 3, const int nPixelsPerTube = 50)
+  Mantid::Geometry::Instrument_sptr createTestInstrument(const int nTubes = 3, const int nPixelsPerTube = 50)
   {
-    using Mantid::Geometry::IInstrument;
     using Mantid::Geometry::Instrument_sptr;
     using Mantid::Geometry::Instrument;
     using Mantid::Geometry::CompAssembly;
diff --git a/Code/Mantid/Framework/Algorithms/test/DiffractionEventReadDetCalTest.h b/Code/Mantid/Framework/Algorithms/test/DiffractionEventReadDetCalTest.h
index 3b653d760f2304b99f1014dabd35ba6ce68160f4..02e6735ef7b10113c14592097dfac971e16e9852 100644
--- a/Code/Mantid/Framework/Algorithms/test/DiffractionEventReadDetCalTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/DiffractionEventReadDetCalTest.h
@@ -6,7 +6,7 @@
 #include "MantidAlgorithms/DiffractionEventReadDetCal.h"
 #include "MantidDataHandling/LoadEmptyInstrument.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/RectangularDetector.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
@@ -68,11 +68,11 @@ public:
     output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName));
     
     //Get some stuff from the input workspace
-    IInstrument_sptr ins = output->getInstrument();
+    Instrument_sptr ins = output->getInstrument();
     if (!ins)
       throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
 
-    boost::shared_ptr<Mantid::Geometry::IComponent> det = ins->getComponentByName("bank1");
+    IComponent_const_sptr det = ins->getComponentByName("bank1");
     V3D PosNew = det->getPos();
     Quat rot = det->getRotation();
     TS_ASSERT_EQUALS(PosNew, V3D(0.500000,0.167548,-0.167548));
diff --git a/Code/Mantid/Framework/Algorithms/test/DspacemaptoCalTest.h b/Code/Mantid/Framework/Algorithms/test/DspacemaptoCalTest.h
index a64bc1b7900b2064c598ca24d738f7421fe68447..188168698965430b22fc8f69d6d4d28af840fc00 100644
--- a/Code/Mantid/Framework/Algorithms/test/DspacemaptoCalTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/DspacemaptoCalTest.h
@@ -8,7 +8,7 @@
 #include "MantidDataHandling/SaveCalFile.h"
 #include "MantidDataHandling/LoadEmptyInstrument.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
diff --git a/Code/Mantid/Framework/Algorithms/test/FindDetectorsOutsideLimitsTest.h b/Code/Mantid/Framework/Algorithms/test/FindDetectorsOutsideLimitsTest.h
index ae506e2acd696415dc5e0214d3333604c66fc04f..4c7ecc6160ea2bf20418ae6d0d93488c4b17c6a2 100644
--- a/Code/Mantid/Framework/Algorithms/test/FindDetectorsOutsideLimitsTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/FindDetectorsOutsideLimitsTest.h
@@ -166,7 +166,7 @@ public:
   {
     // Make a workspace with 50 pixels, 200 events per pixel.
     EventWorkspace_sptr work_in = WorkspaceCreationHelper::CreateEventWorkspace2();
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(10);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(10);
     work_in->setInstrument(inst);
     DateAndTime run_start("2010-01-01");
     // Add ten more at #10 so that it fails
diff --git a/Code/Mantid/Framework/Algorithms/test/ReadGroupsFromFileTest.h b/Code/Mantid/Framework/Algorithms/test/ReadGroupsFromFileTest.h
index c2215de26c616301b530ce36381160a337a428c6..0fb78bf3e196a6a51ec17fe023bd538ccd71448c 100644
--- a/Code/Mantid/Framework/Algorithms/test/ReadGroupsFromFileTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/ReadGroupsFromFileTest.h
@@ -15,7 +15,7 @@
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidGeometry/Instrument/Component.h"
 #include "MantidGeometry/Instrument/FitParameter.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/Exception.h"
 #include <Poco/File.h>
diff --git a/Code/Mantid/Framework/Algorithms/test/SpatialGroupingTest.h b/Code/Mantid/Framework/Algorithms/test/SpatialGroupingTest.h
index e8437308ad52dd39b78a25bd1f91ce658dcf605c..8d6c76d58c93ba0d99ff26a17e97af7de18503f3 100644
--- a/Code/Mantid/Framework/Algorithms/test/SpatialGroupingTest.h
+++ b/Code/Mantid/Framework/Algorithms/test/SpatialGroupingTest.h
@@ -7,7 +7,7 @@
 #include "MantidTestHelpers/ComponentCreationHelper.h"
 #include "MantidTestHelpers/WorkspaceCreationHelper.h"
 #include "MantidAPI/MatrixWorkspace.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/ParameterMap.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidGeometry/Instrument/OneToOneSpectraDetectorMap.h"
diff --git a/Code/Mantid/Framework/Crystal/inc/MantidCrystal/PredictPeaks.h b/Code/Mantid/Framework/Crystal/inc/MantidCrystal/PredictPeaks.h
index 5a8532156eaec57743c6853e9dfdc1e1c3d9195f..a2052032e9908daf9347defdf354c8f8b26910ea 100644
--- a/Code/Mantid/Framework/Crystal/inc/MantidCrystal/PredictPeaks.h
+++ b/Code/Mantid/Framework/Crystal/inc/MantidCrystal/PredictPeaks.h
@@ -4,7 +4,6 @@
 #include "MantidAPI/Algorithm.h" 
 #include "MantidDataObjects/PeaksWorkspace.h"
 #include "MantidGeometry/Crystal/ReflectionCondition.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/System.h"
 #include <MantidGeometry/Crystal/OrientedLattice.h>
 #include "MantidKernel/Matrix.h"
@@ -53,7 +52,7 @@ namespace Crystal
     /// Max wavelength parameter
     double wlMax;
     /// Instrument reference
-    Mantid::Geometry::IInstrument_sptr inst;
+    Geometry::Instrument_sptr inst;
     /// Output peaks workspace
     Mantid::DataObjects::PeaksWorkspace_sptr pw;
     /// Counter of possible peaks
diff --git a/Code/Mantid/Framework/Crystal/src/AnvredCorrection.cpp b/Code/Mantid/Framework/Crystal/src/AnvredCorrection.cpp
index 3f1c598fc7efe368275b6a71f841776c9192239c..151228c2b728f15d575712c9e398fb6a4449ba56 100644
--- a/Code/Mantid/Framework/Crystal/src/AnvredCorrection.cpp
+++ b/Code/Mantid/Framework/Crystal/src/AnvredCorrection.cpp
@@ -160,7 +160,7 @@ void AnvredCorrection::exec()
     if ( !det ) continue;
 
     // This is the scattered beam direction
-    IInstrument_sptr inst = m_inputWS->getInstrument();
+    Instrument_const_sptr inst = m_inputWS->getInstrument();
     V3D dir = det->getPos() - samplePos;
     // Two-theta = polar angle = scattering angle = between +Z vector and the scattered beam
     double scattering = dir.angle( V3D(0.0, 0.0, 1.0) );
@@ -244,7 +244,7 @@ void AnvredCorrection::execEvent()
     if ( !det ) continue;
 
     // This is the scattered beam direction
-    IInstrument_sptr inst = eventW->getInstrument();
+    Instrument_const_sptr inst = eventW->getInstrument();
     V3D dir = det->getPos() - samplePos;
     // Two-theta = polar angle = scattering angle = between +Z vector and the scattered beam
     double scattering = dir.angle( V3D(0.0, 0.0, 1.0) );
diff --git a/Code/Mantid/Framework/Crystal/src/IntegratePeakTimeSlices.cpp b/Code/Mantid/Framework/Crystal/src/IntegratePeakTimeSlices.cpp
index df27d48c41ad44d2e9fd612971a56c9f5f12643e..c1b5816bff5d2412e79c12c6eccb09a9778a513e 100644
--- a/Code/Mantid/Framework/Crystal/src/IntegratePeakTimeSlices.cpp
+++ b/Code/Mantid/Framework/Crystal/src/IntegratePeakTimeSlices.cpp
@@ -22,7 +22,6 @@
 #include "MantidAPI/SpectraDetectorTypes.h"
 #include "MantidAPI/Progress.h"
 #include "MantidGeometry/IDTypes.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/cow_ptr.h"
 #include "MantidKernel/PropertyManagerOwner.h"
 #include "MantidKernel/Unit.h"
@@ -464,7 +463,7 @@ namespace Mantid
     boost::shared_ptr<const RectangularDetector> IntegratePeakTimeSlices::getPanel(Peak const & peak)
     {
 
-      Mantid::Geometry::IInstrument_const_sptr Iptr = peak.getInstrument();
+      Geometry::Instrument_const_sptr Iptr = peak.getInstrument();
       std::string bankName = peak.getBankName();
 
       boost::shared_ptr<const IComponent> parent = Iptr->getComponentByName(bankName);
@@ -525,7 +524,7 @@ namespace Mantid
       try
       {
         Q = peak.getQLabFrame().norm();
-        Geometry::IInstrument_const_sptr instr = peak.getInstrument();
+        Geometry::Instrument_const_sptr instr = peak.getInstrument();
         const Geometry::IObjComponent_sptr  sample = instr->getSample();
         V3D pos = peak.getDetPos()-sample->getPos();
 
diff --git a/Code/Mantid/Framework/Crystal/src/LoadPeaksFile.cpp b/Code/Mantid/Framework/Crystal/src/LoadPeaksFile.cpp
index 70ed6f6a955a561605be823baa4772e15e217852..b1bb48e5579d887afb3feaa6998b889c6658f4c9 100644
--- a/Code/Mantid/Framework/Crystal/src/LoadPeaksFile.cpp
+++ b/Code/Mantid/Framework/Crystal/src/LoadPeaksFile.cpp
@@ -223,7 +223,7 @@ namespace Crystal
     lastStr = getWord( in , false );
 
     // Find the detector ID from row/col
-    IInstrument_const_sptr inst = outWS->getInstrument();
+    Instrument_const_sptr inst = outWS->getInstrument();
     if (!inst) throw std::runtime_error("No instrument in PeaksWorkspace!");
     IComponent_const_sptr bank = inst->getComponentByName(bankName);
     if (!bank) throw std::runtime_error("Bank named " + bankName + " not found!");
diff --git a/Code/Mantid/Framework/Crystal/src/MaskPeaksWorkspace.cpp b/Code/Mantid/Framework/Crystal/src/MaskPeaksWorkspace.cpp
index 7a7ea59ca0be6a68445eb8e287851e6a29c2cee3..8a8fc50f52b49b0bba1b75898ffbb97ab132a22f 100644
--- a/Code/Mantid/Framework/Crystal/src/MaskPeaksWorkspace.cpp
+++ b/Code/Mantid/Framework/Crystal/src/MaskPeaksWorkspace.cpp
@@ -79,7 +79,7 @@ namespace Mantid
       //To get the workspace index from the detector ID
       detid2index_map * pixel_to_wi = inputW->getDetectorIDToWorkspaceIndexMap(true);
       //Get some stuff from the input workspace
-      Geometry::IInstrument_sptr inst = inputW->getInstrument();
+      Geometry::Instrument_sptr inst = inputW->getInstrument();
       if (!inst)
         throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
 
@@ -101,9 +101,9 @@ namespace Mantid
         XPeak = int(col+0.5)-1;
         YPeak = int(row+0.5)-1;
   
-        boost::shared_ptr<Geometry::IComponent> comp = inst->getComponentByName(peak.getBankName());
+        Geometry::IComponent_const_sptr comp = inst->getComponentByName(peak.getBankName());
         if (!comp) throw std::invalid_argument("Component "+peak.getBankName()+" does not exist in instrument");
-        boost::shared_ptr<Geometry::RectangularDetector> det = boost::dynamic_pointer_cast<Geometry::RectangularDetector>(comp);
+        Geometry::RectangularDetector_const_sptr det = boost::dynamic_pointer_cast<const Geometry::RectangularDetector>(comp);
         if (!det) throw std::invalid_argument("Component "+peak.getBankName()+" is not a rectangular detector");
         for (int ix=Xmin; ix <= Xmax; ix++)
           for (int iy=Ymin; iy <= Ymax; iy++)
diff --git a/Code/Mantid/Framework/Crystal/src/PeakIntegration.cpp b/Code/Mantid/Framework/Crystal/src/PeakIntegration.cpp
index 997fa57c850d309dff0842677bf34e74b804dfdc..4b9c05b562d556e272d4d88a365c82a7549dbbee 100644
--- a/Code/Mantid/Framework/Crystal/src/PeakIntegration.cpp
+++ b/Code/Mantid/Framework/Crystal/src/PeakIntegration.cpp
@@ -94,7 +94,7 @@ namespace Mantid
       pixel_to_wi = inputW->getDetectorIDToWorkspaceIndexMap(true);
 
 
-      IInstrument_sptr inst = inputW->getInstrument();
+      Instrument_sptr inst = inputW->getInstrument();
       if (!inst)
         throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
     
@@ -322,7 +322,7 @@ void PeakIntegration::sumneighbours(std::string det_name, int x0, int y0, int Su
 {
 
   //Get some stuff from the input workspace
-  IInstrument_sptr inst = inputW->getInstrument();
+  Instrument_sptr inst = inputW->getInstrument();
   if (!inst)
     throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
 
@@ -545,7 +545,7 @@ int PeakIntegration::fitneighbours(int ipeak, std::string det_name, int x0, int
   // Number of slices
   int TOFmax = 0;
   //Get some stuff from the input workspace
-  IInstrument_sptr inst = inputW->getInstrument();
+  Instrument_sptr inst = inputW->getInstrument();
   if (!inst)
     throw std::runtime_error("The InputWorkspace does not have a valid instrument attached to it!");
 
diff --git a/Code/Mantid/Framework/Crystal/src/PredictPeaks.cpp b/Code/Mantid/Framework/Crystal/src/PredictPeaks.cpp
index 0e385de2dcdff4e1eff8d178c7ed5fc7d56251be..941a9b33c01a4101d1d03db6975b1b0880aa17ff 100644
--- a/Code/Mantid/Framework/Crystal/src/PredictPeaks.cpp
+++ b/Code/Mantid/Framework/Crystal/src/PredictPeaks.cpp
@@ -2,7 +2,6 @@
 #include "MantidDataObjects/Peak.h"
 #include "MantidDataObjects/PeaksWorkspace.h"
 #include "MantidGeometry/Crystal/UnitCell.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/Matrix.h"
 #include "MantidGeometry/Objects/InstrumentRayTracer.h"
 #include "MantidKernel/PropertyWithValue.h"
@@ -146,7 +145,7 @@ namespace Crystal
         V3D beamNormalized = beam;
         beamNormalized.normalize();
         tracker.traceFromSample(beamNormalized);
-        IDetector_sptr det = tracker.getDetectorResult();
+        IDetector_const_sptr det = tracker.getDetectorResult();
         if (det)
         {
           // Create the peak
diff --git a/Code/Mantid/Framework/Crystal/src/SaveIsawPeaks.cpp b/Code/Mantid/Framework/Crystal/src/SaveIsawPeaks.cpp
index 861eed47f28e86968d8f1e0d971828266f45a7db..74159f4e4e7f010a843d29453e14da6a21bcf183 100644
--- a/Code/Mantid/Framework/Crystal/src/SaveIsawPeaks.cpp
+++ b/Code/Mantid/Framework/Crystal/src/SaveIsawPeaks.cpp
@@ -2,7 +2,6 @@
 #include "MantidCrystal/SaveIsawPeaks.h"
 #include "MantidDataObjects/Peak.h"
 #include "MantidDataObjects/PeaksWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/Instrument/RectangularDetector.h"
 #include "MantidKernel/V3D.h"
 #include "MantidKernel/Strings.h"
@@ -13,8 +12,6 @@ using namespace Mantid::Geometry;
 using namespace Mantid::DataObjects;
 using namespace Mantid::Kernel;
 using namespace Mantid::API;
-using Mantid::Geometry::IInstrument_sptr;
-using Mantid::Geometry::IInstrument_sptr;
 
 namespace Mantid
 {
@@ -78,7 +75,7 @@ namespace Crystal
 
     std::ofstream out( filename.c_str() );
 
-    IInstrument_const_sptr inst = ws->getInstrument();
+    Instrument_const_sptr inst = ws->getInstrument();
     if (!inst) throw std::runtime_error("No instrument in PeaksWorkspace. Cannot save peaks file.");
 
     double l1; V3D beamline; double beamline_norm; V3D samplePos;
diff --git a/Code/Mantid/Framework/Crystal/test/IntegratePeakTimeSlicesTest.h b/Code/Mantid/Framework/Crystal/test/IntegratePeakTimeSlicesTest.h
index 7e3a9a1be82084a7dee84da3b135aeb05e35e36f..4a02f653da1da35d88b2ac4bfb2b72be2cfdb0a8 100644
--- a/Code/Mantid/Framework/Crystal/test/IntegratePeakTimeSlicesTest.h
+++ b/Code/Mantid/Framework/Crystal/test/IntegratePeakTimeSlicesTest.h
@@ -15,7 +15,6 @@
 #include "MantidCurveFitting/Fit.h"
 #include "MantidCrystal/IntegratePeakTimeSlices.h"
 #include "MantidGeometry/IComponent.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidGeometry/Instrument/RectangularDetector.h"
 #include "MantidKernel/Unit.h"
@@ -77,13 +76,13 @@ public:
     for (size_t k = 0; k < wsPtr->getNumberHistograms(); k++)
       wsPtr->setX(k, x_vals);
 
-    Geometry::IInstrument_sptr instP = wsPtr->getInstrument();
-    boost::shared_ptr<Geometry::IComponent> bankC = instP->getComponentByName(std::string("bank1"));
+    Geometry::Instrument_sptr instP = wsPtr->getInstrument();
+    IComponent_const_sptr bankC = instP->getComponentByName(std::string("bank1"));
 
     if (bankC->type().compare("RectangularDetector") != 0)
       throw std::runtime_error(" No Rect bank named bank 1");
 
-    boost::shared_ptr<Geometry::RectangularDetector> bankR = boost::dynamic_pointer_cast<
+    boost::shared_ptr<const Geometry::RectangularDetector> bankR = boost::dynamic_pointer_cast<const
         Geometry::RectangularDetector>(bankC);
 
     boost::shared_ptr<Geometry::Detector> pixelp = bankR->getAtXY(PeakCol, PeakRow);
@@ -275,15 +274,15 @@ ISAWIntensityError     98.0362     134.863      164.32     187.991      164.32
       Workspace2D_sptr wsPtr = boost::dynamic_pointer_cast<Workspace2D>(
           AnalysisDataService::Instance().retrieve("RebinResult"));
 
-      Geometry::IInstrument_sptr instP = wsPtr->getInstrument();
+      Geometry::Instrument_sptr instP = wsPtr->getInstrument();
 
-      boost::shared_ptr<Geometry::IComponent> bankC = instP->getComponentByName(std::string("bank26"));
+      IComponent_const_sptr bankC = instP->getComponentByName(std::string("bank26"));
 
       if (bankC->type().compare("RectangularDetector") != 0)
         throw std::runtime_error(" No Rect bank named bank 26");
 
-      boost::shared_ptr<Geometry::RectangularDetector> bankR = boost::dynamic_pointer_cast<
-          Geometry::RectangularDetector>(bankC);
+      boost::shared_ptr<const Geometry::RectangularDetector> bankR = boost::dynamic_pointer_cast<
+          const Geometry::RectangularDetector>(bankC);
 
       boost::shared_ptr<Geometry::Detector> pixelp = bankR->getAtXY(57, 214);
 
@@ -327,7 +326,7 @@ private:
   /**
    *   Calculates Q
    */
-  double calcQ(RectangularDetector_sptr bankP, boost::shared_ptr<IInstrument> instPtr, int row, int col,
+  double calcQ(RectangularDetector_const_sptr bankP, boost::shared_ptr<Instrument> instPtr, int row, int col,
       double time)
   {
     boost::shared_ptr<Detector> detP = bankP->getAtXY(col, row);
@@ -363,10 +362,10 @@ private:
         WorkspaceFactory::Instance().create("Workspace2D", NVectors, ntimes, nvals));
     //wsPtr->initialize(NVectors, ntimes, nvals);
 
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(Npanels, NRC,
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(Npanels, NRC,
         sideLength);
 
-    wsPtr->setInstrument(boost::dynamic_pointer_cast<Geometry::IInstrument>(inst));
+    wsPtr->setInstrument(inst);
 
     wsPtr->rebuildSpectraMapping(false);
 
diff --git a/Code/Mantid/Framework/Crystal/test/PredictPeaksTest.h b/Code/Mantid/Framework/Crystal/test/PredictPeaksTest.h
index 5ac7f8ab86ccbb24f00675b235c7611db15fe30b..204ba54d5b25381fdecb08f7b7909f7760efc38f 100644
--- a/Code/Mantid/Framework/Crystal/test/PredictPeaksTest.h
+++ b/Code/Mantid/Framework/Crystal/test/PredictPeaksTest.h
@@ -35,7 +35,7 @@ public:
   }
   
   /** Make a HKL peaks workspace */
-  PeaksWorkspace_sptr getHKLpw(IInstrument_sptr inst, std::vector<V3D> hkls, detid_t detid)
+  PeaksWorkspace_sptr getHKLpw(Instrument_sptr inst, std::vector<V3D> hkls, detid_t detid)
   {
     PeaksWorkspace_sptr hklPW;
     if (hkls.size() > 0)
@@ -59,7 +59,7 @@ public:
 
     // Make the fake input workspace
     MatrixWorkspace_sptr inWS = WorkspaceCreationHelper::Create2DWorkspace(10000, 1);
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(1, 100);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(1, 100);
     inWS->setInstrument(inst);
 
     //Set ub and Goniometer rotation
@@ -126,7 +126,7 @@ public:
 
     // Make the fake input workspace
     MatrixWorkspace_sptr inWS = WorkspaceCreationHelper::Create2DWorkspace(10000, 1);
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(1, 100);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(1, 100);
     inWS->setInstrument(inst);
 
     //Set ub and Goniometer rotation
diff --git a/Code/Mantid/Framework/Crystal/test/SaveIsawPeaksTest.h b/Code/Mantid/Framework/Crystal/test/SaveIsawPeaksTest.h
index a6559a5e5f51a9a73fd0f38a18b071e4181e700f..c50c9567a42df76e710144ced167ea51a5c1b7b1 100644
--- a/Code/Mantid/Framework/Crystal/test/SaveIsawPeaksTest.h
+++ b/Code/Mantid/Framework/Crystal/test/SaveIsawPeaksTest.h
@@ -5,7 +5,6 @@
 #include "MantidDataObjects/Peak.h"
 #include "MantidDataObjects/PeaksWorkspace.h"
 #include "MantidGeometry/IDTypes.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/System.h"
 #include "MantidKernel/Timer.h"
 #include "MantidTestHelpers/ComponentCreationHelper.h"
@@ -34,7 +33,7 @@ public:
   
   void do_test(int numRuns, size_t numBanks, size_t numPeaksPerBank)
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(4, 10, 1.0);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(4, 10, 1.0);
     PeaksWorkspace_sptr ws(new PeaksWorkspace());
     ws->setInstrument(inst);
 
diff --git a/Code/Mantid/Framework/CurveFitting/src/IkedaCarpenterPV.cpp b/Code/Mantid/Framework/CurveFitting/src/IkedaCarpenterPV.cpp
index c0fe0562752c615297d7e9d40dd79989016c1598..b665c14db609b21a9d5abbc5ec0477c653d3d524 100644
--- a/Code/Mantid/Framework/CurveFitting/src/IkedaCarpenterPV.cpp
+++ b/Code/Mantid/Framework/CurveFitting/src/IkedaCarpenterPV.cpp
@@ -142,7 +142,7 @@ void IkedaCarpenterPV::calWavelengthAtEachDataPoint(const double* xValues, const
       // its size smaller than nData
       if ( m_workspace != 0 )
       {
-        IInstrument_const_sptr instrument = m_workspace->getInstrument();
+        Instrument_const_sptr instrument = m_workspace->getInstrument();
         Geometry::IObjComponent_const_sptr sample = instrument->getSample();
         if (sample != NULL)
         {
diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadCalFile.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadCalFile.h
index b5a68308e23641cc5fecd0d01d8c2e7b982d58dc..3c659cf31d73df9a3313a8a735ff5ff7cbe06989 100644
--- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadCalFile.h
+++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadCalFile.h
@@ -6,7 +6,7 @@
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidDataObjects/GroupingWorkspace.h"
 #include "MantidDataObjects/OffsetsWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/System.h"
 
 
@@ -36,7 +36,7 @@ namespace DataHandling
 
     static void getInstrument3WaysInit(Mantid::API::Algorithm * alg);
 
-    static Mantid::Geometry::IInstrument_sptr getInstrument3Ways(Mantid::API::Algorithm * alg);
+    static Geometry::Instrument_sptr getInstrument3Ways(API::Algorithm * alg);
 
     static void readCalFile(const std::string& calFileName,
         Mantid::DataObjects::GroupingWorkspace_sptr groupWS, Mantid::DataObjects::OffsetsWorkspace_sptr offsetsWS, Mantid::API::MatrixWorkspace_sptr maskWS);
diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h
index d80400ec1ea87ad7fba8884be21404c925ead582..220c58b66d48b9092eb848cb5009b60aef69d93b 100644
--- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h
+++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/LoadEventNexus.h
@@ -161,7 +161,7 @@ namespace Mantid
           std::vector<Kernel::DateAndTime> & pulseTimes, Algorithm * alg);
 
       /// Load a spectra mapping from the given file
-      static Geometry::ISpectraDetectorMap * loadSpectraMapping(const std::string & filename, Mantid::Geometry::IInstrument_sptr inst,
+      static Geometry::ISpectraDetectorMap * loadSpectraMapping(const std::string & filename, Geometry::Instrument_sptr inst,
           const bool monitorsOnly, const std::string entry_name, Mantid::Kernel::Logger & g_log);
 
     private:
diff --git a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveToSNSHistogramNexus.h b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveToSNSHistogramNexus.h
index f302cc259d9575efa547f52f1ec322e2d35b885b..5dfcf6b7482c54ca32664be6b16a39b50102f9e8 100644
--- a/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveToSNSHistogramNexus.h
+++ b/Code/Mantid/Framework/DataHandling/inc/MantidDataHandling/SaveToSNSHistogramNexus.h
@@ -117,7 +117,7 @@ namespace Mantid
       int WriteAttributes (int is_definition);
       int copy_file(const char* inFile, int nx_read_access, const char* outFile, int nx_write_access);
 
-      int WriteOutDataOrErrors(boost::shared_ptr<Mantid::Geometry::RectangularDetector> det,
+      int WriteOutDataOrErrors(Geometry::RectangularDetector_const_sptr det,
           int x_pixel_slab,
           const char * field_name, const char * errors_field_name,
           bool doErrors, bool doBoth, int is_definition,
diff --git a/Code/Mantid/Framework/DataHandling/src/FindDetectorsInShape.cpp b/Code/Mantid/Framework/DataHandling/src/FindDetectorsInShape.cpp
index 787738b531f22f977963aa57ed0db2c82b895a65..d973f3f2ab02220ee29f5fcc57112922cf7756b8 100644
--- a/Code/Mantid/Framework/DataHandling/src/FindDetectorsInShape.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/FindDetectorsInShape.cpp
@@ -68,7 +68,7 @@ void FindDetectorsInShape::initDocs()
 			boost::shared_ptr<Geometry::Object> shape_sptr = sFactory.createShape(shapeXML);
 
 			//get the instrument out of the workspace
-			IInstrument_sptr instrument_sptr = WS->getInstrument();
+			Instrument_const_sptr instrument_sptr = WS->getInstrument();
 
       //To get all the detector ID's
       detid2det_map allDetectors;
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadCalFile.cpp b/Code/Mantid/Framework/DataHandling/src/LoadCalFile.cpp
index 3267725ceb37c024a81ba71d034bfe2456aabe31..df85ebddea6b3714920305e2185c4ca7e6541b05 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadCalFile.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadCalFile.cpp
@@ -5,12 +5,11 @@
 #include "MantidDataObjects/GroupingWorkspace.h"
 #include "MantidDataObjects/OffsetsWorkspace.h"
 #include "MantidDataObjects/Workspace2D.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/System.h"
 #include <fstream>
 #include "MantidDataObjects/SpecialWorkspace2D.h"
 
-using Mantid::Geometry::IInstrument_sptr;
+using Mantid::Geometry::Instrument_sptr;
 using namespace Mantid::Kernel;
 using namespace Mantid::API;
 using namespace Mantid::DataObjects;
@@ -73,7 +72,7 @@ namespace DataHandling
   /** Get a pointer to an instrument in one of 3 ways: InputWorkspace, InstrumentName, InstrumentFilename
    * @param alg :: algorithm from which to get the property values.
    * */
-  Mantid::Geometry::IInstrument_sptr LoadCalFile::getInstrument3Ways(Algorithm * alg)
+  Geometry::Instrument_sptr LoadCalFile::getInstrument3Ways(Algorithm * alg)
   {
     MatrixWorkspace_sptr inWS = alg->getProperty("InputWorkspace");
     std::string InputWorkspace = alg->getPropertyValue("InputWorkspace");
@@ -92,7 +91,7 @@ namespace DataHandling
       throw std::invalid_argument("You must specify exactly ONE way to get an instrument (workspace, instrument name, or IDF file). You specified none.");
 
     // ---------- Get the instrument one of 3 ways ---------------------------
-    IInstrument_sptr inst;
+    Instrument_sptr inst;
     if (inWS)
     {
       inst = inWS->getInstrument();
@@ -150,7 +149,7 @@ namespace DataHandling
     if (WorkspaceName.empty())
       throw std::invalid_argument("Must specify WorkspaceName.");
 
-    IInstrument_sptr inst = LoadCalFile::getInstrument3Ways(this);
+    Instrument_sptr inst = LoadCalFile::getInstrument3Ways(this);
 
     GroupingWorkspace_sptr groupWS;
     OffsetsWorkspace_sptr offsetsWS;
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadDspacemap.cpp b/Code/Mantid/Framework/DataHandling/src/LoadDspacemap.cpp
index 61103791b8b9797188a31a9210356c63a4a62922..4183058dba9f9bbcd1c76eb140c6337bec3fbd60 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadDspacemap.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadDspacemap.cpp
@@ -6,7 +6,6 @@
 #include "MantidDataObjects/EventWorkspace.h"
 #include "MantidDataObjects/GroupingWorkspace.h"
 #include "MantidDataObjects/OffsetsWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/V3D.h"
 #include "MantidKernel/BinaryFile.h"
 #include "MantidKernel/PhysicalConstants.h"
@@ -86,7 +85,7 @@ namespace DataHandling
   void LoadDspacemap::exec()
   {
     // Get the instrument
-    IInstrument_sptr inst = LoadCalFile::getInstrument3Ways(this);
+    Instrument_sptr inst = LoadCalFile::getInstrument3Ways(this);
 
     // Read in the calibration data
     const std::string DFileName = getProperty("Filename");
@@ -137,7 +136,7 @@ namespace DataHandling
       Mantid::DataObjects::OffsetsWorkspace_sptr offsetsWS)
   {
     // Get a pointer to the instrument contained in the workspace
-    IInstrument_const_sptr instrument = offsetsWS->getInstrument();
+    Instrument_const_sptr instrument = offsetsWS->getInstrument();
     double l1;
     Kernel::V3D beamline,samplePos;
     double beamline_norm;
@@ -197,7 +196,7 @@ namespace DataHandling
       Mantid::DataObjects::OffsetsWorkspace_sptr offsetsWS)
   {
     // Get a pointer to the instrument contained in the workspace
-    IInstrument_const_sptr instrument = offsetsWS->getInstrument();
+    Instrument_const_sptr instrument = offsetsWS->getInstrument();
 
     //To get all the detector ID's
     detid2det_map allDetectors;
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadEmptyInstrument.cpp b/Code/Mantid/Framework/DataHandling/src/LoadEmptyInstrument.cpp
index 845a11ca0d77802b96d8ebfc62ff8b9f3b9dc4a6..30c5e0c13f93f76da5f7a78887713c44c9f0caf2 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadEmptyInstrument.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadEmptyInstrument.cpp
@@ -68,7 +68,7 @@ namespace Mantid
 
       // load the instrument into this workspace
       MatrixWorkspace_sptr ws = this->runLoadInstrument();
-      IInstrument_sptr instrument = ws->getInstrument();
+      Instrument_sptr instrument = ws->getInstrument();
 
       // Get detectors stored in instrument and create dummy c-arrays for the purpose
       // of calling method of SpectraDetectorMap 
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp
index fec696ec5f6e01a18bb5fd61b43fbeef9bb7bb7b..5efcf7b33ecd72493f05455f7e6d1002e79969b8 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadEventNexus.cpp
@@ -2,7 +2,6 @@
 // Includes
 //----------------------------------------------------------------------
 #include "MantidDataHandling/LoadEventNexus.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/Instrument/CompAssembly.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/DateAndTime.h"
@@ -1192,7 +1191,7 @@ void LoadEventNexus::createSpectraMapping(const std::string &nxsfile,
   if( !monitorsOnly && !bankName.empty() )
   {
     // Only build the map for the single bank
-    std::vector<IDetector_sptr> dets;
+    std::vector<IDetector_const_sptr> dets;
     WS->getInstrument()->getDetectorsInBank(dets, bankName);
     if (dets.size() > 0)
     {
@@ -1307,7 +1306,7 @@ void LoadEventNexus::runLoadMonitors()
  * @param entry_name :: name of the NXentry to open.
  * @returns A pointer to a new map or NULL if the block does not exist
  */
-Geometry::ISpectraDetectorMap * LoadEventNexus::loadSpectraMapping(const std::string & filename, Mantid::Geometry::IInstrument_sptr inst,
+Geometry::ISpectraDetectorMap * LoadEventNexus::loadSpectraMapping(const std::string & filename, Geometry::Instrument_sptr inst,
                                    const bool monitorsOnly, const std::string entry_name, Mantid::Kernel::Logger & g_log)
 {
   ::NeXus::File file(filename);
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadGSS.cpp b/Code/Mantid/Framework/DataHandling/src/LoadGSS.cpp
index 1b1fb65ab76c8ca0d5b1d60fb7982b5d65ad7e8f..230c8fc7228cc9dd964893f6542acce5a3f19afd 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadGSS.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadGSS.cpp
@@ -6,7 +6,7 @@
 #include "MantidAPI/WorkspaceValidators.h"
 #include "MantidKernel/UnitFactory.h"
 #include "MantidAPI/LoadAlgorithmFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidGeometry/Instrument/CompAssembly.h"
 #include "MantidGeometry/Instrument/Component.h"
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus.cpp
index 74cc25c0f18dcb9e8cba02b6e3424cc4cc65bcbd..f28be8a3e0930854c31b4ccf57b932ae6b75c5c8 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadISISNexus.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadISISNexus.cpp
@@ -31,7 +31,7 @@ namespace Mantid
 
     using namespace Kernel;
     using namespace API;
-    using Geometry::IInstrument;
+    using Geometry::Instrument;
     using std::size_t;
 
     /// Empty default constructor
@@ -106,7 +106,7 @@ namespace Mantid
       Property *ws = getProperty("OutputWorkspace");
       std::string localWSName = ws->value();
       // If multiperiod, will need to hold the Instrument, Sample & SpectraDetectorMap for copying
-      boost::shared_ptr<IInstrument> instrument;
+      boost::shared_ptr<Instrument> instrument;
       boost::shared_ptr<Sample> sample;
 
       // Call private method to validate the optional parameters, if set
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadInstrument.cpp b/Code/Mantid/Framework/DataHandling/src/LoadInstrument.cpp
index bf7e965bc71b4a9d3cd2e708a8c4c84ea6f94d65..15f18b6b6ea8f00e9e372d76af0d36f71c7fdb35 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadInstrument.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadInstrument.cpp
@@ -4,7 +4,7 @@
 #include "MantidDataHandling/LoadInstrument.h"
 #include "MantidDataHandling/LoadParameterFile.h"
 #include "MantidGeometry/Objects/ShapeFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidAPI/InstrumentDataService.h"
 #include "MantidGeometry/Instrument/XMLlogfile.h"
 #include "MantidAPI/Progress.h"
@@ -268,6 +268,7 @@ namespace Mantid
         NodeList* pNL_parameter = pRootElem->getElementsByTagName("parameter");
 
         unsigned long numParameter = pNL_parameter->length();
+        hasParameterElement.reserve(numParameter);
         for (unsigned long i = 0; i < numParameter; i++)
         {
           Element* pParameterElem = static_cast<Element*>(pNL_parameter->item(i));
@@ -533,7 +534,7 @@ namespace Mantid
 
       // Read detector IDs into idlist if required
       // Note idlist may be defined for any component
-      // Note any new idlist found will take presedence. 
+      // Note any new idlist found will take precedence.
 
       if ( pCompElem->hasAttribute("idlist") )
       {
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromNexus.cpp
index 68c74cc9bf536dce6c1a3be3b91d3a2bfd0988b2..d30084db665856d7dca0f731920bf9d6b5dcba11 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromNexus.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromNexus.cpp
@@ -2,7 +2,7 @@
 // Includes
 //----------------------------------------------------------------------
 #include "MantidDataHandling/LoadInstrumentFromNexus.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidGeometry/Instrument/CompAssembly.h"
 #include "MantidGeometry/Instrument/Component.h"
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromRaw.cpp b/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromRaw.cpp
index 4879a1b11e9bb10c5967554d06656fb04fabb697..e13ca7aae78065f7cb90ca831971443650b3b694 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromRaw.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadInstrumentFromRaw.cpp
@@ -4,7 +4,7 @@
 #include "MantidDataHandling/LoadInstrumentFromRaw.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidAPI/FileProperty.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidGeometry/Instrument/CompAssembly.h"
 #include "MantidGeometry/Instrument/Component.h"
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadInstrumentHelper.cpp b/Code/Mantid/Framework/DataHandling/src/LoadInstrumentHelper.cpp
index 8a87ff3ea4474d85b7a01af061b43c25a4c1cc63..53def648f866ff388af668c42467ebc9931fd82e 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadInstrumentHelper.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadInstrumentHelper.cpp
@@ -5,7 +5,7 @@
 #include "MantidKernel/DateAndTime.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/InstrumentInfo.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/OneToOneSpectraDetectorMap.h"
 #include "MantidAPI/Run.h"
 #include "MantidAPI/MatrixWorkspace.h"
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadLOQDistancesFromRaw.cpp b/Code/Mantid/Framework/DataHandling/src/LoadLOQDistancesFromRaw.cpp
index f067a2e17d1d4ca396987fadccfe5dc10a10ce38..ea7d75f4d8e958c696f94823f827507a7ed2e182 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadLOQDistancesFromRaw.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadLOQDistancesFromRaw.cpp
@@ -72,7 +72,7 @@ namespace DataHandling
 
     // Get current sample position
     std::string compname = "some-sample-holder";
-    boost::shared_ptr<Geometry::IComponent> sample_holder = data_ws->getInstrument()->getComponentByName(compname);
+    Geometry::IComponent_const_sptr sample_holder = data_ws->getInstrument()->getComponentByName(compname);
     if( sample_holder.get() )
     {
       double curr_zpos = sample_holder->getPos().Z();
@@ -89,7 +89,7 @@ namespace DataHandling
     sample_holder = data_ws->getInstrument()->getComponentByName(compname);
     //Get the main detector component
     compname = "main-detector-bank";
-    boost::shared_ptr<Geometry::IComponent> main_det = data_ws->getInstrument()->getComponentByName(compname);
+    Geometry::IComponent_const_sptr main_det = data_ws->getInstrument()->getComponentByName(compname);
     if( main_det.get() && sample_holder.get() )
     {
       double curr_zpos = main_det->getPos().Z();
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadLogsFromSNSNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadLogsFromSNSNexus.cpp
index d0dc532cd315dbcb02734a1628fd00dfd834a574..32b920d187566149742ace2f6c56ec7a91f563e4 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadLogsFromSNSNexus.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadLogsFromSNSNexus.cpp
@@ -2,7 +2,7 @@
 // Includes
 //----------------------------------------------------------------------
 #include "MantidDataHandling/LoadLogsFromSNSNexus.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/DateAndTime.h"
 #include "MantidKernel/Timer.h"
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadMuonLog.cpp b/Code/Mantid/Framework/DataHandling/src/LoadMuonLog.cpp
index b8ef204a1441b06ead7b30946d571ff2f437ccf1..5a0f5bf32c572b5fb51e3303f47fce6efd309695 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadMuonLog.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadMuonLog.cpp
@@ -27,8 +27,6 @@ void LoadMuonLog::initDocs()
 
 
 using namespace Kernel;
-using Geometry::IInstrument;
-using Geometry::IInstrument_sptr;
 using API::WorkspaceProperty;
 using API::MatrixWorkspace;
 using API::MatrixWorkspace_sptr;
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus.cpp b/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus.cpp
index 3c50abf1c3d4038121509a9cb6efa200282b67fe..4f8f7492c29c94db9649730f88a6a9fd176b1336 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus.cpp
@@ -38,7 +38,7 @@ namespace Mantid
 
     using namespace Kernel;
     using namespace API;
-    using Geometry::IInstrument;
+    using Geometry::Instrument;
     using namespace Mantid::NeXus;
 
     /// Empty default constructor
@@ -131,7 +131,7 @@ namespace Mantid
       Property *ws = getProperty("OutputWorkspace");
       std::string localWSName = ws->value();
       // If multiperiod, will need to hold the Instrument, Sample & SpectraDetectorMap for copying
-      boost::shared_ptr<IInstrument> instrument;
+      boost::shared_ptr<Instrument> instrument;
       boost::shared_ptr<Sample> sample;
 
       // Call private method to validate the optional parameters, if set
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus2.cpp b/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus2.cpp
index cbc4b9483a371241b8347f4421f82a281edf589b..f85232b429d1e9f2f81a04bfa617e4bc8c055fb8 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus2.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadMuonNexus2.cpp
@@ -34,7 +34,7 @@ namespace Mantid
 
     using namespace Kernel;
     using namespace API;
-    using Geometry::IInstrument;
+    using Geometry::Instrument;
     using namespace Mantid::NeXus;
     
     /// Sets documentation strings for this algorithm
@@ -103,7 +103,7 @@ namespace Mantid
       Property *ws = getProperty("OutputWorkspace");
       std::string localWSName = ws->value();
       // If multiperiod, will need to hold the Instrument, Sample & SpectraDetectorMap for copying
-      boost::shared_ptr<IInstrument> instrument;
+      boost::shared_ptr<Instrument> instrument;
       //-      boost::shared_ptr<SpectraDetectorMap> specMap;
       boost::shared_ptr<Sample> sample;
 
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadNexusProcessed.cpp b/Code/Mantid/Framework/DataHandling/src/LoadNexusProcessed.cpp
index 53ba4c835e3727a9c9acd6b3eef7feda5efc2301..e4644291b5b07d0da54e9c674242bb32ddc452cd 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadNexusProcessed.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadNexusProcessed.cpp
@@ -42,7 +42,7 @@ using namespace Mantid::NeXus;
 using namespace DataObjects;
 using namespace Kernel;
 using namespace API;
-using Geometry::IInstrument_sptr;
+using Geometry::Instrument_sptr;
 
 /// Default constructor
 LoadNexusProcessed::LoadNexusProcessed() : m_shared_bins(false), m_xbins(),
@@ -1176,7 +1176,7 @@ void LoadNexusProcessed::readParameterMap(NXEntry & mtd_entry,
 
   const std::string & details =  pmap_node.data().front();
   Geometry::ParameterMap& pmap = local_workspace->instrumentParameters();
-  IInstrument_sptr instr = local_workspace->getBaseInstrument();
+  Instrument_sptr instr = local_workspace->getBaseInstrument();
   
   int options = Poco::StringTokenizer::TOK_IGNORE_EMPTY;
   options += Poco::StringTokenizer::TOK_TRIM;
@@ -1191,7 +1191,7 @@ void LoadNexusProcessed::readParameterMap(NXEntry & mtd_entry,
     std::string comp_name = tokens[0];
     //if( comp_name == prev_name ) continue; this blocks reading in different parameters of the same component. RNT
     //prev_name = comp_name;
-    Geometry::IComponent* comp = 0;
+    const Geometry::IComponent* comp = 0;
     if (comp_name.find("detID:") != std::string::npos)
     {
       int detID = atoi(comp_name.substr(6).c_str());
diff --git a/Code/Mantid/Framework/DataHandling/src/LoadParameterFile.cpp b/Code/Mantid/Framework/DataHandling/src/LoadParameterFile.cpp
index f942924ac29b40584be91cffedee44685d27bc40..f55944e002f5faeb3e2645f48b002238c63b1425 100644
--- a/Code/Mantid/Framework/DataHandling/src/LoadParameterFile.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/LoadParameterFile.cpp
@@ -3,7 +3,7 @@
 //----------------------------------------------------------------------
 #include "MantidDataHandling/LoadParameterFile.h"
 #include "MantidDataHandling/LoadInstrument.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidAPI/InstrumentDataService.h"
 #include "MantidGeometry/Instrument/XMLlogfile.h"
 #include "MantidGeometry/Instrument/Detector.h"
diff --git a/Code/Mantid/Framework/DataHandling/src/MoveInstrumentComponent.cpp b/Code/Mantid/Framework/DataHandling/src/MoveInstrumentComponent.cpp
index fb7f4442ee804bee59db149dd88b65f615224376..ec054fe34f5950e31d92f6bfc90a066612944e2b 100644
--- a/Code/Mantid/Framework/DataHandling/src/MoveInstrumentComponent.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/MoveInstrumentComponent.cpp
@@ -57,8 +57,8 @@ void MoveInstrumentComponent::exec()
   const double Z = getProperty("Z");
   const bool RelativePosition = getProperty("RelativePosition");
 
-  boost::shared_ptr<IInstrument> inst = WS->getInstrument();
-  boost::shared_ptr<IComponent> comp;
+  Instrument_sptr inst = WS->getInstrument();
+  IComponent_const_sptr comp;
 
   // Find the component to move
   if (DetID != -1)
diff --git a/Code/Mantid/Framework/DataHandling/src/RotateInstrumentComponent.cpp b/Code/Mantid/Framework/DataHandling/src/RotateInstrumentComponent.cpp
index c8556f862a1377a934232c177632b966d97b487e..1c43ddd429833cca815c9dd3f35e2ab6509770b1 100644
--- a/Code/Mantid/Framework/DataHandling/src/RotateInstrumentComponent.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/RotateInstrumentComponent.cpp
@@ -61,8 +61,8 @@ void RotateInstrumentComponent::exec()
 
   if (X + Y + Z == 0.0) throw std::invalid_argument("The rotation axis must not be a zero vector");
 
-  boost::shared_ptr<IInstrument> inst = WS->getInstrument();
-  boost::shared_ptr<IComponent> comp;
+  Instrument_sptr inst = WS->getInstrument();
+  IComponent_const_sptr comp;
 
   // Find the component to move
   if (DetID != -1)
diff --git a/Code/Mantid/Framework/DataHandling/src/SaveCalFile.cpp b/Code/Mantid/Framework/DataHandling/src/SaveCalFile.cpp
index f6ca6a4ac883bdc3a4ef0ac6006e320c0cc4f476..fa9acd8a8479988535a6e304ff18bc0e13238dd8 100644
--- a/Code/Mantid/Framework/DataHandling/src/SaveCalFile.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/SaveCalFile.cpp
@@ -2,7 +2,6 @@
 #include "MantidDataHandling/SaveCalFile.h"
 #include "MantidDataObjects/GroupingWorkspace.h"
 #include "MantidDataObjects/OffsetsWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/System.h"
 #include <cmath>
 #include <fstream>
@@ -89,7 +88,7 @@ namespace DataHandling
   void SaveCalFile::saveCalFile(const std::string& calFileName,
       GroupingWorkspace_sptr groupWS, OffsetsWorkspace_sptr offsetsWS, MatrixWorkspace_sptr maskWS)
   {
-    IInstrument_sptr inst;
+    Instrument_sptr inst;
 
     bool doGroup = false;
     if (groupWS) { doGroup = true; inst = groupWS->getInstrument(); }
diff --git a/Code/Mantid/Framework/DataHandling/src/SaveDspacemap.cpp b/Code/Mantid/Framework/DataHandling/src/SaveDspacemap.cpp
index a1afc65ffcdfdaa97075e78f0651d1fcfc4316a4..0bb37ef0b793a7b6ba1083c0e452f6342b5f0fed 100644
--- a/Code/Mantid/Framework/DataHandling/src/SaveDspacemap.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/SaveDspacemap.cpp
@@ -83,7 +83,7 @@ namespace DataHandling
   {
     const char * filename = DFileName.c_str();
     // Get a pointer to the instrument contained in the workspace
-    IInstrument_const_sptr instrument = offsetsWS->getInstrument();
+    Instrument_const_sptr instrument = offsetsWS->getInstrument();
     double l1;
     Kernel::V3D beamline,samplePos;
     double beamline_norm;
diff --git a/Code/Mantid/Framework/DataHandling/src/SaveGSS.cpp b/Code/Mantid/Framework/DataHandling/src/SaveGSS.cpp
index 25b1cd243c06fe7c972beee451199215691fb9e1..cd3466e8fc12103c56080c1c177cb964f9b9ae7f 100644
--- a/Code/Mantid/Framework/DataHandling/src/SaveGSS.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/SaveGSS.cpp
@@ -70,7 +70,7 @@ namespace Mantid
     void getFocusedPos(MatrixWorkspace_const_sptr wksp, const int spectrum, double &l1, double &l2,
         double &tth)
     {
-      Geometry::IInstrument_const_sptr instrument = wksp->getInstrument();
+      Geometry::Instrument_const_sptr instrument = wksp->getInstrument();
       if (instrument == NULL)
       {
         l1 = 0.;
@@ -135,7 +135,7 @@ namespace Mantid
       ios_base::openmode mode = (append ? (ios_base::out | ios_base::app) : ios_base::out);
       Progress p(this, 0.0, 1.0, nHist);
       double l1, l2, tth;
-      Geometry::IInstrument_const_sptr instrument = inputWS->getInstrument();
+      Geometry::Instrument_const_sptr instrument = inputWS->getInstrument();
       Geometry::IObjComponent_const_sptr source;
       Geometry::IObjComponent_const_sptr sample;
       if (instrument != NULL)
diff --git a/Code/Mantid/Framework/DataHandling/src/SaveNexusProcessed.cpp b/Code/Mantid/Framework/DataHandling/src/SaveNexusProcessed.cpp
index dfc9375ba9d2833ca2d6fec8412bba6546d66bae..e4a120de0a877f14657e46d3bf4bf8d5372513df 100644
--- a/Code/Mantid/Framework/DataHandling/src/SaveNexusProcessed.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/SaveNexusProcessed.cpp
@@ -26,7 +26,7 @@ namespace DataHandling
   using namespace Kernel;
   using namespace API;
   using namespace DataObjects;
-  using Geometry::IInstrument_const_sptr;
+  using Geometry::Instrument_const_sptr;
 
   // Register the algorithm into the algorithm factory
   DECLARE_ALGORITHM(SaveNexusProcessed)
@@ -164,7 +164,7 @@ namespace DataHandling
     // write instrument data, if present and writer enabled
     if (matrixWorkspace) 
     { 
-      IInstrument_const_sptr instrument = matrixWorkspace->getInstrument();
+      Instrument_const_sptr instrument = matrixWorkspace->getInstrument();
       nexusFile->writeNexusInstrument(instrument);
       prog_init.reportIncrement(1, "Writing instrument");
 
diff --git a/Code/Mantid/Framework/DataHandling/src/SaveToSNSHistogramNexus.cpp b/Code/Mantid/Framework/DataHandling/src/SaveToSNSHistogramNexus.cpp
index 3596296b244fee8010cbbeb114c0179c961e8b08..7183b099c4129b8864a8e0d95a99044e2cb7ce7e 100644
--- a/Code/Mantid/Framework/DataHandling/src/SaveToSNSHistogramNexus.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/SaveToSNSHistogramNexus.cpp
@@ -214,7 +214,7 @@ namespace DataHandling
    * @param bank :: name of the bank being written.
    * @return error code
    */
-  int SaveToSNSHistogramNexus::WriteOutDataOrErrors(boost::shared_ptr<Mantid::Geometry::RectangularDetector> det,
+  int SaveToSNSHistogramNexus::WriteOutDataOrErrors(Geometry::RectangularDetector_const_sptr det,
       int x_pixel_slab,
       const char * field_name, const char * errors_field_name,
       bool doErrors, bool doBoth, int is_definition,
@@ -412,8 +412,8 @@ namespace DataHandling
     if (NXgetinfo (inId, &dataRank, dataDimensions, &dataType) != NX_OK) return NX_ERROR;
 
     // Get the rectangular detector
-    IComponent_sptr det_comp = inputWorkspace->getInstrument()->getComponentByName( std::string(bank) );
-    boost::shared_ptr<RectangularDetector> det = boost::dynamic_pointer_cast<RectangularDetector>(det_comp);
+    IComponent_const_sptr det_comp = inputWorkspace->getInstrument()->getComponentByName( std::string(bank) );
+    RectangularDetector_const_sptr det = boost::dynamic_pointer_cast<const RectangularDetector>(det_comp);
     if (!det)
     {
       g_log.information() << "Detector '" + bank + "' not found, or it is not a rectangular detector!\n";
diff --git a/Code/Mantid/Framework/DataHandling/src/SetScalingPSD.cpp b/Code/Mantid/Framework/DataHandling/src/SetScalingPSD.cpp
index f2787697605cbd66dae3d5c8141e08a02741b4d3..a7a6c22e90844b6d760104b11f76cff363c73161 100644
--- a/Code/Mantid/Framework/DataHandling/src/SetScalingPSD.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/SetScalingPSD.cpp
@@ -96,7 +96,7 @@ namespace DataHandling
       std::map<int,double> scaleMap;
       std::map<int,double>::iterator its;
 
-      IInstrument_const_sptr instrument = m_workspace->getInstrument();
+      Instrument_const_sptr instrument = m_workspace->getInstrument();
       if(scalingFile.find(".sca")!=std::string::npos || scalingFile.find(".SCA")!=std::string::npos)
       {
           // read a .sca text format file
@@ -275,7 +275,7 @@ void SetScalingPSD::movePos(API::MatrixWorkspace_sptr& WS, std::map<int,Kernel::
   *   @param scaleMap :: A map of integer detectorID and corresponding scaling (in Y)
   */
   std::map<int,Kernel::V3D>::iterator iter = posMap.begin();
-  boost::shared_ptr<IInstrument> inst = WS->getInstrument();
+  boost::shared_ptr<Instrument> inst = WS->getInstrument();
   boost::shared_ptr<IComponent> comp;
 
   // Want to get all the detectors to move, but don't want to do this one at a time
diff --git a/Code/Mantid/Framework/DataHandling/src/UpdateInstrumentFromFile.cpp b/Code/Mantid/Framework/DataHandling/src/UpdateInstrumentFromFile.cpp
index a3333fd53989685961bd6ef0f86681defd223bfa..595d3fce3c361aeee027dd5a41b455a1dd0c61b8 100644
--- a/Code/Mantid/Framework/DataHandling/src/UpdateInstrumentFromFile.cpp
+++ b/Code/Mantid/Framework/DataHandling/src/UpdateInstrumentFromFile.cpp
@@ -3,7 +3,7 @@
 //----------------------------------------------------------------------
 #include "MantidDataHandling/UpdateInstrumentFromFile.h"
 #include "MantidDataHandling/LoadRawHelper.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidAPI/FileProperty.h"
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidAPI/SpectraDetectorMap.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/GetMaskedDetectorsTest.h b/Code/Mantid/Framework/DataHandling/test/GetMaskedDetectorsTest.h
index 464848bb39dce5d1396648f103d400c49b38b469..00687409ce41dd4c596f0b09b6b5d17333232a6a 100644
--- a/Code/Mantid/Framework/DataHandling/test/GetMaskedDetectorsTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/GetMaskedDetectorsTest.h
@@ -7,7 +7,7 @@
 #include "MantidDataHandling/MaskDetectors.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidAPI/WorkspaceFactory.h"
 #include "MantidAPI/SpectraDetectorMap.h"
 #include <vector>
@@ -69,7 +69,7 @@ public:
     marker_mask.setPropertyValue("Workspace", inputWS);
     marker_mask.setPropertyValue("DetectorList","1,3");
     marker_mask.execute();
-    boost::shared_ptr<IInstrument> instrument = space->getInstrument();
+    boost::shared_ptr<Instrument> instrument = space->getInstrument();
     TS_ASSERT( instrument->getDetector(1)->isMasked() )
     TS_ASSERT( instrument->getDetector(3)->isMasked() )
   }
diff --git a/Code/Mantid/Framework/DataHandling/test/GroupDetectors2Test.h b/Code/Mantid/Framework/DataHandling/test/GroupDetectors2Test.h
index 45177b0c4ceb757665f3faeb43cc4a6df035926c..34b4bdd0e8e2d4227291548c38a69176ff04ba7d 100644
--- a/Code/Mantid/Framework/DataHandling/test/GroupDetectors2Test.h
+++ b/Code/Mantid/Framework/DataHandling/test/GroupDetectors2Test.h
@@ -7,7 +7,7 @@
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidGeometry/Instrument/DetectorGroup.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/ArrayProperty.h"
 #include "MantidKernel/Exception.h"
 #include "MantidKernel/UnitFactory.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/GroupDetectorsTest.h b/Code/Mantid/Framework/DataHandling/test/GroupDetectorsTest.h
index 7707b85b4fb97f36029b5a2f1a6f61ed7488fb70..daf46ee52ecba75c9c9fe4f757633644db4eb53d 100644
--- a/Code/Mantid/Framework/DataHandling/test/GroupDetectorsTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/GroupDetectorsTest.h
@@ -8,7 +8,7 @@
 #include "MantidKernel/ArrayProperty.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidKernel/UnitFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidGeometry/Instrument/DetectorGroup.h"
 #include "MantidAPI/SpectraDetectorMap.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadDetectorInfoTest.h b/Code/Mantid/Framework/DataHandling/test/LoadDetectorInfoTest.h
index 429e6c233f1f5705a0a78b5fbac1516094c9974f..7b9cd5913b479ded14b687d79f6e931afe442652 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadDetectorInfoTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadDetectorInfoTest.h
@@ -8,7 +8,7 @@
 #include "MantidAPI/WorkspaceProperty.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidKernel/UnitFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidGeometry/Instrument/DetectorGroup.h"
 #include "MantidAPI/SpectraDetectorMap.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadEmptyInstrumentTest.h b/Code/Mantid/Framework/DataHandling/test/LoadEmptyInstrumentTest.h
index 1ecef8b998c1b980c6aa401ec57907d13de56af7..b9061227443668a44073b89ce10ba17fc39c6e27 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadEmptyInstrumentTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadEmptyInstrumentTest.h
@@ -5,7 +5,7 @@
 
 #include "MantidDataHandling/LoadEmptyInstrument.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
@@ -242,7 +242,7 @@ public:
     dummy = paramMap.getDouble("nickel-holder", "fjols");
     TS_ASSERT_DELTA( dummy[0], 200.0, 0.0001);
 
-    boost::shared_ptr<IInstrument> i = ws->getInstrument();
+    boost::shared_ptr<Instrument> i = ws->getInstrument();
     boost::shared_ptr<IDetector> ptrDet = i->getDetector(1008);
     TS_ASSERT_EQUALS( ptrDet->getID(), 1008);
     TS_ASSERT_EQUALS( ptrDet->getName(), "combined translation6");
@@ -252,7 +252,7 @@ public:
     TS_ASSERT_DELTA( param->value<double>(), 77.0, 0.0001);
 
     // test that can hold of "string" parameter in two ways
-    boost::shared_ptr<IComponent> ptrNickelHolder = i->getComponentByName("nickel-holder");
+    boost::shared_ptr<const IComponent> ptrNickelHolder = i->getComponentByName("nickel-holder");
     std::string dummyString = paramMap.getString(&(*ptrNickelHolder), "fjols-string");
     TS_ASSERT( dummyString.compare("boevs") == 0 );
     std::vector<std::string> dummyStringVec = paramMap.getString("nickel-holder", "fjols-string");
@@ -384,7 +384,7 @@ public:
     TS_ASSERT_DELTA( ptrDet1->getPos().Z(), 1, 0.0001);
 
     // testing r-position, t-position and p-position parameters
-    boost::shared_ptr<IComponent> ptrRTP_Test = i->getComponentByName("rtpTest1");
+    boost::shared_ptr<const IComponent> ptrRTP_Test = i->getComponentByName("rtpTest1");
     TS_ASSERT_DELTA(ptrRTP_Test->getPos().X(), 0.0, 0.0001);
     TS_ASSERT_DELTA(ptrRTP_Test->getPos().Y(), 0.0, 0.0001);
     TS_ASSERT_DELTA(ptrRTP_Test->getPos().Z(), 20.0, 0.0001);
@@ -428,7 +428,7 @@ public:
     MatrixWorkspace_sptr ws;
     ws = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName));
 
-    boost::shared_ptr<IInstrument> i = ws->getInstrument();
+    boost::shared_ptr<Instrument> i = ws->getInstrument();
 
     // check if combined translation works
     boost::shared_ptr<IDetector> ptrDet1 = i->getDetector(1001);
@@ -605,7 +605,7 @@ public:
     // get parameter map
     ParameterMap& paramMap = ws->instrumentParameters();
 
-    boost::shared_ptr<IInstrument> i = ws->getInstrument();
+    boost::shared_ptr<Instrument> i = ws->getInstrument();
     boost::shared_ptr<IDetector> det = i->getDetector(1100);  // should be a detector from bank_bsk
     Parameter_sptr param = paramMap.getRecursive(&(*det), "S", "fitting");
     const FitParameter& fitParam1 = param->value<FitParameter>();
@@ -788,7 +788,7 @@ public:
     IDetector_sptr det = ws->getDetector(1);
     TS_ASSERT_EQUALS( (det->getNumberParameter("number-of-x-pixels"))[0], 192);
 
-    IInstrument_sptr inst = ws->getInstrument();
+    Instrument_sptr inst = ws->getInstrument();
     TS_ASSERT_EQUALS( (inst->getNumberParameter("number-of-x-pixels")).size(), 1);
     TS_ASSERT_EQUALS( (inst->getNumberParameter("number-of-x-pixels"))[0], 192);
 
@@ -813,7 +813,7 @@ void testSANS2D()
     ws = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName));
 
     // get parameter map
-    boost::shared_ptr<IInstrument> i = ws->getInstrument();
+    boost::shared_ptr<Instrument> i = ws->getInstrument();
 
     double pixelLength = 0.0051;
     double bankLength = 192*pixelLength;
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadInstrumentFromRawTest.h b/Code/Mantid/Framework/DataHandling/test/LoadInstrumentFromRawTest.h
index 94969ce65c39bba51b5ec63c8919b6805e4766d8..80e38add2b2c908f5e04838107bd761b0714c49f 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadInstrumentFromRawTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadInstrumentFromRawTest.h
@@ -5,7 +5,7 @@
 
 #include "MantidDataHandling/LoadInstrumentFromRaw.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
@@ -72,7 +72,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
     TS_ASSERT_EQUALS( i->getName(), "HET     ");
     boost::shared_ptr<IComponent> source = i->getSource();
     TS_ASSERT_EQUALS( source->getName(), "Source");
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadInstrumentHelperTest.h b/Code/Mantid/Framework/DataHandling/test/LoadInstrumentHelperTest.h
index dfb60ca0870048570a7f60e19731a8f58782f245..b70beb805c76dce34d664018b71db5b4ae9dae77 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadInstrumentHelperTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadInstrumentHelperTest.h
@@ -7,7 +7,7 @@
 #include "MantidAPI/InstrumentDataService.h"
 #include "MantidGeometry/Instrument/FitParameter.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadInstrumentTest.h b/Code/Mantid/Framework/DataHandling/test/LoadInstrumentTest.h
index 6fe8a6cfc6a0cced54219217ebcd0c3ad2e83261..b9d84b18e8a6200f7420c35b9bdca3f78e36049f 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadInstrumentTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadInstrumentTest.h
@@ -13,7 +13,7 @@
 #include "MantidGeometry/Instrument/Component.h"
 #include "MantidGeometry/Instrument/FitParameter.h"
 #include "MantidGeometry/Instrument/FitParameter.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/RectangularDetector.h"
 #include "MantidKernel/Exception.h"
 #include "MantidTestHelpers/WorkspaceCreationHelper.h"
@@ -103,7 +103,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getBaseInstrument();
+    boost::shared_ptr<Instrument> i = output->getBaseInstrument();
     boost::shared_ptr<IComponent> source = i->getSource();
     TS_ASSERT_EQUALS( source->getName(), "undulator");
     TS_ASSERT_DELTA( source->getPos().Y(), 0.0,0.01);
@@ -205,7 +205,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
     boost::shared_ptr<IObjComponent> source = i->getSource();
     TS_ASSERT_EQUALS( source->getName(), "undulator");
     TS_ASSERT_DELTA( source->getPos().Z(), -17.0,0.01);
@@ -283,7 +283,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
     boost::shared_ptr<IObjComponent> source = i->getSource();
     TS_ASSERT_EQUALS( source->getName(), "undulator");
     TS_ASSERT_DELTA( source->getPos().Z(), -11.016,0.01);
@@ -345,7 +345,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
 
     boost::shared_ptr<IDetector> ptrDet = i->getDetector(20201001);
     TS_ASSERT_EQUALS( ptrDet->getName(), "det 1");
@@ -394,7 +394,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
 
     boost::shared_ptr<IDetector> ptrDetShape = i->getDetector(3100);
     TS_ASSERT_EQUALS( ptrDetShape->getName(), "Det0");
@@ -410,7 +410,7 @@ public:
     TS_ASSERT( !ptrDetShape->isValid(V3D(-0.0069,0.0227,0.011)+ptrDetShape->getPos()) );
 
     // test if a dummy parameter has been read in
-    boost::shared_ptr<IComponent> comp = i->getComponentByName("bank_90degnew");
+    boost::shared_ptr<const IComponent> comp = i->getComponentByName("bank_90degnew");
     TS_ASSERT_EQUALS( comp->getName(), "bank_90degnew");
 
     ParameterMap& paramMap = output->instrumentParameters();
@@ -458,7 +458,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
     boost::shared_ptr<IObjComponent> source = i->getSource();
     TS_ASSERT_EQUALS( source->getName(), "undulator");
     TS_ASSERT_DELTA( source->getPos().Z(), -17.0,0.01);
@@ -679,7 +679,7 @@ public:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
 
     boost::shared_ptr<IDetector> ptrDetShape = i->getDetector(1100);
     TS_ASSERT_EQUALS( ptrDetShape->getID(), 1100);
@@ -728,10 +728,10 @@ public:
       // Get back the saved workspace
       MatrixWorkspace_sptr output;
       TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
-      boost::shared_ptr<IInstrument> i = output->getInstrument();
+      boost::shared_ptr<Instrument> i = output->getInstrument();
 
       // Now the XY detector in bank1
-      boost::shared_ptr<RectangularDetector> bank1 = boost::dynamic_pointer_cast<RectangularDetector>( i->getComponentByName("bank1") );
+      boost::shared_ptr<const RectangularDetector> bank1 = boost::dynamic_pointer_cast<const RectangularDetector>( i->getComponentByName("bank1") );
       TS_ASSERT( bank1 );
       if (!bank1) return;
 
@@ -783,7 +783,7 @@ public:
 //      loaderIDF2->execute();
 //      TS_ASSERT( loaderIDF2->isExecuted() );
 //      output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName));
-//      boost::shared_ptr<IInstrument> i_new = output->getInstrument();
+//      boost::shared_ptr<Instrument> i_new = output->getInstrument();
 //      TS_ASSERT_EQUALS( i_new->getName(), "SNAP");
 //
 //      TS_ASSERT_EQUALS( i_new->nelements(), 21);
@@ -801,7 +801,7 @@ public:
 //      loaderIDF2->execute();
 //      TS_ASSERT( loaderIDF2->isExecuted() );
 //      output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName));
-//      boost::shared_ptr<IInstrument> i_old = output->getInstrument();
+//      boost::shared_ptr<Instrument> i_old = output->getInstrument();
 //      TS_ASSERT_EQUALS( i_old->getName(), "SNAPOLD");
 //
 //      std::cout << "Comparing\n";
@@ -852,7 +852,7 @@ public:
 //      loaderIDF2->execute();
 //      TS_ASSERT( loaderIDF2->isExecuted() );
 //      output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName));
-//      boost::shared_ptr<IInstrument> i_new = output->getInstrument();
+//      boost::shared_ptr<Instrument> i_new = output->getInstrument();
 //      TS_ASSERT_EQUALS( i_new->getName(), "PG3");
 //
 //      std::cout << "Loading the OLD geometry\n";
@@ -868,7 +868,7 @@ public:
 //      loaderIDF2->execute();
 //      TS_ASSERT( loaderIDF2->isExecuted() );
 //      output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName));
-//      boost::shared_ptr<IInstrument> i_old = output->getInstrument();
+//      boost::shared_ptr<Instrument> i_old = output->getInstrument();
 //      TS_ASSERT_EQUALS( i_old->getName(), "PG3OLD");
 //
 //      std::cout << "Comparing #\n";
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadLogTest.h b/Code/Mantid/Framework/DataHandling/test/LoadLogTest.h
index 924d4550dc33c317d6f44de30c4c309526847967..a2bc9494ed26a710684b3d8ec31a7e43ae5c86c0 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadLogTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadLogTest.h
@@ -5,7 +5,7 @@
 
 #include "MantidDataHandling/LoadLog.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadMuonLogTest.h b/Code/Mantid/Framework/DataHandling/test/LoadMuonLogTest.h
index 45538ee2467527eb60c77aaa98594863c886a8a3..d4a6a769a76f507d31a788cd785f963a60a13fd3 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadMuonLogTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadMuonLogTest.h
@@ -11,7 +11,7 @@
 
 #include "MantidDataHandling/LoadMuonLog.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadMuonNexus2Test.h b/Code/Mantid/Framework/DataHandling/test/LoadMuonNexus2Test.h
index 32588a455187869e43fc6aa76fecf466d76eb045..03b0375393ec0fc3a800ffdcb52259c0b33db47e 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadMuonNexus2Test.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadMuonNexus2Test.h
@@ -110,7 +110,7 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    IInstrument_sptr i = output->getInstrument();
+    Instrument_sptr i = output->getInstrument();
     Mantid::Geometry::IObjComponent_sptr source = i->getSource();
     
     Mantid::Geometry::IObjComponent_sptr samplepos = i->getSample();
@@ -327,7 +327,7 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    IInstrument_sptr i = output->getInstrument();
+    Instrument_sptr i = output->getInstrument();
     Mantid::Geometry::IObjComponent_sptr source = i->getSource();
     
     Mantid::Geometry::IObjComponent_sptr samplepos = i->getSample();
@@ -412,7 +412,7 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    IInstrument_sptr i = output->getInstrument();
+    Instrument_sptr i = output->getInstrument();
     Mantid::Geometry::IObjComponent_sptr source = i->getSource();
     
     Mantid::Geometry::IObjComponent_sptr samplepos = i->getSample();
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadNexusProcessedTest.h b/Code/Mantid/Framework/DataHandling/test/LoadNexusProcessedTest.h
index 694697c02e002f0960aaf2f8b462313e1d8abfb0..7e222281477a1a65796782962eb0eb0867cc6537 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadNexusProcessedTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadNexusProcessedTest.h
@@ -6,7 +6,7 @@
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidDataHandling/LoadInstrument.h"
 #include "MantidDataObjects/EventWorkspace.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataHandling/LoadNexusProcessed.h"
 #include "MantidDataHandling/SaveNexusProcessed.h"
 #include "SaveNexusProcessedTest.h"
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadParameterFileTest.h b/Code/Mantid/Framework/DataHandling/test/LoadParameterFileTest.h
index a529c251cd2eac5f09446612b0d4f2850ce0cb72..9647c6c4b66c6935de7ac2a3cebca4267ce0e534 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadParameterFileTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadParameterFileTest.h
@@ -7,7 +7,7 @@
 #include "MantidDataHandling/LoadInstrument.h"
 #include "MantidGeometry/Instrument/FitParameter.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
@@ -64,7 +64,7 @@ public:
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
     ParameterMap& paramMap = output->instrumentParameters();
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    boost::shared_ptr<Instrument> i = output->getInstrument();
     boost::shared_ptr<IDetector> ptrDet = i->getDetector(1008);
     TS_ASSERT_EQUALS( ptrDet->getID(), 1008);
     TS_ASSERT_EQUALS( ptrDet->getName(), "combined translation6");
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadRSaveNLoadNcspTest.h b/Code/Mantid/Framework/DataHandling/test/LoadRSaveNLoadNcspTest.h
index 8cb5c9db68f1d0c736b27d54b9866779a7386952..ce23c6d04bf3d40cf083a50a9217e5d5565f681d 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadRSaveNLoadNcspTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadRSaveNLoadNcspTest.h
@@ -135,7 +135,7 @@ void testExecOnLoadraw()
     //
     // check that the instrument data has been loaded, copied from LoadInstrumentTest
     //
-   boost::shared_ptr<IInstrument> i = output->getInstrument();
+    Instrument_const_sptr i = output->getInstrument();
     //std::cerr << "Count = " << i.use_count();
     boost::shared_ptr<IComponent> source = i->getSource();
     TS_ASSERT( source != NULL);
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadRaw2Test.h b/Code/Mantid/Framework/DataHandling/test/LoadRaw2Test.h
index 6bf12a8ed940fb10e6cb15550db547c59e74149d..37b81942f33f7d3fbc3f9f461ddb0f932edb8b1b 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadRaw2Test.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadRaw2Test.h
@@ -8,7 +8,6 @@
 #include "MantidDataObjects/ManagedWorkspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidAPI/FrameworkManager.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/TimeSeriesProperty.h"
 #include "MantidAPI/SpectraDetectorMap.h"
@@ -18,7 +17,6 @@ using namespace Mantid;
 using namespace Mantid::Kernel;
 using namespace Mantid::DataHandling;
 using namespace Mantid::DataObjects;
-using Mantid::Geometry::IInstrument;
 
 class LoadRaw2Test : public CxxTest::TestSuite
 {
@@ -82,7 +80,7 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    boost::shared_ptr<IInstrument> i = output2D->getInstrument();
+    boost::shared_ptr<Mantid::Geometry::Instrument> i = output2D->getInstrument();
     boost::shared_ptr<Mantid::Geometry::IComponent> source = i->getSource();
 
     TS_ASSERT_EQUALS( source->getName(), "undulator");
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadRaw3Test.h b/Code/Mantid/Framework/DataHandling/test/LoadRaw3Test.h
index d5744c13a3f92e61b2e28afcea53cd8f02fb27dd..b457e4577ba725717f343f51ed7175abc944b75e 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadRaw3Test.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadRaw3Test.h
@@ -8,7 +8,7 @@
 #include "MantidAPI/WorkspaceGroup.h"
 #include "MantidDataHandling/LoadRaw3.h"
 #include "MantidDataObjects/ManagedWorkspace2D.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/ConfigService.h"
 #include "MantidKernel/TimeSeriesProperty.h"
 #include <cxxtest/TestSuite.h>
@@ -82,7 +82,7 @@ public:
     //----------------------------------------------------------------------
      //Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
   //  ----------------------------------------------------------------------
-    boost::shared_ptr<IInstrument> i = output2D->getInstrument();
+    boost::shared_ptr<Instrument> i = output2D->getInstrument();
     boost::shared_ptr<Mantid::Geometry::IComponent> source = i->getSource();
 
     TS_ASSERT_EQUALS( source->getName(), "undulator");
@@ -403,7 +403,7 @@ public:
 
     Workspace2D_sptr output2D = boost::dynamic_pointer_cast<Workspace2D>(output);
 
-    boost::shared_ptr<IInstrument> i = output2D->getInstrument();
+    boost::shared_ptr<Instrument> i = output2D->getInstrument();
     Mantid::Geometry::IDetector_sptr ptrDet = i->getDetector(60);
     TS_ASSERT_EQUALS( ptrDet->getID(), 60);
 
@@ -487,7 +487,7 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    boost::shared_ptr<IInstrument> i = output2D->getInstrument();
+    boost::shared_ptr<Instrument> i = output2D->getInstrument();
     boost::shared_ptr<Mantid::Geometry::IComponent> source = i->getSource();
 
     TS_ASSERT_EQUALS( source->getName(), "undulator");
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadRawBin0Test.h b/Code/Mantid/Framework/DataHandling/test/LoadRawBin0Test.h
index 1beee5748654759fe2fb74f4b6e03db60d336d8d..2558a5d7e6c278aca1ad6641123a03983e09cd3f 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadRawBin0Test.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadRawBin0Test.h
@@ -12,7 +12,7 @@
 #include "MantidKernel/TimeSeriesProperty.h"
 #include "MantidAPI/SpectraDetectorMap.h"
 #include "MantidAPI/WorkspaceGroup.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include <Poco/Path.h>
 
 using namespace Mantid::API;
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadRawSpectrum0Test.h b/Code/Mantid/Framework/DataHandling/test/LoadRawSpectrum0Test.h
index 916a6c15d7b43a472656a3e221855b0b23a8fcc7..a0012f8f12fa5f2af3780bed5b2aa962045e1533 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadRawSpectrum0Test.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadRawSpectrum0Test.h
@@ -12,7 +12,7 @@
 #include "MantidKernel/TimeSeriesProperty.h"
 #include "MantidAPI/SpectraDetectorMap.h"
 #include "MantidAPI/WorkspaceGroup.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include <Poco/Path.h>
 
 using namespace Mantid::API;
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadRawTest.h b/Code/Mantid/Framework/DataHandling/test/LoadRawTest.h
index 0b1980361233aabfb09d9f92feb9a32caa8f6fc2..e968e00ec77bd566df6bf83ac4d5f80d0c53d8ba 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadRawTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadRawTest.h
@@ -80,7 +80,7 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    boost::shared_ptr<Mantid::Geometry::IInstrument> i = output2D->getInstrument();
+    Mantid::Geometry::Instrument_const_sptr i = output2D->getInstrument();
     boost::shared_ptr<Mantid::Geometry::IComponent> source = i->getSource();
 
     TS_ASSERT_EQUALS( source->getName(), "undulator");
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadSNSNexusTest.h b/Code/Mantid/Framework/DataHandling/test/LoadSNSNexusTest.h
index 9c7c515cc6e1d37821f1ec9bc7f58cb71229166c..d777032cfd37e27b8a2505bd4ca9a6cc4a9698da 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadSNSNexusTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadSNSNexusTest.h
@@ -60,7 +60,7 @@ public:
     TS_ASSERT_EQUALS(logs.size(),1);
 
     //------------ Instrument Loading Sub-Test -----------------------
-    IInstrument_sptr inst = ws->getInstrument();
+    Instrument_sptr inst = ws->getInstrument();
 
     TS_ASSERT_EQUALS(inst->getName(), "REF_L");
     std::map<int, Geometry::IDetector_sptr> detectors = inst->getDetectors();
diff --git a/Code/Mantid/Framework/DataHandling/test/LoadSpice2dTest.h b/Code/Mantid/Framework/DataHandling/test/LoadSpice2dTest.h
index 3fb00515262bd906f70aa80685fd9433a4e05ac0..95c170be54c3cc41cee309ff52b8f4c3fab3a9d9 100644
--- a/Code/Mantid/Framework/DataHandling/test/LoadSpice2dTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/LoadSpice2dTest.h
@@ -9,7 +9,6 @@
 
 #include "MantidDataHandling/LoadSpice2D.h"
 #include "MantidDataObjects/Workspace2D.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/Instrument/ParameterMap.h"
 #include "MantidGeometry/Instrument/Parameter.h"
 #include "MantidKernel/PropertyWithValue.h"
@@ -103,14 +102,14 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    boost::shared_ptr<Mantid::Geometry::IInstrument> i = ws2d->getInstrument();
+    Mantid::Geometry::Instrument_const_sptr i = ws2d->getInstrument();
     boost::shared_ptr<Mantid::Geometry::IComponent> source = i->getSource();
 
     TS_ASSERT_EQUALS( i->getName(), "GPSANS");
     TS_ASSERT_EQUALS( source->getName(), "source");
 
     // Check parameters for sample aperture
-    boost::shared_ptr<Mantid::Geometry::IComponent> sample_aperture = i->getComponentByName("sample_aperture");
+    Mantid::Geometry::IComponent_const_sptr sample_aperture = i->getComponentByName("sample_aperture");
     TS_ASSERT_EQUALS( sample_aperture->getNumberParameter("Size")[0], 14.0);
 
     // Check parameter map access
diff --git a/Code/Mantid/Framework/DataHandling/test/ManagedRawFileWorkspace2DTest.h b/Code/Mantid/Framework/DataHandling/test/ManagedRawFileWorkspace2DTest.h
index f2dfc6eba58144cdf87e986022d639744ad81ad3..906ff57147ef63f4535dee04a640ec20afa22ade 100644
--- a/Code/Mantid/Framework/DataHandling/test/ManagedRawFileWorkspace2DTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/ManagedRawFileWorkspace2DTest.h
@@ -150,7 +150,7 @@ public:
     //----------------------------------------------------------------------
     // Tests taken from LoadInstrumentTest to check sub-algorithm is running properly
     //----------------------------------------------------------------------
-    boost::shared_ptr<Mantid::Geometry::IInstrument> i = output2D->getInstrument();
+    boost::shared_ptr<Mantid::Geometry::Instrument> i = output2D->getInstrument();
     boost::shared_ptr<Mantid::Geometry::IComponent> source = i->getSource();
 
     TS_ASSERT_EQUALS( source->getName(), "undulator");
diff --git a/Code/Mantid/Framework/DataHandling/test/MaskDetectorsInShapeTest.h b/Code/Mantid/Framework/DataHandling/test/MaskDetectorsInShapeTest.h
index f319646affa0ef26d59abad46154fae32fe2906e..fe01f99c1cb508bcb716aedc1931a95a88f5bf72 100644
--- a/Code/Mantid/Framework/DataHandling/test/MaskDetectorsInShapeTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/MaskDetectorsInShapeTest.h
@@ -81,7 +81,7 @@ public:
   {
     //check that the detectors have actually been marked dead
     std::vector<int> expectedDetectorArray = convertStringToVector(expectedHits);
-    Mantid::Geometry::IInstrument_const_sptr i = outWS->getInstrument();
+    Mantid::Geometry::Instrument_const_sptr i = outWS->getInstrument();
     for (std::vector<int>::iterator it = expectedDetectorArray.begin(); it!=expectedDetectorArray.end(); ++it)
     {
       TS_ASSERT( i->getDetector((*it))->isMasked() )
diff --git a/Code/Mantid/Framework/DataHandling/test/MaskDetectorsTest.h b/Code/Mantid/Framework/DataHandling/test/MaskDetectorsTest.h
index 6a5f5532c1930134c82d76aff2718637f3856646..1e4ba13107921c5181ecad656eaae11f751ca8fa 100644
--- a/Code/Mantid/Framework/DataHandling/test/MaskDetectorsTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/MaskDetectorsTest.h
@@ -8,7 +8,7 @@
 #include "MantidKernel/ArrayProperty.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidDataObjects/EventWorkspace.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
 #include "MantidAPI/FrameworkManager.h"
 #include "MantidAPI/WorkspaceFactory.h"
@@ -164,7 +164,6 @@ public:
     TS_ASSERT_EQUALS( outputWS->dataE(3)[0], zeroes );
     TS_ASSERT_EQUALS( outputWS->dataY(4)[0], ones );
     TS_ASSERT_EQUALS( outputWS->dataE(4)[0], ones );
-    boost::shared_ptr<IInstrument> i = outputWS->getInstrument();
     TS_ASSERT( outputWS->getDetector(0)->isMasked() );
     TS_ASSERT( ! outputWS->getDetector(1)->isMasked() );
     TS_ASSERT( outputWS->getDetector(2)->isMasked() );
diff --git a/Code/Mantid/Framework/DataHandling/test/MoveInstrumentComponentTest.h b/Code/Mantid/Framework/DataHandling/test/MoveInstrumentComponentTest.h
index 3f1800a669b85a235265e1b72d6e5203a3b0cf3e..8c57c4cd29dd51dcd1ba396ef934b2b6e2ecf47d 100644
--- a/Code/Mantid/Framework/DataHandling/test/MoveInstrumentComponentTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/MoveInstrumentComponentTest.h
@@ -5,7 +5,7 @@
 
 #include "MantidDataHandling/MoveInstrumentComponent.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidKernel/Exception.h"
@@ -65,7 +65,7 @@ public:
       mover.setPropertyValue("Z","30");
       mover.execute();
 
-      IInstrument_sptr inst = WS->getInstrument();
+      Instrument_sptr inst = WS->getInstrument();
       // get pointer to the first detector in the bank
       boost::shared_ptr<IComponent> comp = (*boost::dynamic_pointer_cast<ICompAssembly>(
                                               (*boost::dynamic_pointer_cast<ICompAssembly>(inst))[0]))[0];
@@ -87,7 +87,7 @@ public:
       mover.setPropertyValue("RelativePosition","0");
       mover.execute();
 
-      IInstrument_sptr inst = WS->getInstrument();
+      Instrument_sptr inst = WS->getInstrument();
       // get pointer to the first detector in the bank
       boost::shared_ptr<IComponent> comp = (*boost::dynamic_pointer_cast<ICompAssembly>(
                                               (*boost::dynamic_pointer_cast<ICompAssembly>(inst))[0]))[0];
@@ -108,7 +108,7 @@ public:
     mover.setPropertyValue("RelativePosition","0");
     mover.execute();
 
-    IInstrument_sptr inst = WS->getInstrument();
+    Instrument_sptr inst = WS->getInstrument();
     // get pointer to the first detector in the bank
     boost::shared_ptr<IComponent> comp = (*boost::dynamic_pointer_cast<ICompAssembly>((*boost::dynamic_pointer_cast<ICompAssembly>(inst))[0]))[0];
 
diff --git a/Code/Mantid/Framework/DataHandling/test/SaveCalFileTest.h b/Code/Mantid/Framework/DataHandling/test/SaveCalFileTest.h
index 425d536f627f665896a9c0f9de3ce6186758ed9c..9c906b19b73d61b2816bc242d95ab2a7f3fa9559 100644
--- a/Code/Mantid/Framework/DataHandling/test/SaveCalFileTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/SaveCalFileTest.h
@@ -38,7 +38,7 @@ public:
   void test_exec()
   {
     // --- Get an instrument -----
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5, false);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5, false);
 
     // --- Make up some data ----
     GroupingWorkspace_sptr groupWS(new GroupingWorkspace(inst));
diff --git a/Code/Mantid/Framework/DataHandling/test/SaveDspacemapTest.h b/Code/Mantid/Framework/DataHandling/test/SaveDspacemapTest.h
index c1d5fbffa23878854cf8baad8b65cdc03da83a61..62b0ad7dbe0777623ee9a035a14ae28c2f3c1d37 100644
--- a/Code/Mantid/Framework/DataHandling/test/SaveDspacemapTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/SaveDspacemapTest.h
@@ -4,7 +4,6 @@
 #include "MantidDataHandling/SaveDspacemap.h"
 #include "MantidDataHandling/LoadDspacemap.h"
 #include "MantidDataObjects/OffsetsWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/System.h"
 #include "MantidKernel/Timer.h"
 #include "MantidTestHelpers/ComponentCreationHelper.h"
@@ -16,7 +15,7 @@
 using namespace Mantid::DataHandling;
 using namespace Mantid::API;
 using namespace Mantid::DataObjects;
-using Mantid::Geometry::IInstrument_sptr;
+using Mantid::Geometry::Instrument_sptr;
 
 class SaveDspacemapTest : public CxxTest::TestSuite
 {
@@ -41,7 +40,7 @@ public:
     // Name of the output workspace.
     std::string filename("./SaveDspacemapTest_Output.dat");
 
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
     OffsetsWorkspace_sptr offsetsWS(new OffsetsWorkspace(inst));
     offsetsWS->setValue(1,0.10);
     offsetsWS->setValue(2,0.20);
@@ -84,7 +83,7 @@ public:
   {
     std::string filename("./SaveDspacemapTest_Output.dat");
 
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
     OffsetsWorkspace_sptr offsetsWS(new OffsetsWorkspace(inst));
     offsetsWS->setValue(1,0.10);
     offsetsWS->setValue(2,0.20);
diff --git a/Code/Mantid/Framework/DataHandling/test/UpdateInstrumentFromFileTest.h b/Code/Mantid/Framework/DataHandling/test/UpdateInstrumentFromFileTest.h
index 5f7219090dfa70bcd3b4f2ffab9cc800f109baa0..4ec1417e43f3c5bb1232909a3512c64b2a4ba62c 100644
--- a/Code/Mantid/Framework/DataHandling/test/UpdateInstrumentFromFileTest.h
+++ b/Code/Mantid/Framework/DataHandling/test/UpdateInstrumentFromFileTest.h
@@ -8,7 +8,7 @@
 #include "MantidDataHandling/LoadInstrument.h"
 #include "MantidAPI/InstrumentDataService.h"
 #include "MantidAPI/WorkspaceFactory.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidDataObjects/Workspace2D.h"
 #include "MantidAPI/Algorithm.h"
 
@@ -74,7 +74,7 @@ private:
     MatrixWorkspace_sptr output;
     TS_ASSERT_THROWS_NOTHING(output = boost::dynamic_pointer_cast<MatrixWorkspace>(AnalysisDataService::Instance().retrieve(wsName)));
 
-    boost::shared_ptr<IInstrument> i = output->getInstrument();
+    Instrument_const_sptr i = output->getInstrument();
 
     boost::shared_ptr<IDetector> ptrDet = i->getDetector(3100);
     TS_ASSERT_EQUALS( ptrDet->getName(), "Det0");
diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h
index 5c0c703ea03cdf8aedf79027969ebb7ec58c4606..b1baa866053b66b126a89a55cd031ff1a65e559a 100644
--- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h
+++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/GroupingWorkspace.h
@@ -25,7 +25,7 @@ namespace DataObjects
   class DLLExport GroupingWorkspace : public SpecialWorkspace2D
   {
   public:
-    GroupingWorkspace(Mantid::Geometry::IInstrument_sptr inst);
+    GroupingWorkspace(Geometry::Instrument_sptr inst);
     GroupingWorkspace();
     ~GroupingWorkspace();
     
diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h
index d44418d5ff705a6af75ef36d6920190206a542dd..7abd2f773c4bff89f4c4761f2d70d9977329edf7 100644
--- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h
+++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/OffsetsWorkspace.h
@@ -5,7 +5,6 @@
 #include "MantidAPI/SpectraDetectorMap.h"
 #include "MantidDataObjects/SpecialWorkspace2D.h"
 #include "MantidDataObjects/Workspace2D.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/System.h"
 
 
@@ -25,7 +24,7 @@ namespace DataObjects
   {
   public:
     OffsetsWorkspace();
-    OffsetsWorkspace(Mantid::Geometry::IInstrument_sptr inst);
+    OffsetsWorkspace(Geometry::Instrument_sptr inst);
     ~OffsetsWorkspace();
     
     /** Gets the name of the workspace type
diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/Peak.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/Peak.h
index fbdf0a8943351d16006ca96b4d84dceaaf856c58..d346c62e88f36edbae073b06e6e36b6c4ef52092 100644
--- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/Peak.h
+++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/Peak.h
@@ -2,7 +2,7 @@
 #define MANTID_DATAOBJECTS_PEAK_H_
 
 #include "MantidAPI/IPeak.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/Matrix.h"
 #include "MantidKernel/V3D.h"
 #include "MantidKernel/PhysicalConstants.h"
@@ -25,23 +25,23 @@ namespace DataObjects
     /// Allow PeakColumn class to directly access members.
     friend class PeakColumn;
 
-    Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, Mantid::Kernel::V3D QLabFrame, double detectorDistance=1.0);
-    Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, Mantid::Kernel::V3D QSampleFrame, Mantid::Kernel::Matrix<double> goniometer, double detectorDistance=1.0);
-    Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength);
-    Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL);
-    Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL, Mantid::Kernel::Matrix<double> goniometer);
+    Peak(Geometry::Instrument_const_sptr m_inst, Mantid::Kernel::V3D QLabFrame, double detectorDistance=1.0);
+    Peak(Geometry::Instrument_const_sptr m_inst, Mantid::Kernel::V3D QSampleFrame, Mantid::Kernel::Matrix<double> goniometer, double detectorDistance=1.0);
+    Peak(Geometry::Instrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength);
+    Peak(Geometry::Instrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL);
+    Peak(Geometry::Instrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL, Mantid::Kernel::Matrix<double> goniometer);
 
     // Copy constructor is compiler-provided.
     Peak(const Peak & other);
     Peak(const API::IPeak & ipeak);
     virtual ~Peak();
 
-    void setInstrument(Mantid::Geometry::IInstrument_const_sptr inst);
+    void setInstrument(Geometry::Instrument_const_sptr inst);
 
     int getDetectorID() const;
     void setDetectorID(int m_DetectorID);
-    Mantid::Geometry::IDetector_const_sptr getDetector() const;
-    Mantid::Geometry::IInstrument_const_sptr getInstrument() const;
+    Geometry::IDetector_const_sptr getDetector() const;
+    Geometry::Instrument_const_sptr getInstrument() const;
 
     bool findDetector();
 
@@ -96,10 +96,10 @@ namespace DataObjects
 
   protected:
     /// Shared pointer to the instrument (for calculating some values )
-    Mantid::Geometry::IInstrument_const_sptr m_inst;
+    Geometry::Instrument_const_sptr m_inst;
 
     /// Detector pointed to
-    Mantid::Geometry::IDetector_const_sptr m_det;
+    Geometry::IDetector_const_sptr m_det;
 
     /// Name of the parent bank
     std::string m_BankName;
diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/PeaksWorkspace.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/PeaksWorkspace.h
index 0c8e11b1e1ad4b8277732a9f1b5311599e0d57dc..1f22e68234889a10365ac07cae9d73018320b6ee 100644
--- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/PeaksWorkspace.h
+++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/PeaksWorkspace.h
@@ -11,7 +11,7 @@
 #include "MantidDataObjects/Peak.h"
 #include "MantidDataObjects/PeakColumn.h"
 #include "MantidDataObjects/TableWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/DateAndTime.h"
 #include "MantidKernel/Exception.h"
 #include "MantidKernel/Logger.h"
@@ -75,7 +75,7 @@ namespace DataObjects
 
     boost::shared_ptr<PeaksWorkspace> clone();
 
-    void appendFile( std::string filename, Mantid::Geometry::IInstrument_sptr inst);
+    void appendFile( std::string filename, Geometry::Instrument_sptr inst);
 
     //---------------------------------------------------------------------------------------------
     /** @return the number of peaks
@@ -130,8 +130,7 @@ namespace DataObjects
      */
     API::IPeak* createPeak(Kernel::V3D QLabFrame, double detectorDistance=1.0)
     {
-      Mantid::Geometry::IInstrument_const_sptr inst = this->getInstrument();
-      return new Peak(inst, QLabFrame, detectorDistance);
+      return new Peak(this->getInstrument(), QLabFrame, detectorDistance);
     }
 
     //---------------------------------------------------------------------------------------------
diff --git a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h
index 9a7bccc1c39dda1fed2fdd6c928236acf8cd0f2e..bbccfc3defbfff266133e1fc4e64aea39f0bd05c 100644
--- a/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h
+++ b/Code/Mantid/Framework/DataObjects/inc/MantidDataObjects/SpecialWorkspace2D.h
@@ -5,7 +5,7 @@
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidAPI/SpectraDetectorMap.h"
 #include "MantidDataObjects/Workspace2D.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/System.h"
 
 
@@ -28,7 +28,7 @@ namespace DataObjects
   {
   public:
     SpecialWorkspace2D();
-    SpecialWorkspace2D(Mantid::Geometry::IInstrument_sptr inst);
+    SpecialWorkspace2D(Geometry::Instrument_sptr inst);
     ~SpecialWorkspace2D();
     
     /** Gets the name of the workspace type
diff --git a/Code/Mantid/Framework/DataObjects/src/GroupingWorkspace.cpp b/Code/Mantid/Framework/DataObjects/src/GroupingWorkspace.cpp
index cfda44a007ed0f166fab2af24710821fb04b172f..3efb0f7e8bfb4a76f0532fbeacdd44ebfb754427 100644
--- a/Code/Mantid/Framework/DataObjects/src/GroupingWorkspace.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/GroupingWorkspace.cpp
@@ -30,7 +30,7 @@ namespace DataObjects
    * @param inst :: input instrument that is the base for this workspace
    * @return created GroupingWorkspace
    */
-  GroupingWorkspace::GroupingWorkspace(Mantid::Geometry::IInstrument_sptr inst)
+  GroupingWorkspace::GroupingWorkspace(Geometry::Instrument_sptr inst)
   : SpecialWorkspace2D(inst)
   {
   }
diff --git a/Code/Mantid/Framework/DataObjects/src/ManagedDataBlock2D.cpp b/Code/Mantid/Framework/DataObjects/src/ManagedDataBlock2D.cpp
index 8fe7bef43aba13413fccc04ee57433ae2ac59d43..2d8ab2660d415c0af41dc5146ae786376101d6bf 100644
--- a/Code/Mantid/Framework/DataObjects/src/ManagedDataBlock2D.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/ManagedDataBlock2D.cpp
@@ -173,7 +173,6 @@ std::fstream& operator<<(std::fstream& fs, ManagedDataBlock2D& data)
       ManagedDataBlock2D::g_log.warning() << "E vector resized to " << data.m_YLength << " elements.";
     }
     fs.write(reinterpret_cast<char *>(&(it->directDataE().front())), data.m_YLength * sizeof(double));
-    // N.B. ErrorHelper member not stored to file so will always be Gaussian default
     
     // Clear the "dirty" flag since it was just written out.
     it->setDirty(false);
@@ -201,7 +200,6 @@ std::fstream& operator>>(std::fstream& fs, ManagedDataBlock2D& data)
     fs.read(reinterpret_cast<char *>(&(it->directDataE().front())), data.m_YLength * sizeof(double));
     // Yes, it is loaded
     it->setLoaded(true);
-    // N.B. ErrorHelper member not stored to file so will always be Gaussian default
   }
   return fs;
 }
diff --git a/Code/Mantid/Framework/DataObjects/src/ManagedWorkspace2D.cpp b/Code/Mantid/Framework/DataObjects/src/ManagedWorkspace2D.cpp
index c6389f9b21ed6dcbd90b2b8a5d66818950b64925..412a8d59f492d1e111689f6cff1ee788159c7e84 100644
--- a/Code/Mantid/Framework/DataObjects/src/ManagedWorkspace2D.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/ManagedWorkspace2D.cpp
@@ -215,6 +215,9 @@ void ManagedWorkspace2D::readDataBlock(ManagedDataBlock2D *newBlock,size_t start
  */
 void ManagedWorkspace2D::writeDataBlock(ManagedDataBlock2D *toWrite) const
 {
+  std::cout << "Writing " << toWrite->minIndex() << std::endl;
+  std::cout << ">>> " << m_indexWrittenTo << std::endl;
+  std::cout << ">>> " << m_vectorsPerBlock << std::endl;
   size_t fileIndex = 0;
   // Check whether we need to pad file with zeroes before writing data
   if ( toWrite->minIndex() > static_cast<int>(m_indexWrittenTo+m_vectorsPerBlock) && m_indexWrittenTo >= 0 )
@@ -239,10 +242,11 @@ void ManagedWorkspace2D::writeDataBlock(ManagedDataBlock2D *toWrite) const
       m_datafile[fileIndex]->write((char *) &*yzeroes.begin(), m_YLength * sizeof(double));
       m_datafile[fileIndex]->write((char *) &speczero, sizeof(int) );
     }
+    std::cout << "Here!!!!" << std::endl;
   }
   else
-    // If no padding needed, go to correct place in file
-    {
+  // If no padding needed, go to correct place in file
+  {
     long long seekPoint = toWrite->minIndex() * m_vectorSize;
 
     while (seekPoint > std::numeric_limits<int>::max())
@@ -254,7 +258,8 @@ void ManagedWorkspace2D::writeDataBlock(ManagedDataBlock2D *toWrite) const
     // Safe to cast seekPoint to int because the while loop above guarantees that
     // it'll be in range by this point.
     m_datafile[fileIndex]->seekp(static_cast<int>(seekPoint), std::ios::beg);
-    }
+    std::cout << "Now here!!!!" << std::endl;
+  }
 
   *m_datafile[fileIndex] << *toWrite;
   m_indexWrittenTo = std::max(m_indexWrittenTo, toWrite->minIndex());
diff --git a/Code/Mantid/Framework/DataObjects/src/OffsetsWorkspace.cpp b/Code/Mantid/Framework/DataObjects/src/OffsetsWorkspace.cpp
index f05dfd506a9be79485c9fd732dc7f7432fe3370e..641b06686c9b7816ce4a61496f78d54848e5a5bb 100644
--- a/Code/Mantid/Framework/DataObjects/src/OffsetsWorkspace.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/OffsetsWorkspace.cpp
@@ -27,7 +27,7 @@ namespace DataObjects
    * @param inst :: input instrument that is the base for this workspace
    * @return created OffsetsWorkspace
    */
-  OffsetsWorkspace::OffsetsWorkspace(Mantid::Geometry::IInstrument_sptr inst)
+  OffsetsWorkspace::OffsetsWorkspace(Geometry::Instrument_sptr inst)
   : SpecialWorkspace2D(inst)
   {
   }
diff --git a/Code/Mantid/Framework/DataObjects/src/Peak.cpp b/Code/Mantid/Framework/DataObjects/src/Peak.cpp
index 28577122ca647103814ee22e314ea1d87c762a1b..dde9f75c8a9f96b7aa625a908fb3323c175903a2 100644
--- a/Code/Mantid/Framework/DataObjects/src/Peak.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/Peak.cpp
@@ -22,7 +22,7 @@ namespace DataObjects
    * @param detectorDistance :: distance between the sample and the detector.
    *        Used to give a valid TOF. Default 1.0 meters.
    */
-  Peak::Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, Mantid::Kernel::V3D QLabFrame, double detectorDistance)
+  Peak::Peak(Geometry::Instrument_const_sptr m_inst, Mantid::Kernel::V3D QLabFrame, double detectorDistance)
   : m_H(0), m_K(0), m_L(0),
     m_Intensity(0), m_SigmaIntensity(0), m_BinCount(0),
     m_GoniometerMatrix(3,3,true),
@@ -45,7 +45,7 @@ namespace DataObjects
    * @param detectorDistance :: distance between the sample and the detector.
    *        Used to give a valid TOF. Default 1.0 meters.
    */
-  Peak::Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, Mantid::Kernel::V3D QSampleFrame,
+  Peak::Peak(Geometry::Instrument_const_sptr m_inst, Mantid::Kernel::V3D QSampleFrame,
       Mantid::Kernel::Matrix<double> goniometer, double detectorDistance)
   : m_H(0), m_K(0), m_L(0),
     m_Intensity(0), m_SigmaIntensity(0), m_BinCount(0),
@@ -68,7 +68,7 @@ namespace DataObjects
    * @param m_Wavelength :: incident neutron wavelength, in Angstroms
    * @return
    */
-  Peak::Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength)
+  Peak::Peak(Geometry::Instrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength)
   : m_H(0), m_K(0), m_L(0),
     m_Intensity(0), m_SigmaIntensity(0), m_BinCount(0),
     m_GoniometerMatrix(3,3,true),
@@ -90,7 +90,7 @@ namespace DataObjects
    * @param HKL :: vector with H,K,L position of the peak
    * @return
    */
-  Peak::Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL)
+  Peak::Peak(Geometry::Instrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL)
   : m_H(HKL[0]), m_K(HKL[1]), m_L(HKL[2]),
     m_Intensity(0), m_SigmaIntensity(0), m_BinCount(0),
     m_GoniometerMatrix(3,3,true),
@@ -112,7 +112,7 @@ namespace DataObjects
    * @param goniometer :: a 3x3 rotation matrix
    * @return
    */
-  Peak::Peak(Mantid::Geometry::IInstrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL, Mantid::Kernel::Matrix<double> goniometer) :
+  Peak::Peak(Geometry::Instrument_const_sptr m_inst, int m_DetectorID, double m_Wavelength, Mantid::Kernel::V3D HKL, Mantid::Kernel::Matrix<double> goniometer) :
     m_H(HKL[0]), m_K(HKL[1]), m_L(HKL[2]),
     m_Intensity(0), m_SigmaIntensity(0), m_BinCount(0),
     m_GoniometerMatrix(goniometer),
@@ -215,7 +215,7 @@ namespace DataObjects
    *
    * @param inst :: Instrument sptr to use
    */
-  void Peak::setInstrument(Mantid::Geometry::IInstrument_const_sptr inst)
+  void Peak::setInstrument(Geometry::Instrument_const_sptr inst)
   {
     m_inst = inst;
     if (!inst) throw std::runtime_error("Peak::setInstrument(): No instrument is set!");
@@ -451,9 +451,9 @@ namespace DataObjects
     beam.normalize();
 
     // Create a ray tracer
-    InstrumentRayTracer tracker( boost::const_pointer_cast<IInstrument>(m_inst) );
+    InstrumentRayTracer tracker( boost::const_pointer_cast<Instrument>(m_inst) );
     tracker.traceFromSample(beam);
-    IDetector_sptr det = tracker.getDetectorResult();
+    IDetector_const_sptr det = tracker.getDetectorResult();
     if (det)
     {
       // Set the detector ID, the row, col, etc.
@@ -469,12 +469,10 @@ namespace DataObjects
 
   //----------------------------------------------------------------------------------------------
   /** Return a shared ptr to the detector at center of peak. */
-  Mantid::Geometry::IDetector_const_sptr Peak::getDetector() const
-  {    return m_det;  }
+  Geometry::IDetector_const_sptr Peak::getDetector() const { return m_det; }
 
   /** Return a shared ptr to the instrument for this peak. */
-  Mantid::Geometry::IInstrument_const_sptr Peak::getInstrument() const
-  {    return m_inst;  }
+  Geometry::Instrument_const_sptr Peak::getInstrument() const { return m_inst; }
 
   //----------------------------------------------------------------------------------------------
   /** Return the run number this peak was measured at. */
diff --git a/Code/Mantid/Framework/DataObjects/src/SpecialWorkspace2D.cpp b/Code/Mantid/Framework/DataObjects/src/SpecialWorkspace2D.cpp
index 8e114b2672ce310ec882f2e5b8c90898fb827444..8871a7ee749c79544f39b2f20b713af45f6528eb 100644
--- a/Code/Mantid/Framework/DataObjects/src/SpecialWorkspace2D.cpp
+++ b/Code/Mantid/Framework/DataObjects/src/SpecialWorkspace2D.cpp
@@ -30,7 +30,7 @@ namespace DataObjects
    * @param inst :: input instrument that is the base for this workspace
    * @return created SpecialWorkspace2D
    */
-  SpecialWorkspace2D::SpecialWorkspace2D(Mantid::Geometry::IInstrument_sptr inst)
+  SpecialWorkspace2D::SpecialWorkspace2D(Geometry::Instrument_sptr inst)
   {
     // Get all the detectors IDs
     detectorIDs = inst->getDetectorIDs(true /*no monitors*/);
diff --git a/Code/Mantid/Framework/DataObjects/test/GroupingWorkspaceTest.h b/Code/Mantid/Framework/DataObjects/test/GroupingWorkspaceTest.h
index 4a614b5042d65baecf90a5dcd6392f56a07413fa..24bc49b9988e9d6331c32c7009dcd59dd8fbd68e 100644
--- a/Code/Mantid/Framework/DataObjects/test/GroupingWorkspaceTest.h
+++ b/Code/Mantid/Framework/DataObjects/test/GroupingWorkspaceTest.h
@@ -33,7 +33,7 @@ public:
   void test_constructor_from_Instrument()
   {
     // Fake instrument with 5*9 pixels with ID starting at 1
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
 
     GroupingWorkspace_sptr ws(new GroupingWorkspace(inst));
 
diff --git a/Code/Mantid/Framework/DataObjects/test/ManagedWorkspace2DTest.h b/Code/Mantid/Framework/DataObjects/test/ManagedWorkspace2DTest.h
index 26ea8050b53d3ac1b7292b96dc0e33ec431b6031..f2eca83484f649e1ecd99974975f89e2b43eb838 100644
--- a/Code/Mantid/Framework/DataObjects/test/ManagedWorkspace2DTest.h
+++ b/Code/Mantid/Framework/DataObjects/test/ManagedWorkspace2DTest.h
@@ -296,6 +296,48 @@ public:
     }
   }
 
+  void testPadding()
+  {
+    std::cout << "Start!!!!" << std::endl;
+
+    // This will make sure 1 ManagedDataBlock = 1 Vector
+    Mantid::Kernel::ConfigServiceImpl& conf = Mantid::Kernel::ConfigService::Instance();
+    const std::string blocksize = "ManagedWorkspace.DataBlockSize";
+    const std::string oldValue = conf.getString(blocksize);
+    conf.setString(blocksize,"1");
+
+    Mantid::DataObjects::ManagedWorkspace2D ws;
+    ws.initialize(111,10,9);
+
+    MantidVec fours(10,4.0);
+    MantidVec fives(9,5.0);
+    MantidVec sixes(9,6.0);
+    for ( std::size_t i = 10; i < ws.getNumberHistograms(); ++i )
+    {
+      ws.dataX(i) = fours;
+      ws.dataY(i) = fives;
+      ws.dataE(i) = sixes;
+    }
+
+    // Get back a block that should have gone out to disk and check its values
+    MantidVec xvals = ws.dataX(10);
+    MantidVec yvals = ws.dataY(10);
+    MantidVec evals = ws.dataE(10);
+    TS_ASSERT_EQUALS( xvals.size(), 10 );
+    TS_ASSERT_EQUALS( yvals.size(), 9 );
+    TS_ASSERT_EQUALS( evals.size(), 9 );
+    for ( std::size_t j = 0; j < 9; ++j )
+    {
+      TS_ASSERT_EQUALS( xvals[j], 4.0 );
+      TS_ASSERT_EQUALS( yvals[j], 5.0 );
+      TS_ASSERT_EQUALS( evals[j], 6.0 );
+    }
+    TS_ASSERT_EQUALS( xvals.back(), 4.0 );
+
+    conf.setString(blocksize,oldValue);
+    std::cout << "End!!!!" << std::endl;
+  }
+
   void testDestructor()
   {
     std::string filename;
@@ -330,13 +372,12 @@ public:
 
   ManagedWorkspace2DTestPerformance()
   {
-    // Try to make the input workspace NOT managed if you can help it
+    // Make sure the input workspace is NOT managed
     Mantid::Kernel::ConfigServiceImpl& conf = Mantid::Kernel::ConfigService::Instance();
-    conf.setString("ManagedWorkspace.LowerMemoryLimit","90");
-    // 1 MB block size
-    conf.setString("ManagedWorkspace.DataBlockSize", "1000000");
+    conf.setString("ManagedWorkspace.AlwaysInMemory","1");
     // Workspace should use up around 800 MB of memory
     inWS = Mantid::API::WorkspaceFactory::Instance().create("Workspace2D",7000,5000,5000);
+    conf.setString("ManagedWorkspace.AlwaysInMemory","0");
   }
 
   // This should take ~no time (nothing should be written to disk)
@@ -350,6 +391,8 @@ public:
     const std::string managed2 = "ManagedRawFileWorkspace.DoNotUse";
     const std::string oldValue2 = conf.getString(managed2);
     conf.setString(managed2,"0");
+    // 1 MB block size
+    conf.setString("ManagedWorkspace.DataBlockSize", "1000000");
 
     Mantid::Kernel::MemoryStats stats;
     stats.update();
diff --git a/Code/Mantid/Framework/DataObjects/test/PeakTest.h b/Code/Mantid/Framework/DataObjects/test/PeakTest.h
index f070e55bffd845f625d7dc1ed2ee30981aad101b..0a5970eda41f4624f7af034b3b6076d36d5bfe93 100644
--- a/Code/Mantid/Framework/DataObjects/test/PeakTest.h
+++ b/Code/Mantid/Framework/DataObjects/test/PeakTest.h
@@ -18,7 +18,7 @@ class PeakTest : public CxxTest::TestSuite
 {
 public:
   /// Common instrument
-  IInstrument_sptr inst;
+  Instrument_sptr inst;
   void setUp()
   {
     inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 100);
diff --git a/Code/Mantid/Framework/DataObjects/test/PeaksWorkspaceTest.h b/Code/Mantid/Framework/DataObjects/test/PeaksWorkspaceTest.h
index eb9f2740e1fe0066309f46d4c6ff129159e3a470..320570ccc02a5101ee4d0f9fb9dd47f872b3706f 100644
--- a/Code/Mantid/Framework/DataObjects/test/PeaksWorkspaceTest.h
+++ b/Code/Mantid/Framework/DataObjects/test/PeaksWorkspaceTest.h
@@ -31,7 +31,7 @@ public:
    */
   PeaksWorkspace * buildPW()
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(1, 10);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(1, 10);
     inst->setName("SillyInstrument");
     PeaksWorkspace * pw = new PeaksWorkspace();
     pw->setInstrument(inst);
diff --git a/Code/Mantid/Framework/DataObjects/test/SpecialWorkspace2DTest.h b/Code/Mantid/Framework/DataObjects/test/SpecialWorkspace2DTest.h
index 8df41b44403cb543ff697416d8e80681d2a9be79..42719b229483bb9f69efedcdd977f10f4c517297 100644
--- a/Code/Mantid/Framework/DataObjects/test/SpecialWorkspace2DTest.h
+++ b/Code/Mantid/Framework/DataObjects/test/SpecialWorkspace2DTest.h
@@ -35,7 +35,7 @@ public:
   void test_constructor_from_Instrument()
   {
     // Fake instrument with 5*9 pixels with ID starting at 1
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
     SpecialWorkspace2D_sptr ws(new SpecialWorkspace2D(inst));
 
     TS_ASSERT_EQUALS( ws->getNumberHistograms(), 45);
@@ -50,7 +50,7 @@ public:
 
   void test_setValue_getValue()
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
     SpecialWorkspace2D_sptr ws(new SpecialWorkspace2D(inst));
 
     TS_ASSERT_DIFFERS( ws->getValue(1), 12.3 );
diff --git a/Code/Mantid/Framework/Geometry/CMakeLists.txt b/Code/Mantid/Framework/Geometry/CMakeLists.txt
index 8b2a94ecb06f61a0e1dd709fd092fc9c90b5a593..40323c9d85e6e9077636f64630d4853e8c5d05b0 100644
--- a/Code/Mantid/Framework/Geometry/CMakeLists.txt
+++ b/Code/Mantid/Framework/Geometry/CMakeLists.txt
@@ -4,7 +4,7 @@ set ( SRC_FILES
 	src/Crystal/ReflectionCondition.cpp
 	src/Crystal/UnitCell.cpp
 	src/IDetector.cpp
-	src/IInstrument.cpp
+  src/Instrument.cpp
 	src/IObjComponent.cpp
 	src/Instrument/CompAssembly.cpp
 	src/Instrument/Component.cpp
@@ -12,7 +12,6 @@ set ( SRC_FILES
 	src/Instrument/DetectorGroup.cpp
 	src/Instrument/FitParameter.cpp
 	src/Instrument/Goniometer.cpp
-	src/Instrument/Instrument.cpp
 	src/Instrument/NearestNeighbours.cpp
 	src/Instrument/ObjCompAssembly.cpp
 	src/Instrument/ObjComponent.cpp
@@ -22,7 +21,6 @@ set ( SRC_FILES
 	src/Instrument/ParameterMap.cpp
 	src/Instrument/RectangularDetector.cpp
 	src/Instrument/XMLlogfile.cpp
-	src/InstrumentRayTracer.cpp
 	src/MDGeometry/Coordinate.cpp
 	src/MDGeometry/IMDDimension.cpp
 	src/MDGeometry/IMDDimensionFactory.cpp
@@ -55,6 +53,7 @@ set ( SRC_FILES
 	src/Math/Vertex2DList.cpp
 	src/Math/mathSupport.cpp
 	src/Objects/BoundingBox.cpp
+  src/Objects/InstrumentRayTracer.cpp
 	src/Objects/Material.cpp
 	src/Objects/Object.cpp
 	src/Objects/RuleItems.cpp
@@ -101,7 +100,7 @@ set ( INC_FILES
 	inc/MantidGeometry/ICompAssembly.h
 	inc/MantidGeometry/IComponent.h
 	inc/MantidGeometry/IDetector.h
-	inc/MantidGeometry/IInstrument.h
+  inc/MantidGeometry/Instrument.h
 	inc/MantidGeometry/IObjComponent.h
 	inc/MantidGeometry/ISpectraDetectorMap.h
 	inc/MantidGeometry/Instrument/CompAssembly.h
@@ -110,7 +109,6 @@ set ( INC_FILES
 	inc/MantidGeometry/Instrument/DetectorGroup.h
 	inc/MantidGeometry/Instrument/FitParameter.h
 	inc/MantidGeometry/Instrument/Goniometer.h
-	inc/MantidGeometry/Instrument/Instrument.h
 	inc/MantidGeometry/Instrument/NearestNeighbours.h
 	inc/MantidGeometry/Instrument/ObjCompAssembly.h
 	inc/MantidGeometry/Instrument/ObjComponent.h
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/ICompAssembly.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/ICompAssembly.h
index b90919b1e371a3202d98f379c78536bb9633b96e..41a9f07cc19032ff7f969cee7a761143923eaac0 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/ICompAssembly.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/ICompAssembly.h
@@ -66,7 +66,7 @@ namespace Mantid
       //! Get a pointer to the ith component within the assembly. Easier to use than [] when you have a pointer
       virtual boost::shared_ptr<IComponent> getChild(const int i) const = 0;
       //! Get all children
-      virtual void getChildren(std::vector<boost::shared_ptr<IComponent> > & outVector, bool recursive) const = 0;
+      virtual void getChildren(std::vector<IComponent_const_sptr> & outVector, bool recursive) const = 0;
       //! Overloaded index operator. Get a pointer to the ith component in the assembly
       virtual boost::shared_ptr<IComponent> operator[](int i) const = 0;
       //! Print information about all children
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/IInstrument.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/IInstrument.h
deleted file mode 100644
index 87c96d945ad1a68bac8f84b75bb99ce07bc0584b..0000000000000000000000000000000000000000
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/IInstrument.h
+++ /dev/null
@@ -1,179 +0,0 @@
-#ifndef MANTID_GEOMETRY_IINSTRUMENT_H_
-#define MANTID_GEOMETRY_IINSTRUMENT_H_
-
-//----------------------------------------------------------------------
-// Includes
-//----------------------------------------------------------------------
-#include "MantidKernel/Logger.h"
-#include "MantidGeometry/DllConfig.h"
-#include "MantidGeometry/ICompAssembly.h"
-#include "MantidGeometry/Instrument/Detector.h"
-#include <boost/shared_ptr.hpp>
-#include <map>
-#include <string>
-#include "MantidKernel/DateAndTime.h"
-
-namespace Mantid
-{
-
-/// Typedef of a map from detector ID to detector shared pointer.
-typedef std::map<detid_t, Mantid::Geometry::IDetector_sptr> detid2det_map;
-
-
-namespace Geometry
-{
-
-/** IInstrument class. The abstract instrument class it is the base for 
-    Instrument and Instrument classes.
-
-    @author Nick Draper, ISIS, RAL
-    @date 26/09/2007
-    @author Anders Markvardsen, ISIS, RAL
-    @date 1/4/2008
-
-    Copyright &copy; 2007-10 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://svn.mantidproject.org/mantid/trunk/Code/Mantid>.
-    Code Documentation is available at: <http://doxygen.mantidproject.org>
-*/
-class MANTID_GEOMETRY_DLL IInstrument : public virtual Geometry::ICompAssembly
-{
-public:
-
-  IInstrument()
-  : ICompAssembly()
-  {}
-
-  IInstrument(const IInstrument & other)
-  : ICompAssembly(),
-    m_ValidFrom(other.m_ValidFrom),
-    m_ValidTo(other.m_ValidTo)
-  {}
-
-  ///String description of the type of component
-  virtual std::string type() const { return "IInstrument"; }
-
-  ///Virtual destructor
-  virtual ~IInstrument() {}
-
-  virtual std::string getName() const = 0;
-
-
-
-  /// Returns a pointer to the geometrical object representing the source
-  virtual Geometry::IObjComponent_sptr getSource() const = 0;
-
-  /// Returns a pointer to the geometrical object representing the sample
-  virtual Geometry::IObjComponent_sptr getSample() const = 0;
-
-  /// Returns a unit vector pointing in the direction of the beam
-  Kernel::V3D getBeamDirection() const;
-
-  /// Returns a pointer to the geometrical object for the detector with the given ID
-  virtual Geometry::IDetector_sptr getDetector(const detid_t &detector_id) const = 0;
-  /// Returns a pointer to the geometrical object for the given set of IDs
-  virtual Geometry::IDetector_sptr getDetector(const std::vector<detid_t> &detector_id) const = 0;
-
-  /// Returns a list of Detectors for the given detectors ids
-  virtual std::vector<IDetector_sptr> getDetectors(const std::vector<detid_t> &det_ids) const = 0;
-
-  /// Returns a list of Detectors for the given detectors ids
-  virtual std::vector<IDetector_sptr> getDetectors(const std::set<detid_t> &det_ids) const = 0;
-
-  /// Fill a vector with all the detectors contained in a named component
-  virtual void getDetectorsInBank(std::vector<Geometry::IDetector_sptr> & dets, const std::string & bankName) = 0;
-
-  /// return map of detector ID : detector sptr
-  virtual void getDetectors( detid2det_map & out_dets) const = 0;
-
-  /// return a vector with a list of the detector IDs
-  virtual std::vector<detid_t> getDetectorIDs(bool skipMonitors = false) const = 0;
-
-  /// Returns a pointer to the geometrical object representing the monitor with the given ID
-  virtual Geometry::IDetector_sptr getMonitor(const int &detector_id) const = 0;
-
-  /// returns a list containing  detector ids of monitors
-  virtual const std::vector<detid_t> getMonitors()const = 0;
-
-  /// Returns the number of monitors attached to this instrument
-  virtual size_t numMonitors() const = 0;
-
-  /// Returns a shared pointer to a component
-  virtual boost::shared_ptr<Geometry::IComponent> getComponentByID(Geometry::ComponentID id) = 0;
-
-  /// Returns a shared pointer to a component
-  virtual boost::shared_ptr<const Geometry::IComponent> getComponentByID(Geometry::ComponentID id)const = 0;
-
-  /// Returns a pointer to the first component encountered with the given name
-  boost::shared_ptr<Geometry::IComponent> getComponentByName(const std::string & cname);
-
-  /// Returns a pointer to the first component encountered with the given name
-  boost::shared_ptr<const Geometry::IComponent> getComponentByName(const std::string & cname) const;
-
-  /// Returns pointers to all components encountered with the given name
-  std::vector<boost::shared_ptr<Geometry::IComponent> > getAllComponentsWithName(const std::string & cname);
-
-
-  /// The type used to deliver the set of plottable components
-  typedef std::vector<Geometry::IObjComponent_const_sptr> plottables;
-  /// A constant shared pointer to a vector of plotables
-  typedef const boost::shared_ptr<const plottables> plottables_const_sptr;
-
-  /// Get pointers to plottable components
-  virtual plottables_const_sptr getPlottable() const = 0;
-
-  /// Retrieves from which side the instrument to be viewed from when the instrument viewer first starts, possiblities are "Z+, Z-, X+, ..."
-  virtual std::string getDefaultAxis() const=0;
-
-  virtual void getInstrumentParameters(double & l1, Kernel::V3D & beamline,
-      double & beamline_norm, Kernel::V3D & samplePos) const = 0;
-
-  /// @return the date from which the instrument definition begins to be valid.
-  Kernel::DateAndTime getValidFromDate() const
-  { return m_ValidFrom; }
-
-  /// @return the date at which the instrument definition is no longer valid.
-  Kernel::DateAndTime getValidToDate() const
-  { return m_ValidTo; }
-
-  /// Set the date from which the instrument definition begins to be valid.
-  /// @param val :: date
-  void setValidFromDate(const Kernel::DateAndTime val)
-  { m_ValidFrom = val; }
-
-  /// Set the date at which the instrument definition is no longer valid.
-  /// @param val :: date
-  void setValidToDate(const Kernel::DateAndTime val)
-  { m_ValidTo = val; }
-
-protected:
-  /// the date from which the instrument definition begins to be valid.
-  Kernel::DateAndTime m_ValidFrom;
-  /// the date at which the instrument definition is no longer valid.
-  Kernel::DateAndTime m_ValidTo;
-};
-
-/// Shared pointer to IInstrument
-typedef boost::shared_ptr<IInstrument> IInstrument_sptr;
-/// Shared pointer to IInstrument (const version)
-typedef boost::shared_ptr<const IInstrument> IInstrument_const_sptr;
-
-} // namespace Geometry
-} // namespace Mantid
-
-#endif /*MANTID_GEOMETRY_IINSTRUMENT_H_*/
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/Instrument.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument.h
similarity index 78%
rename from Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/Instrument.h
rename to Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument.h
index 889fc3ff6da2d53a6b71c349ec34c9c84f1f4dd1..98ae060c120c05bdbce571eec0ac7ac2d8e8f399 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/Instrument.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument.h
@@ -5,9 +5,9 @@
 // Includes
 //----------------------------------------------------------------------
 #include "MantidKernel/cow_ptr.h"
+#include "MantidKernel/DateAndTime.h"
 #include "MantidKernel/Logger.h"
 #include "MantidGeometry/DllConfig.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/Instrument/CompAssembly.h"
 #include "MantidGeometry/Instrument/ObjComponent.h"
 #include "MantidGeometry/Instrument/Detector.h"
@@ -17,6 +17,8 @@
 
 namespace Mantid
 {
+  /// Typedef of a map from detector ID to detector shared pointer.
+  typedef std::map<detid_t, Geometry::IDetector_sptr> detid2det_map;
 
   namespace Geometry
   {
@@ -56,7 +58,7 @@ namespace Mantid
     File change history is stored at: <https://svn.mantidproject.org/mantid/trunk/Code/Mantid>.
     Code Documentation is available at: <http://doxygen.mantidproject.org>
     */
-    class MANTID_GEOMETRY_DLL Instrument : public Geometry::CompAssembly, public IInstrument
+    class MANTID_GEOMETRY_DLL Instrument : public CompAssembly
     {
     public:
       ///String description of the type of component
@@ -70,6 +72,8 @@ namespace Mantid
 
       IObjComponent_sptr getSource() const;
       IObjComponent_sptr getSample() const;
+      Kernel::V3D getBeamDirection() const;
+
       IDetector_sptr getDetector(const detid_t &detector_id) const;
       /// Returns a pointer to the geometrical object for the given set of IDs
       IDetector_sptr getDetector(const std::vector<detid_t> &det_ids) const;
@@ -86,27 +90,27 @@ namespace Mantid
       /// mark a Component which has already been added to the Instrument (as a child comp.)
       /// to be 'the' samplePos Component. For now it is assumed that we have
       /// at most one of these.
-      void markAsSamplePos(Geometry::ObjComponent*);
+      void markAsSamplePos(ObjComponent*);
 
       /// mark a Component which has already been added to the Instrument (as a child comp.)
       /// to be 'the' source Component. For now it is assumed that we have
       /// at most one of these.
-      void markAsSource(Geometry::ObjComponent*);
+      void markAsSource(ObjComponent*);
 
       /// mark a Component which has already been added to the Instrument (as a child comp.)
       /// to be a Detector component by adding it to _detectorCache
-      void markAsDetector(Geometry::IDetector*);
+      void markAsDetector(IDetector*);
 
       /// mark a Component which has already been added to the Instrument (as a child comp.)
       /// to be a monitor and also add it to _detectorCache for possible later retrieval
-      void markAsMonitor(Geometry::IDetector*);
+      void markAsMonitor(IDetector*);
 
       /// return reference to detector cache 
       void getDetectors(detid2det_map & out_map) const;
 
       std::vector<detid_t> getDetectorIDs(bool skipMonitors = false) const;
 
-      void getDetectorsInBank(std::vector<Geometry::IDetector_sptr> & dets, const std::string & bankName);
+      void getDetectorsInBank(std::vector<IDetector_const_sptr> & dets, const std::string & bankName) const;
 
       /// returns a list containing  detector ids of monitors
       const std::vector<detid_t> getMonitors()const ;
@@ -120,15 +124,19 @@ namespace Mantid
       void getBoundingBox(BoundingBox& boundingBox) const;
 
       /// Get pointers to plottable components
-      plottables_const_sptr getPlottable() const;
-
-      std::string getName()const{return Geometry::CompAssembly::getName();}
+      boost::shared_ptr<const std::vector<IObjComponent_const_sptr> > getPlottable() const;
 
       /// Returns a shared pointer to a component
-      boost::shared_ptr<Geometry::IComponent> getComponentByID(Geometry::ComponentID id);
+      boost::shared_ptr<IComponent> getComponentByID(ComponentID id);
 
       /// Returns a shared pointer to a component
-      boost::shared_ptr<const Geometry::IComponent> getComponentByID(Geometry::ComponentID id)const;
+      boost::shared_ptr<const IComponent> getComponentByID(ComponentID id) const;
+
+      /// Returns a pointer to the first component encountered with the given name
+      boost::shared_ptr<const IComponent> getComponentByName(const std::string & cname) const;
+
+      /// Returns pointers to all components encountered with the given name
+      std::vector<boost::shared_ptr<IComponent> > getAllComponentsWithName(const std::string & cname);
 
       /// Get information about the parameters described in the instrument definition file and associated parameter files
       std::multimap<std::string, boost::shared_ptr<XMLlogfile> >& getLogfileCache() {return _logfileCache;}
@@ -143,23 +151,36 @@ namespace Mantid
       // Allow access by index
       using CompAssembly::getChild;
 
-
       /// Pointer to the 'real' instrument, for parametrized instruments
       boost::shared_ptr<Instrument> baseInstrument() const;
 
       /// Pointer to the NOT const ParameterMap holding the parameters of the modified instrument components.
       boost::shared_ptr<ParameterMap> getParameterMap() const;
 
+      /// @return the date from which the instrument definition begins to be valid.
+      Kernel::DateAndTime getValidFromDate() const { return m_ValidFrom; }
+
+      /// @return the date at which the instrument definition is no longer valid.
+      Kernel::DateAndTime getValidToDate() const { return m_ValidTo; }
+
+      /// Set the date from which the instrument definition begins to be valid.
+      /// @param val :: date
+      void setValidFromDate(const Kernel::DateAndTime val) { m_ValidFrom = val; }
+
+      /// Set the date at which the instrument definition is no longer valid.
+      /// @param val :: date
+      void setValidToDate(const Kernel::DateAndTime val) { m_ValidTo = val; }
+
       // ----- Useful static functions ------
       static double calcConversion(const double l1, const Kernel::V3D &beamline, const double beamline_norm,
-          const Kernel::V3D &samplePos, const Geometry::IDetector_const_sptr &det, const double offset,
+          const Kernel::V3D &samplePos, const IDetector_const_sptr &det, const double offset,
           bool vulcancorrection);
 
       static double calcConversion(const double l1,
                             const Kernel::V3D &beamline,
                             const double beamline_norm,
                             const Kernel::V3D &samplePos,
-                            const Geometry::IInstrument_const_sptr &instrument,
+                            const boost::shared_ptr<const Instrument> &instrument,
                             const std::vector<detid_t> &detectors,
                             const std::map<detid_t,double> &offsets,
                             bool vulcancorrection);
@@ -177,10 +198,10 @@ namespace Mantid
       static Kernel::Logger& g_log;
 
       /// Get a child by name
-      Geometry::IComponent* getChild(const std::string& name) const;
+      IComponent* getChild(const std::string& name) const;
 
       /// Add a plottable component
-      void appendPlottable(const Geometry::CompAssembly& ca,std::vector<Geometry::IObjComponent_const_sptr>& lst)const;
+      void appendPlottable(const CompAssembly& ca,std::vector<IObjComponent_const_sptr>& lst)const;
 
       // This method is only required for efficent caching of parameterized components and
       // should not form part of the interface. It is an implementation detail.
@@ -189,13 +210,13 @@ namespace Mantid
       void swap(const Instrument* base, const ParameterMap * map);
 
       /// Map which holds detector-IDs and pointers to detector components
-      std::map<detid_t, Geometry::IDetector_sptr > _detectorCache;
+      std::map<detid_t, IDetector_sptr > _detectorCache;
 
       /// Purpose to hold copy of source component. For now assumed to be just one component
-      Geometry::ObjComponent* _sourceCache;
+      ObjComponent* _sourceCache;
 
       /// Purpose to hold copy of samplePos component. For now assumed to be just one component
-      Geometry::ObjComponent* _sampleCache;
+      ObjComponent* _sampleCache;
 
       /// To store info about the parameters defined in IDF. Indexed according to logfile-IDs, which equals logfile filename minus the run number and file extension
       std::multimap<std::string, boost::shared_ptr<XMLlogfile> > _logfileCache;
@@ -220,6 +241,10 @@ namespace Mantid
       /// Non-const pointer to the parameter map
       boost::shared_ptr<ParameterMap> m_map_nonconst;
 
+      /// the date from which the instrument definition begins to be valid.
+      Kernel::DateAndTime m_ValidFrom;
+      /// the date at which the instrument definition is no longer valid.
+      Kernel::DateAndTime m_ValidTo;
     };
 
     /// Shared pointer to an instrument object
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/CompAssembly.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/CompAssembly.h
index 289ce266cf356b86c5f341d492e3e90315933899..606233d9fef6d420576a9accf3b62a8864efb185 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/CompAssembly.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/CompAssembly.h
@@ -76,7 +76,7 @@ public:
   //! Get a pointer to the ith component within the assembly. Easier to use than [] when you have a pointer
   boost::shared_ptr<IComponent> getChild(const int i) const;
   //! Returns a vector of all children contained.
-  void getChildren(std::vector<boost::shared_ptr<IComponent> > & outVector, bool recursive) const;
+  void getChildren(std::vector<IComponent_const_sptr> & outVector, bool recursive) const;
   //! Get a pointer to the ith component in the assembly
   boost::shared_ptr<IComponent> operator[](int i) const;
 
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/NearestNeighbours.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/NearestNeighbours.h
index abe3e4ddcdb92e37eb9edc3638d6fdd0ab3a67ff..7ca2421d2402d2a4d36922232d09bdb4b0fb3973 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/NearestNeighbours.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/NearestNeighbours.h
@@ -24,7 +24,7 @@ namespace Mantid
     //------------------------------------------------------------------------------
     // Forward Declarations
     //------------------------------------------------------------------------------
-    class IInstrument;
+    class Instrument;
     class IComponent;
     class ISpectraDetectorMap;
 
@@ -70,7 +70,7 @@ namespace Mantid
     {
     public:
       /// Constructor with an instrument and a spectra map
-      NearestNeighbours(boost::shared_ptr<const IInstrument> instrument,
+      NearestNeighbours(boost::shared_ptr<const Instrument> instrument,
                         const ISpectraDetectorMap & spectraMap);
       /// Default (empty) destructor
       virtual ~NearestNeighbours() {};
@@ -97,11 +97,11 @@ namespace Mantid
 
       /// Get the spectra associated with all in the instrument
       std::map<specid_t, IDetector_sptr> 
-        getSpectraDetectors(boost::shared_ptr<const IInstrument> instrument, 
+        getSpectraDetectors(boost::shared_ptr<const Instrument> instrument,
                             const ISpectraDetectorMap & spectraMap);
 
       /// A pointer the the instrument
-      boost::shared_ptr<const IInstrument> m_instrument;
+      boost::shared_ptr<const Instrument> m_instrument;
       /// A reference to the spectra map
       const ISpectraDetectorMap & m_spectraMap;
       /// The current number of nearest neighbours
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ObjCompAssembly.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ObjCompAssembly.h
index f3b59b61fa0019964c8dd27a00d23d55e07bad3a..f18286ff6d196627c960eb7434ae6ccf6f532219 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ObjCompAssembly.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ObjCompAssembly.h
@@ -74,7 +74,7 @@ public:
   //! Get a pointer to the ith component within the assembly. Easier to use than [] when you have a pointer
   boost::shared_ptr<IComponent> getChild(const int i) const{return (*this)[i];}
   //! Get all children
-  void getChildren(std::vector<boost::shared_ptr<IComponent> > & outVector, bool recursive) const;
+  void getChildren(std::vector<IComponent_const_sptr> & outVector, bool recursive) const;
   //! Get a pointer to the ith component in the assembly
   boost::shared_ptr<IComponent> operator[](int i) const;
   //! Print information about all children
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ParComponentFactory.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ParComponentFactory.h
index ba12ff31ddd471038dbb94139e302358d1b933e5..531b3f9df0ac58b08d0e8cdfbbbf5008104b0aa9 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ParComponentFactory.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Instrument/ParComponentFactory.h
@@ -18,7 +18,6 @@ namespace Mantid
     class IComponent;
     class IDetector;
     class Detector;
-    class IInstrument;
     class Instrument;
 
     /** 
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDPoint.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDPoint.h
index 2c5761bc731ab66f57025c5c090989e0e6125c08..a9b74e4930a8f4d557e6c80bfa92b42bc68c9987 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDPoint.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/MDGeometry/MDPoint.h
@@ -33,7 +33,7 @@
 //----------------------------------------------------------------------
 #include "MantidGeometry/DllConfig.h"
 #include "MantidGeometry/IDetector.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/MDGeometry/Coordinate.h"
 #include "MantidGeometry/DllConfig.h"
 #include <vector>
@@ -59,19 +59,19 @@ namespace Mantid
     private:
       signal_t m_signal;
       signal_t m_error;
-      IInstrument_sptr m_instrument;
+      Instrument_sptr m_instrument;
       IDetector_sptr m_detector;
       std::vector<Coordinate> m_vertexes;
       int m_runId;
     public:
       MDPoint(){};
-      MDPoint(signal_t signal, signal_t error, const std::vector<Coordinate>& vertexes, IDetector_sptr detector, IInstrument_sptr instrument,
+      MDPoint(signal_t signal, signal_t error, const std::vector<Coordinate>& vertexes, IDetector_sptr detector, Instrument_sptr instrument,
           const int runId = 0);
       std::vector<Coordinate> getVertexes() const;
       signal_t getSignal() const;
       signal_t getError() const;
       IDetector_sptr getDetector() const;
-      IInstrument_sptr getInstrument() const;
+      Instrument_sptr getInstrument() const;
       int getRunId() const;
       virtual ~MDPoint();
       std::vector<boost::shared_ptr<MDPoint> > getContributingPoints() const;
diff --git a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Objects/InstrumentRayTracer.h b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Objects/InstrumentRayTracer.h
index bf7b4e17a9e65ce591bc14f8bbc68aecedc8e91b..f68ae1db97c9d7d0dc98a149e485e2c4b940aba7 100644
--- a/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Objects/InstrumentRayTracer.h
+++ b/Code/Mantid/Framework/Geometry/inc/MantidGeometry/Objects/InstrumentRayTracer.h
@@ -5,7 +5,7 @@
 // Includes
 //-------------------------------------------------------------
 #include "MantidGeometry/IDetector.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/Logger.h"
 #include <deque>
 #include <list>
@@ -58,7 +58,7 @@ namespace Mantid
     public:
 
       /// Constructor taking an instrument
-      InstrumentRayTracer(IInstrument_sptr instrument);
+      InstrumentRayTracer(Instrument_sptr instrument);
       /// Trace a given track from the instrument source in the given direction 
       /// and compile a list of results that this track intersects.
       void trace(const Kernel::V3D & direction) const;
@@ -76,7 +76,7 @@ namespace Mantid
       void fireRay(Track & testRay, bool checkInstrumentBB = true) const;
 
       /// Pointer to the instrument
-      IInstrument_sptr m_instrument;
+      Instrument_sptr m_instrument;
       /// Accumulate results in this Track object, aids performance. This is cleared when getResults is called.
       mutable Track m_resultsTrack;
       /// Logger
diff --git a/Code/Mantid/Framework/Geometry/src/Instrument/Instrument.cpp b/Code/Mantid/Framework/Geometry/src/Instrument.cpp
similarity index 75%
rename from Code/Mantid/Framework/Geometry/src/Instrument/Instrument.cpp
rename to Code/Mantid/Framework/Geometry/src/Instrument.cpp
index 65876843138ca276c9d450d16d7f5894b8f57e3f..7f83ab68a713578e5d37c6ff4e11ffb529396242 100644
--- a/Code/Mantid/Framework/Geometry/src/Instrument/Instrument.cpp
+++ b/Code/Mantid/Framework/Geometry/src/Instrument.cpp
@@ -1,4 +1,4 @@
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/V3D.h"
 #include "MantidKernel/Exception.h"
 #include "MantidGeometry/Instrument/ParameterMap.h"
@@ -21,13 +21,13 @@ namespace Mantid
     Kernel::Logger& Instrument::g_log = Kernel::Logger::get("Instrument");
 
     /// Default constructor
-    Instrument::Instrument() : Geometry::CompAssembly(),
+    Instrument::Instrument() : CompAssembly(),
       _detectorCache(),_sourceCache(0),_sampleCache(0),
       m_defaultViewAxis("Z+")
     {}
 
     /// Constructor with name
-    Instrument::Instrument(const std::string& name) : Geometry::CompAssembly(name),
+    Instrument::Instrument(const std::string& name) : CompAssembly(name),
       _detectorCache(),_sourceCache(0),_sampleCache(0),
       m_defaultViewAxis("Z+")
     {}
@@ -38,11 +38,10 @@ namespace Mantid
      **/
     Instrument::Instrument(const boost::shared_ptr<Instrument> instr, ParameterMap_sptr map)
     : CompAssembly(instr.get(), map.get() ),
-      IInstrument(*instr.get()),
       _sourceCache(instr->_sourceCache), _sampleCache(instr->_sampleCache),
       m_defaultViewAxis(instr->m_defaultViewAxis),
-      m_instr(instr),
-      m_map_nonconst(map)
+      m_instr(instr), m_map_nonconst(map),
+      m_ValidFrom(instr->m_ValidFrom), m_ValidTo(instr->m_ValidTo)
     {
     }
 
@@ -60,7 +59,7 @@ namespace Mantid
      * Pointer to the ParameterMap holding the parameters of the modified instrument components.
      * @return parameter map from modified instrument components
      */
-    Geometry::ParameterMap_sptr Instrument::getParameterMap() const
+    ParameterMap_sptr Instrument::getParameterMap() const
     {
       if (m_isParametrized)
         return m_map_nonconst;
@@ -131,19 +130,19 @@ namespace Mantid
      *        The name must be unique, otherwise the first matching component (getComponentByName)
      *        is used.
      */
-    void Instrument::getDetectorsInBank(std::vector<Geometry::IDetector_sptr> & dets, const std::string & bankName)
+    void Instrument::getDetectorsInBank(std::vector<IDetector_const_sptr> & dets, const std::string & bankName) const
     {
-      boost::shared_ptr<IComponent> comp = this->getComponentByName(bankName);
-      boost::shared_ptr<ICompAssembly> bank = boost::dynamic_pointer_cast<ICompAssembly>(comp);
+      boost::shared_ptr<const IComponent> comp = this->getComponentByName(bankName);
+      boost::shared_ptr<const ICompAssembly> bank = boost::dynamic_pointer_cast<const ICompAssembly>(comp);
       if (bank)
       {
         // Get a vector of children (recursively)
-        std::vector<boost::shared_ptr<IComponent> > children;
+        std::vector<boost::shared_ptr<const IComponent> > children;
         bank->getChildren(children, true);
-        std::vector<boost::shared_ptr<IComponent> >::iterator it;
+        std::vector<boost::shared_ptr<const IComponent> >::iterator it;
         for (it = children.begin(); it != children.end(); it++)
         {
-          IDetector_sptr det = boost::dynamic_pointer_cast<IDetector>(*it);
+          IDetector_const_sptr det = boost::dynamic_pointer_cast<const IDetector>(*it);
           if (det)
           {
             dets.push_back( det );
@@ -195,18 +194,29 @@ namespace Mantid
       }
     }
 
+    /** Gets the beam direction (i.e. source->sample direction).
+    *  Not virtual because it relies the getSample() & getPos() virtual functions
+    *  @returns A unit vector denoting the direction of the beam
+    */
+    Kernel::V3D Instrument::getBeamDirection() const
+    {
+      V3D retval = getSample()->getPos() - getSource()->getPos();
+      retval.normalize();
+      return retval;
+    }
+
     //------------------------------------------------------------------------------------------
     /**  Get a shared pointer to a component by its ID
     *   @param id :: ID
     *   @return A pointer to the component.
     */
-    boost::shared_ptr<Geometry::IComponent> Instrument::getComponentByID(Geometry::ComponentID id)
+    boost::shared_ptr<IComponent> Instrument::getComponentByID(ComponentID id)
     {
       IComponent* base = (IComponent*)(id);
       if (m_isParametrized)
         return ParComponentFactory::create(boost::shared_ptr<IComponent>(base,NoDeleting()),m_map);
       else
-        return boost::shared_ptr<Geometry::IComponent>(base, NoDeleting());
+        return boost::shared_ptr<IComponent>(base, NoDeleting());
     }
 
     //------------------------------------------------------------------------------------------
@@ -214,13 +224,107 @@ namespace Mantid
     *   @param id :: ID
     *   @return A pointer to the component.
     */
-    boost::shared_ptr<const Geometry::IComponent> Instrument::getComponentByID(Geometry::ComponentID id)const
+    boost::shared_ptr<const IComponent> Instrument::getComponentByID(ComponentID id) const
     {
       IComponent* base = (IComponent*)(id);
       if (m_isParametrized)
         return ParComponentFactory::create(boost::shared_ptr<IComponent>(base,NoDeleting()),m_map);
       else
-        return boost::shared_ptr<Geometry::IComponent>(base, NoDeleting());
+        return boost::shared_ptr<IComponent>(base, NoDeleting());
+    }
+
+    /**
+    * Find a component by name.
+    * @param cname :: The name of the component. If there are multiple matches, the first one found is returned.
+    * @returns A shared pointer to the component
+    */
+    boost::shared_ptr<const IComponent> Instrument::getComponentByName(const std::string & cname) const
+    {
+      boost::shared_ptr<const IComponent> node = boost::shared_ptr<const IComponent>(this, NoDeleting());
+      // Check the instrument name first
+      if( this->getName() == cname )
+      {
+        return node;
+      }
+      // Otherwise Search the instrument tree using a breadth-first search algorithm since most likely candidates
+      // are higher-level components
+      // I found some useful info here http://www.cs.bu.edu/teaching/c/tree/breadth-first/
+      std::deque<boost::shared_ptr<const IComponent> > nodeQueue;
+      // Need to be able to enter the while loop
+      nodeQueue.push_back(node);
+      while( !nodeQueue.empty() )
+      {
+        node = nodeQueue.front();
+        nodeQueue.pop_front();
+        int nchildren(0);
+        boost::shared_ptr<const ICompAssembly> asmb = boost::dynamic_pointer_cast<const ICompAssembly>(node);
+        if( asmb )
+        {
+          nchildren = asmb->nelements();
+        }
+        for( int i = 0; i < nchildren; ++i )
+        {
+          boost::shared_ptr<const IComponent> comp = (*asmb)[i];
+          if( comp->getName() == cname )
+          {
+            return comp;
+          }
+          else
+          {
+            nodeQueue.push_back(comp);
+          }
+        }
+      }// while-end
+
+      // If we have reached here then the search failed
+      return boost::shared_ptr<const IComponent>();
+    }
+
+    /** Find all components in an Instrument Definition File (IDF) with a given name. If you know a component
+     *  has a unique name use instead getComponentByName(), which is as fast or faster for retrieving a uniquely
+     *  named component.
+     *  @param cname :: The name of the component. If there are multiple matches, the first one found is returned.
+     *  @returns Pointers to components
+     */
+    std::vector<boost::shared_ptr<IComponent> > Instrument::getAllComponentsWithName(const std::string & cname)
+    {
+      boost::shared_ptr<IComponent> node = boost::shared_ptr<IComponent>(this, NoDeleting());
+      std::vector<boost::shared_ptr<IComponent> > retVec;
+      // Check the instrument name first
+      if( this->getName() == cname )
+      {
+        retVec.push_back(node);
+      }
+      // Same algorithm as used in getComponentByName() but searching the full tree
+      std::deque<boost::shared_ptr<IComponent> > nodeQueue;
+      // Need to be able to enter the while loop
+      nodeQueue.push_back(node);
+      while( !nodeQueue.empty() )
+      {
+        node = nodeQueue.front();
+        nodeQueue.pop_front();
+        int nchildren(0);
+        boost::shared_ptr<ICompAssembly> asmb = boost::dynamic_pointer_cast<ICompAssembly>(node);
+        if( asmb )
+        {
+          nchildren = asmb->nelements();
+        }
+        for( int i = 0; i < nchildren; ++i )
+        {
+          boost::shared_ptr<IComponent> comp = (*asmb)[i];
+          if( comp->getName() == cname )
+          {
+            retVec.push_back(comp);
+          }
+          else
+          {
+            nodeQueue.push_back(comp);
+          }
+        }
+      }// while-end
+
+      // If we have reached here then the search failed
+      return retVec;
     }
 
     /**	Gets a pointer to the detector from its ID
@@ -231,7 +335,7 @@ namespace Mantid
     *  @returns A pointer to the detector object
     *  @throw   NotFoundError If no detector is found for the detector ID given
     */
-    Geometry::IDetector_sptr Instrument::getDetector(const detid_t &detector_id) const
+    IDetector_sptr Instrument::getDetector(const detid_t &detector_id) const
     {
       if (m_isParametrized)
       {
@@ -240,7 +344,7 @@ namespace Mantid
       }
       else
       {
-        std::map<detid_t, Geometry::IDetector_sptr >::const_iterator it = _detectorCache.find(detector_id);
+        std::map<detid_t, IDetector_sptr >::const_iterator it = _detectorCache.find(detector_id);
         if ( it == _detectorCache.end() )
         {
           g_log.debug() << "Detector with ID " << detector_id << " not found." << std::endl;
@@ -284,7 +388,7 @@ namespace Mantid
      */
     std::vector<IDetector_sptr> Instrument::getDetectors(const std::vector<detid_t> &det_ids) const
     {
-      std::vector<Geometry::IDetector_sptr> dets_ptr;
+      std::vector<IDetector_sptr> dets_ptr;
       dets_ptr.reserve(det_ids.size());
       std::vector<detid_t>::const_iterator it;
       for ( it = det_ids.begin(); it != det_ids.end(); ++it )
@@ -300,7 +404,7 @@ namespace Mantid
      */
     std::vector<IDetector_sptr> Instrument::getDetectors(const std::set<detid_t> &det_ids) const
     {
-      std::vector<Geometry::IDetector_sptr> dets_ptr;
+      std::vector<IDetector_sptr> dets_ptr;
       dets_ptr.reserve(det_ids.size());
       std::set<detid_t>::const_iterator it;
       for ( it = det_ids.begin(); it != det_ids.end(); ++it )
@@ -316,7 +420,7 @@ namespace Mantid
     *  @return A pointer to the detector object
     *  @throw   NotFoundError If no monitor is found for the detector ID given
     */
-    Geometry::IDetector_sptr Instrument::getMonitor(const int &detector_id)const
+    IDetector_sptr Instrument::getMonitor(const int &detector_id)const
     {
       //No parametrized monitors - I guess ....
 
@@ -329,7 +433,7 @@ namespace Mantid
         readInt << detector_id;
         throw Kernel::Exception::NotFoundError("Instrument: Detector with ID " + readInt.str() + " not found.","");
       }
-      Geometry::IDetector_sptr monitor=getDetector(detector_id);
+      IDetector_sptr monitor=getDetector(detector_id);
 
       return monitor;
     }
@@ -339,9 +443,9 @@ namespace Mantid
     * @param name :: the name of the object requested (case insensitive)
     * @returns a pointer to the component
     */
-    Geometry::IComponent* Instrument::getChild(const std::string& name) const
+    IComponent* Instrument::getChild(const std::string& name) const
     {
-      Geometry::IComponent *retVal = 0;
+      IComponent *retVal = 0;
       std::string searchName = name;
       std::transform(searchName.begin(), searchName.end(), searchName.begin(), toupper);
 
@@ -349,7 +453,7 @@ namespace Mantid
       for (int i = 0; i < noOfChildren; i++)
       {
         //The proper (parametrized or not) component will be returned by [i] operator.
-        Geometry::IComponent *loopPtr = (*this)[i].get();
+        IComponent *loopPtr = (*this)[i].get();
         std::string loopName = loopPtr->getName();
         std::transform(loopName.begin(), loopName.end(), loopName.begin(), toupper);
         if (loopName == searchName)
@@ -374,7 +478,7 @@ namespace Mantid
     *
     * @param comp :: Component to be marked (stored for later retrievel) as a "SamplePos" Component
     */
-    void Instrument::markAsSamplePos(Geometry::ObjComponent* comp)
+    void Instrument::markAsSamplePos(ObjComponent* comp)
     {
       if (m_isParametrized)
         throw std::runtime_error("Instrument::markAsSamplePos() called on a parametrized Instrument object.");
@@ -391,7 +495,7 @@ namespace Mantid
     *
     * @param comp :: Component to be marked (stored for later retrievel) as a "source" Component
     */
-    void Instrument::markAsSource(Geometry::ObjComponent* comp)
+    void Instrument::markAsSource(ObjComponent* comp)
     {
       if (m_isParametrized)
         throw std::runtime_error("Instrument::markAsSource() called on a parametrized Instrument object.");
@@ -408,14 +512,14 @@ namespace Mantid
     * @param det :: Component to be marked (stored for later retrievel) as a detector Component
     *
     */
-    void Instrument::markAsDetector(Geometry::IDetector* det)
+    void Instrument::markAsDetector(IDetector* det)
     {
       if (m_isParametrized)
         throw std::runtime_error("Instrument::markAsDetector() called on a parametrized Instrument object.");
 
       //Create a (non-deleting) shared pointer to it
-      Geometry::IDetector_sptr det_sptr = Geometry::IDetector_sptr(det, NoDeleting() );
-      if ( !_detectorCache.insert( std::map<int, Geometry::IDetector_sptr >::value_type(det->getID(), det_sptr) ).second )
+      IDetector_sptr det_sptr = IDetector_sptr(det, NoDeleting() );
+      if ( !_detectorCache.insert( std::map<int, IDetector_sptr >::value_type(det->getID(), det_sptr) ).second )
       {
         std::stringstream convert;
         convert << det->getID();
@@ -430,7 +534,7 @@ namespace Mantid
     *
     * @throw Exception::ExistsError if cannot add detector to cache
     */
-    void Instrument::markAsMonitor(Geometry::IDetector* det)
+    void Instrument::markAsMonitor(IDetector* det)
     {
       if (m_isParametrized)
         throw std::runtime_error("Instrument::markAsMonitor() called on a parametrized Instrument object.");
@@ -439,7 +543,7 @@ namespace Mantid
       markAsDetector(det);
 
       // mark detector as a monitor
-      Geometry::Detector *d = dynamic_cast<Geometry::Detector*>(det);
+      Detector *d = dynamic_cast<Detector*>(det);
       if (d)
       {
         d->markAsMonitor();
@@ -522,21 +626,21 @@ namespace Mantid
     }
 
 
-    IInstrument::plottables_const_sptr Instrument::getPlottable() const
+    boost::shared_ptr<const std::vector<IObjComponent_const_sptr> > Instrument::getPlottable() const
     {
       if (m_isParametrized)
       {
         // Get the 'base' plottable components
-        IInstrument::plottables_const_sptr objs = m_instr->getPlottable();
+        boost::shared_ptr<const std::vector<IObjComponent_const_sptr> > objs = m_instr->getPlottable();
 
         // Get a reference to the underlying vector, casting away the constness so that we
         // can modify it to get our result rather than creating another long vector
-        IInstrument::plottables & res = const_cast<IInstrument::plottables&>(*objs);
-        const plottables::size_type total = res.size();
-        for(plottables::size_type i = 0; i < total; ++i)
+        std::vector<IObjComponent_const_sptr> & res = const_cast<std::vector<IObjComponent_const_sptr>&>(*objs);
+        const std::vector<IObjComponent_const_sptr>::size_type total = res.size();
+        for(std::vector<IObjComponent_const_sptr>::size_type i = 0; i < total; ++i)
         {
-    res[i] = boost::dynamic_pointer_cast<const Detector>(
-      ParComponentFactory::create(objs->at(i), m_map));
+          res[i] = boost::dynamic_pointer_cast<const Detector>(
+              ParComponentFactory::create(objs->at(i), m_map));
         }
         return objs;
 
@@ -544,7 +648,7 @@ namespace Mantid
       else
       {
         // Base instrument
-        boost::shared_ptr<std::vector<Geometry::IObjComponent_const_sptr> > res( new std::vector<Geometry::IObjComponent_const_sptr> );
+        boost::shared_ptr<std::vector<IObjComponent_const_sptr> > res( new std::vector<IObjComponent_const_sptr> );
         res->reserve(_detectorCache.size()+10);
         appendPlottable(*this,*res);
         return res;
@@ -553,21 +657,21 @@ namespace Mantid
     }
 
 
-    void Instrument::appendPlottable(const Geometry::CompAssembly& ca,std::vector<Geometry::IObjComponent_const_sptr>& lst) const
+    void Instrument::appendPlottable(const CompAssembly& ca,std::vector<IObjComponent_const_sptr>& lst) const
     {
       for(int i=0;i<ca.nelements();i++)
       {
-        Geometry::IComponent* c = ca[i].get();
-        Geometry::CompAssembly* a = dynamic_cast<Geometry::CompAssembly*>(c);
+        IComponent* c = ca[i].get();
+        CompAssembly* a = dynamic_cast<CompAssembly*>(c);
         if (a) appendPlottable(*a,lst);
         else
         {
-          Geometry::Detector* d = dynamic_cast<Geometry::Detector*>(c);
-          Geometry::ObjComponent* o = dynamic_cast<Geometry::ObjComponent*>(c);
+          Detector* d = dynamic_cast<Detector*>(c);
+          ObjComponent* o = dynamic_cast<ObjComponent*>(c);
           if (d)
-            lst.push_back(Geometry::IObjComponent_const_sptr(d,NoDeleting()));
+            lst.push_back(IObjComponent_const_sptr(d,NoDeleting()));
           else if (o)
-            lst.push_back(Geometry::IObjComponent_const_sptr(o,NoDeleting()));
+            lst.push_back(IObjComponent_const_sptr(o,NoDeleting()));
           else
             g_log.error()<<"Unknown comp type\n";
         }
@@ -609,7 +713,7 @@ namespace Mantid
                           const Kernel::V3D &beamline,
                           const double beamline_norm,
                           const Kernel::V3D &samplePos,
-                          const Geometry::IDetector_const_sptr &det,
+                          const IDetector_const_sptr &det,
                           const double offset,
                           bool vulcancorrection)
     {
@@ -647,7 +751,7 @@ namespace Mantid
                           const Kernel::V3D &beamline,
                           const double beamline_norm,
                           const Kernel::V3D &samplePos,
-                          const IInstrument_const_sptr &instrument,
+                          const Instrument_const_sptr &instrument,
                           const std::vector<detid_t> &detectors,
                           const std::map<detid_t,double> &offsets,
                           bool vulcancorrection)
@@ -685,7 +789,7 @@ namespace Mantid
         double & beamline_norm, Kernel::V3D & samplePos) const
     {
       // Get some positions
-      const Geometry::IObjComponent_sptr sourceObj = this->getSource();
+      const IObjComponent_sptr sourceObj = this->getSource();
       if (sourceObj == NULL)
       {
         throw Exception::InstrumentDefinitionError("Failed to get source component from instrument");
@@ -696,7 +800,7 @@ namespace Mantid
       beamline_norm=2.0*beamline.norm();
 
       // Get the distance between the source and the sample (assume in metres)
-      Geometry::IObjComponent_const_sptr sample = this->getSample();
+      IObjComponent_const_sptr sample = this->getSample();
       try
       {
         l1 = this->getSource()->getDistance(*sample);
diff --git a/Code/Mantid/Framework/Geometry/src/Instrument/CompAssembly.cpp b/Code/Mantid/Framework/Geometry/src/Instrument/CompAssembly.cpp
index 174ef9dcecf38885e97f7fdb227cd7f8bcb5be57..95379017fb3ce3cbf3ca7d3f2c6c7a81dff96892 100644
--- a/Code/Mantid/Framework/Geometry/src/Instrument/CompAssembly.cpp
+++ b/Code/Mantid/Framework/Geometry/src/Instrument/CompAssembly.cpp
@@ -226,7 +226,7 @@ boost::shared_ptr<IComponent> CompAssembly::operator[](int i) const
  * @param outVector :: vector of IComponent sptr.
  * @param recursive :: if a child is a CompAssembly, returns its children recursively
  */
-void CompAssembly::getChildren(std::vector<boost::shared_ptr<IComponent> > & outVector, bool recursive) const
+void CompAssembly::getChildren(std::vector<IComponent_const_sptr> & outVector, bool recursive) const
 {
   for (int i=0; i < this->nelements(); i++)
   {
diff --git a/Code/Mantid/Framework/Geometry/src/Instrument/NearestNeighbours.cpp b/Code/Mantid/Framework/Geometry/src/Instrument/NearestNeighbours.cpp
index 203dad74dc1b3ffcbc2cd86790b0a0e3fc19ca3f..2e42d81104d7f11bf364a11ad448dd65a05b5b42 100644
--- a/Code/Mantid/Framework/Geometry/src/Instrument/NearestNeighbours.cpp
+++ b/Code/Mantid/Framework/Geometry/src/Instrument/NearestNeighbours.cpp
@@ -2,7 +2,7 @@
 // Includes
 //------------------------------------------------------------------------------
 #include "MantidGeometry/Instrument/NearestNeighbours.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/ISpectraDetectorMap.h"
 #include "MantidGeometry/Instrument/DetectorGroup.h"
 // Nearest neighbours library
@@ -18,10 +18,10 @@ namespace Mantid
 
     /**
      * Constructor
-     * @param instrument :: A shared pointer to IInstrument object
+     * @param instrument :: A shared pointer to Instrument object
      * @param spectraMap :: A reference to the spectra-detector mapping
      */
-    NearestNeighbours::NearestNeighbours(IInstrument_const_sptr instrument,
+    NearestNeighbours::NearestNeighbours(Instrument_const_sptr instrument,
                                          const ISpectraDetectorMap & spectraMap) : 
       m_instrument(instrument), m_spectraMap(spectraMap), m_noNeighbours(8), m_cutoff(-DBL_MAX), m_scale()
     {
@@ -221,7 +221,7 @@ namespace Mantid
      * @returns A map of spectra number to detector pointer
      */
     std::map<specid_t, IDetector_sptr>
-    NearestNeighbours::getSpectraDetectors(IInstrument_const_sptr instrument, 
+    NearestNeighbours::getSpectraDetectors(Instrument_const_sptr instrument,
                                            const ISpectraDetectorMap & spectraMap)
     {
       std::map<specid_t, IDetector_sptr> spectra;
diff --git a/Code/Mantid/Framework/Geometry/src/Instrument/ObjCompAssembly.cpp b/Code/Mantid/Framework/Geometry/src/Instrument/ObjCompAssembly.cpp
index 8f3d70bf741c53fa0a4147d9aa830356645decb7..c459591d6e884cb0f4a36462399fd7c85cc379f0 100644
--- a/Code/Mantid/Framework/Geometry/src/Instrument/ObjCompAssembly.cpp
+++ b/Code/Mantid/Framework/Geometry/src/Instrument/ObjCompAssembly.cpp
@@ -229,7 +229,7 @@ boost::shared_ptr<IComponent> ObjCompAssembly::operator[](int i) const
  * @param outVector :: vector of IComponent sptr.
  * @param recursive :: if a child is a CompAssembly, returns its children recursively
  */
-void ObjCompAssembly::getChildren(std::vector<boost::shared_ptr<IComponent> > & outVector, bool recursive) const
+void ObjCompAssembly::getChildren(std::vector<IComponent_const_sptr> & outVector, bool recursive) const
 {
   for (int i=0; i < this->nelements(); i++)
   {
diff --git a/Code/Mantid/Framework/Geometry/src/Instrument/ParComponentFactory.cpp b/Code/Mantid/Framework/Geometry/src/Instrument/ParComponentFactory.cpp
index 54e000277eac098d368d854c78fd9c5abcca1c55..22b461c7e31ee355ceb61459f6cf19aef629aa91 100644
--- a/Code/Mantid/Framework/Geometry/src/Instrument/ParComponentFactory.cpp
+++ b/Code/Mantid/Framework/Geometry/src/Instrument/ParComponentFactory.cpp
@@ -1,7 +1,7 @@
 #include "MantidGeometry/Instrument/CompAssembly.h"
 #include "MantidGeometry/Instrument/Component.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/ObjCompAssembly.h" 
 #include "MantidGeometry/Instrument/ObjComponent.h"
 #include "MantidGeometry/Instrument/ParComponentFactory.h"
diff --git a/Code/Mantid/Framework/Geometry/src/Instrument/ParameterMap.cpp b/Code/Mantid/Framework/Geometry/src/Instrument/ParameterMap.cpp
index 7098bf0f746ef290c1a968ffc3a74e64c55a4ecd..5356eed3132625f2a1d2dbbc1348adb94b116243 100644
--- a/Code/Mantid/Framework/Geometry/src/Instrument/ParameterMap.cpp
+++ b/Code/Mantid/Framework/Geometry/src/Instrument/ParameterMap.cpp
@@ -3,7 +3,7 @@
 #include "MantidGeometry/IDetector.h"
 #include "MantidGeometry/Instrument/NearestNeighbours.h"
 #include "MantidKernel/MultiThreaded.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include <cstring>
 
 namespace Mantid
diff --git a/Code/Mantid/Framework/Geometry/src/MDGeometry/MDPoint.cpp b/Code/Mantid/Framework/Geometry/src/MDGeometry/MDPoint.cpp
index 0be14c36a424dd6f3a315471707d08feced0b963..2d2787ebd2736805bb70bf6296b0edab59ae30be 100644
--- a/Code/Mantid/Framework/Geometry/src/MDGeometry/MDPoint.cpp
+++ b/Code/Mantid/Framework/Geometry/src/MDGeometry/MDPoint.cpp
@@ -5,7 +5,7 @@ namespace Mantid
   namespace Geometry
   {
     MDPoint::MDPoint(signal_t signal, signal_t error,
-        const std::vector<Coordinate>& vertexes, IDetector_sptr detector, IInstrument_sptr instrument,
+        const std::vector<Coordinate>& vertexes, IDetector_sptr detector, Instrument_sptr instrument,
         const int runId)
       : m_signal(signal),
         m_error(error),
@@ -36,7 +36,7 @@ namespace Mantid
         return this->m_detector;
       }
 
-      IInstrument_sptr MDPoint::getInstrument() const
+      Instrument_sptr MDPoint::getInstrument() const
       {
         return this->m_instrument;
       }
diff --git a/Code/Mantid/Framework/Geometry/src/InstrumentRayTracer.cpp b/Code/Mantid/Framework/Geometry/src/Objects/InstrumentRayTracer.cpp
similarity index 98%
rename from Code/Mantid/Framework/Geometry/src/InstrumentRayTracer.cpp
rename to Code/Mantid/Framework/Geometry/src/Objects/InstrumentRayTracer.cpp
index 1ca1aeaf086e75a123eb7a56db4c05624508572a..3c9460d6c0172ea16a4e08b5f1a810da4ace46b6 100644
--- a/Code/Mantid/Framework/Geometry/src/InstrumentRayTracer.cpp
+++ b/Code/Mantid/Framework/Geometry/src/Objects/InstrumentRayTracer.cpp
@@ -8,7 +8,6 @@
 #include "MantidKernel/Exception.h"
 #include <deque>
 #include <iterator>
-#include "MantidGeometry/IDetector.h"
 
 namespace Mantid
 {
@@ -29,7 +28,7 @@ namespace Mantid
      * component.
      * @param instrument :: The instrument to perform the ray tracings on. It must have a defined source.
      */
-    InstrumentRayTracer::InstrumentRayTracer(IInstrument_sptr instrument) : m_instrument(instrument)
+    InstrumentRayTracer::InstrumentRayTracer(Instrument_sptr instrument) : m_instrument(instrument)
     {
       if( !m_instrument )
       {
diff --git a/Code/Mantid/Framework/Geometry/test/CompAssemblyTest.h b/Code/Mantid/Framework/Geometry/test/CompAssemblyTest.h
index c39e018326996e988729a7caac69c806399c41c2..e0850477c4cd69fa9d8fd79cfa7fc9d788817b11 100644
--- a/Code/Mantid/Framework/Geometry/test/CompAssemblyTest.h
+++ b/Code/Mantid/Framework/Geometry/test/CompAssemblyTest.h
@@ -107,9 +107,9 @@ public:
 
   void test_GetChildren_NonRecursive()
   {
-    ICompAssembly_sptr bank = setUpGetChildren();
+    ICompAssembly_const_sptr bank = setUpGetChildren();
     TS_ASSERT_EQUALS(bank->nelements(), 4);
-    std::vector<IComponent_sptr> kids;
+    std::vector<IComponent_const_sptr> kids;
     bank->getChildren(kids, false);
     TS_ASSERT_EQUALS(kids.size(), 4);
     TS_ASSERT_EQUALS(kids[0]->getName(), "Det1Name");
@@ -117,9 +117,9 @@ public:
 
   void test_GetChildren_Recursive()
   {
-    ICompAssembly_sptr bank = setUpGetChildren();
+    ICompAssembly_const_sptr bank = setUpGetChildren();
     TS_ASSERT_EQUALS(bank->nelements(), 4);
-    std::vector<IComponent_sptr> kids;
+    std::vector<IComponent_const_sptr> kids;
     bank->getChildren(kids, true);
     TS_ASSERT_EQUALS(kids.size(), 9);
     TS_ASSERT_EQUALS(kids[0]->getName(), "Det1Name");
diff --git a/Code/Mantid/Framework/Geometry/test/InstrumentRayTracerTest.h b/Code/Mantid/Framework/Geometry/test/InstrumentRayTracerTest.h
index d25ad10594a12c96fdc1a23074403f3d5e0ca98e..35120bcd9fac5d919a4d9905298ea74072e8cbd9 100644
--- a/Code/Mantid/Framework/Geometry/test/InstrumentRayTracerTest.h
+++ b/Code/Mantid/Framework/Geometry/test/InstrumentRayTracerTest.h
@@ -45,25 +45,25 @@ public:
   void test_That_Constructor_Throws_Invalid_Argument_On_Giving_A_Null_Instrument()
   {
     InstrumentRayTracer *rayTracker(NULL);
-    TS_ASSERT_THROWS(rayTracker = new InstrumentRayTracer(boost::shared_ptr<IInstrument>()), std::invalid_argument);
+    TS_ASSERT_THROWS(rayTracker = new InstrumentRayTracer(boost::shared_ptr<Instrument>()), std::invalid_argument);
   }
 
   void test_That_Constructor_Throws_Invalid_Argument_On_Giving_An_Instrument_With_No_Source()
   {
-    IInstrument_sptr testInst(new Instrument("empty"));
+    Instrument_sptr testInst(new Instrument("empty"));
     InstrumentRayTracer *rayTracker(NULL);
     TS_ASSERT_THROWS(rayTracker = new InstrumentRayTracer(testInst), std::invalid_argument);
   }
 
   void test_That_A_Trace_For_A_Ray_That_Intersects_Many_Components_Gives_These_Components_As_A_Result()
   {
-    IInstrument_sptr testInst = setupInstrument(); 
+    Instrument_sptr testInst = setupInstrument(); 
     InstrumentRayTracer tracker(testInst);
     tracker.trace(V3D(0.,0.,1));
     Links results = tracker.getResults();
     TS_ASSERT_EQUALS(results.size(), 2);
     // Check they are actually what we expect: 1 with the sample and 1 with the central detector
-    IComponent_sptr centralPixel = testInst->getComponentByName("pixel-(0,0)");
+    IComponent_const_sptr centralPixel = testInst->getComponentByName("pixel-(0,0)");
     IComponent_sptr sampleComp = testInst->getSample();
 
     if( !sampleComp )
@@ -112,14 +112,14 @@ public:
 
   void test_That_A_Ray_Which_Just_Intersects_One_Component_Gives_This_Component_Only()
   {
-    IInstrument_sptr testInst = setupInstrument(); 
+    Instrument_sptr testInst = setupInstrument(); 
     InstrumentRayTracer tracker(testInst);
     V3D testDir(0.010,0.0,15.004);
     tracker.trace(testDir);
     Links results = tracker.getResults();
     TS_ASSERT_EQUALS(results.size(), 1);
 
-    IComponent * interceptedPixel = testInst->getComponentByName("pixel-(1,0)").get();
+    const IComponent * interceptedPixel = testInst->getComponentByName("pixel-(1,0)").get();
 
     Link intersect = results.front();
     TS_ASSERT_DELTA(intersect.distFromStart, 15.003468, 1e-6);
@@ -149,7 +149,7 @@ public:
    * @param expectX :: expected x index, -1 if off
    * @param expectY :: expected y index, -1 if off
    */
-  void doTestRectangularDetector(std::string message, IInstrument_sptr inst, V3D testDir, int expectX, int expectY)
+  void doTestRectangularDetector(std::string message, Instrument_sptr inst, V3D testDir, int expectX, int expectY)
   {
 //    std::cout << message << std::endl;
     InstrumentRayTracer tracker(inst);
@@ -181,7 +181,7 @@ public:
 
   void test_RectangularDetector()
   {
-    IInstrument_sptr inst;
+    Instrument_sptr inst;
     inst = ComponentCreationHelper::createTestInstrumentRectangular(1, 100);
 
     // Towards the detector lower-left corner
@@ -205,7 +205,7 @@ public:
   }
 
 
-  static void showResults(Links & results, IInstrument_sptr inst)
+  static void showResults(Links & results, Instrument_sptr inst)
   {
     Links::const_iterator resultItr = results.begin();
     for (; resultItr != results.end(); resultItr++)
@@ -218,7 +218,7 @@ public:
 
 private:
   /// Setup the shared test instrument
-  IInstrument_sptr setupInstrument()
+  Instrument_sptr setupInstrument()
   {
     if( !m_testInst )
     {
@@ -230,7 +230,7 @@ private:
 
 private:
   /// Test instrument
-  IInstrument_sptr m_testInst;
+  Instrument_sptr m_testInst;
 };
 
 
@@ -247,7 +247,7 @@ class InstrumentRayTracerTestPerformance : public CxxTest::TestSuite
 {
 public:
   /// Test instrument
-  IInstrument_sptr m_inst;
+  Instrument_sptr m_inst;
   Workspace2D_sptr topazWS;
 
   // This pair of boilerplate methods prevent the suite being created statically
@@ -289,7 +289,7 @@ public:
   void test_TOPAZ()
   {
     bool verbose=false;
-    IInstrument_sptr inst = topazWS->getInstrument();
+    Instrument_sptr inst = topazWS->getInstrument();
     // Directly in Z+ = towards the detector center
     for (int azimuth=0; azimuth < 360; azimuth += 3)
       for (int elev=-89; elev < 89; elev += 3)
diff --git a/Code/Mantid/Framework/Geometry/test/InstrumentTest.h b/Code/Mantid/Framework/Geometry/test/InstrumentTest.h
index d906ce52d9af7cdd135736a5eba17c9a6317b6a5..23b5239605ba81fa7588aa4f840dedb22f397179 100644
--- a/Code/Mantid/Framework/Geometry/test/InstrumentTest.h
+++ b/Code/Mantid/Framework/Geometry/test/InstrumentTest.h
@@ -1,9 +1,8 @@
 #ifndef INSTRUMENTTEST_H_
 #define INSTRUMENTTEST_H_
 
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/Instrument/DetectorGroup.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/Exception.h"
 #include "MantidTestHelpers/ComponentCreationHelper.h"
 #include <cxxtest/TestSuite.h>
@@ -204,8 +203,8 @@ public:
   void test_getDetectorsInBank()
   {
     // 5 banks with 6x6 pixels in them.
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
-    std::vector<IDetector_sptr> dets;
+    Instrument_const_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
+    std::vector<IDetector_const_sptr> dets;
     inst->getDetectorsInBank(dets, "bank2");
     TS_ASSERT_EQUALS(dets.size(), 36);
     TS_ASSERT_EQUALS(dets[0]->getID(), 36*2);
@@ -214,8 +213,8 @@ public:
   void test_getDetectorsInBank2()
   {
     // 5 banks with 9 pixels each
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5, false);
-    std::vector<IDetector_sptr> dets;
+    Instrument_const_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5, false);
+    std::vector<IDetector_const_sptr> dets;
     inst->getDetectorsInBank(dets, "bank2");
     TS_ASSERT_EQUALS(dets.size(), 9);
   }
@@ -223,7 +222,7 @@ public:
   void test_getDetectors()
   {
     // 5 banks with 6x6 pixels in them.
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
     detid2det_map dets;
     inst->getDetectors(dets);
     TS_ASSERT_EQUALS(dets.size(), 36*5);
@@ -232,7 +231,7 @@ public:
   void test_getDetectorIDs()
   {
     // 5 banks with 6x6 pixels in them.
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
     std::vector<detid_t> dets;
     dets = inst->getDetectorIDs();
     TS_ASSERT_EQUALS(dets.size(), 36*5);
@@ -240,7 +239,7 @@ public:
 
   void test_getValidFromDate()
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(5, 6);
     Kernel::DateAndTime validFrom("1900-01-31T23:59:59");
     Kernel::DateAndTime validTo("2100-01-31 23:59:59");
     inst->setValidFromDate(validFrom);
diff --git a/Code/Mantid/Framework/Geometry/test/MDPointTest.h b/Code/Mantid/Framework/Geometry/test/MDPointTest.h
index e1f9f714b1559c6ac209922dc9f600850bed0f82..13a8d649d1036aea914fc2b8305c024ba0894ce4 100644
--- a/Code/Mantid/Framework/Geometry/test/MDPointTest.h
+++ b/Code/Mantid/Framework/Geometry/test/MDPointTest.h
@@ -4,7 +4,7 @@
 #include <cxxtest/TestSuite.h>
 #include "MantidGeometry/MDGeometry/MDPoint.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/IComponent.h"
 #include "MantidKernel/V3D.h"
 #include <boost/scoped_ptr.hpp>
@@ -38,7 +38,7 @@ private:
     Coordinate c = Coordinate::createCoordinate4D(1, 2, 3, 4);
     vertexes.push_back(c);
     IDetector_sptr detector = IDetector_sptr(new DummyDetector("dummydetector"));
-    IInstrument_sptr instrument = IInstrument_sptr(new DummyInstrument("dummyinstrument"));
+    Instrument_sptr instrument = Instrument_sptr(new DummyInstrument("dummyinstrument"));
     return new MDPoint(1, 0.1, vertexes, detector, instrument);
   }
 
diff --git a/Code/Mantid/Framework/Geometry/test/NearestNeighboursTest.h b/Code/Mantid/Framework/Geometry/test/NearestNeighboursTest.h
index f04995a6d2d722296c1512e3e8ec633090c64138..bcc17e6a2767c3fa8cea719acf1e5290c88aeb99 100644
--- a/Code/Mantid/Framework/Geometry/test/NearestNeighboursTest.h
+++ b/Code/Mantid/Framework/Geometry/test/NearestNeighboursTest.h
@@ -2,9 +2,8 @@
 #define MANTID_TEST_GEOMETRY_NEARESTNEIGHBOURS
 
 #include "MantidGeometry/IDetector.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/NearestNeighbours.h"
 #include "MantidGeometry/Instrument/OneToOneSpectraDetectorMap.h"
 #include "MantidGeometry/Instrument/ParameterMap.h"
@@ -101,8 +100,8 @@ public:
     TS_ASSERT_EQUALS( m_instrument->getDetectorIDs().size(), 512);
 
 
-    RectangularDetector_sptr bank1 = boost::dynamic_pointer_cast<RectangularDetector>(m_instrument->getComponentByName("bank1"));
-    boost::shared_ptr<Detector> det = bank1->getAtXY(2,3);
+    RectangularDetector_const_sptr bank1 = boost::dynamic_pointer_cast<const RectangularDetector>(m_instrument->getComponentByName("bank1"));
+    boost::shared_ptr<const Detector> det = bank1->getAtXY(2,3);
     TS_ASSERT( det );
     std::map<specid_t, double> nb;
 
diff --git a/Code/Mantid/Framework/Geometry/test/ParComponentFactoryTest.h b/Code/Mantid/Framework/Geometry/test/ParComponentFactoryTest.h
index 2ef7b829fc017ce48ec2b3dd00034aa26bef0eaa..fd4bf0f77897649b16c25c32fb48bdf9752ffbd5 100644
--- a/Code/Mantid/Framework/Geometry/test/ParComponentFactoryTest.h
+++ b/Code/Mantid/Framework/Geometry/test/ParComponentFactoryTest.h
@@ -19,7 +19,7 @@ public:
 
   void test_createDetector()
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
     IDetector_sptr idet = inst->getDetector(1);
     Detector * det = boost::dynamic_pointer_cast<Detector>(idet).get();
     ParameterMap * map = new ParameterMap();
@@ -31,7 +31,7 @@ public:
 
   void test_createInstrument()
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(1);
     ParameterMap_sptr map(new ParameterMap());
 
     Instrument_sptr pinst;
diff --git a/Code/Mantid/Framework/Geometry/test/ParInstrumentTest.h b/Code/Mantid/Framework/Geometry/test/ParInstrumentTest.h
index e65315656c06b2674978eb8f4a9c18e767b0b15e..fc0010e50c54da997e3152dc58707c7f1384e7b9 100644
--- a/Code/Mantid/Framework/Geometry/test/ParInstrumentTest.h
+++ b/Code/Mantid/Framework/Geometry/test/ParInstrumentTest.h
@@ -3,7 +3,7 @@
 
 #include <cxxtest/TestSuite.h>
 
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/Exception.h"
 #include "MantidGeometry/Instrument/DetectorGroup.h"
 #include "MantidKernel/cow_ptr.h"
diff --git a/Code/Mantid/Framework/MDAlgorithms/src/CreateMDFitWorkspace.cpp b/Code/Mantid/Framework/MDAlgorithms/src/CreateMDFitWorkspace.cpp
index 29eb7cb0abd3eec2335ab4dd188c528e01429a6f..5e42a313fbfd782de25cab9dd79d558fc0a5d3a8 100644
--- a/Code/Mantid/Framework/MDAlgorithms/src/CreateMDFitWorkspace.cpp
+++ b/Code/Mantid/Framework/MDAlgorithms/src/CreateMDFitWorkspace.cpp
@@ -89,10 +89,10 @@ namespace Mantid
         for(int i = 1; i < n; ++i)
         {
           double s = double(rand()) / RAND_MAX * signal * 0.75;
-          points[i].reset(new MDPoint(s,error,std::vector<Coordinate>(),IDetector_sptr(),IInstrument_sptr()));
+          points[i].reset(new MDPoint(s,error,std::vector<Coordinate>(),IDetector_sptr(),Instrument_sptr()));
           signal -= s;
         }
-        points[0].reset(new MDPoint(signal,error,std::vector<Coordinate>(),IDetector_sptr(),IInstrument_sptr()));
+        points[0].reset(new MDPoint(signal,error,std::vector<Coordinate>(),IDetector_sptr(),Instrument_sptr()));
         size_t i = it->getPointer();
         ws->setCell(i,points);
       }
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/CobaltSWDTest.h b/Code/Mantid/Framework/MDAlgorithms/test/CobaltSWDTest.h
index 3e8c349d937eff67af00a5a72e89d9ba6cb4a3c0..3c91b08c98939a0caea4206f01c9d2d6f0b343b4 100644
--- a/Code/Mantid/Framework/MDAlgorithms/test/CobaltSWDTest.h
+++ b/Code/Mantid/Framework/MDAlgorithms/test/CobaltSWDTest.h
@@ -24,7 +24,7 @@
 #include "MantidAPI/IMDWorkspace.h"
 #include "MantidAPI/IMDIterator.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 
 #include <math.h>
 #include <cmath>
@@ -299,7 +299,7 @@ private:
         Coordinate c = Coordinate::createCoordinate4D(x, y, z, t);
         vertices.push_back(c);
         IDetector_sptr detector = IDetector_sptr(new DummyDetector("dummydetector"));
-        IInstrument_sptr instrument = IInstrument_sptr(new DummyInstrument("dummyinstrument"));
+        Instrument_sptr instrument = Instrument_sptr(new DummyInstrument("dummyinstrument"));
         return new MDPoint(s, e, vertices, detector, instrument);
     }
 
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/QuadEnBackgroundTest.h b/Code/Mantid/Framework/MDAlgorithms/test/QuadEnBackgroundTest.h
index e2162717f1f1d515cb5e46e069557dcd4f236bc4..749cf7af40c816f5b8af0f5be35d49609e5a2b62 100644
--- a/Code/Mantid/Framework/MDAlgorithms/test/QuadEnBackgroundTest.h
+++ b/Code/Mantid/Framework/MDAlgorithms/test/QuadEnBackgroundTest.h
@@ -24,7 +24,7 @@
 #include "MantidAPI/IMDWorkspace.h"
 #include "MantidAPI/IMDIterator.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidMDAlgorithms/QuadEnBackground.h"
 
 #include <math.h>
@@ -297,7 +297,7 @@ private:
         Coordinate c = Coordinate::createCoordinate4D(x, y, z, t);
         vertices.push_back(c);
         IDetector_sptr detector = IDetector_sptr(new DummyDetector("dummydetector"));
-        IInstrument_sptr instrument = IInstrument_sptr(new DummyInstrument("dummyinstrument"));
+        Instrument_sptr instrument = Instrument_sptr(new DummyInstrument("dummyinstrument"));
         return new MDPoint(s, e, vertices, detector, instrument);
     }
 
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/SimulateMDDataTest.h b/Code/Mantid/Framework/MDAlgorithms/test/SimulateMDDataTest.h
index c098c724ce224fa31e97d0d015deef0baa5ccaaf..7c430956e460f629d06ae4d7c420c2263a07660c 100644
--- a/Code/Mantid/Framework/MDAlgorithms/test/SimulateMDDataTest.h
+++ b/Code/Mantid/Framework/MDAlgorithms/test/SimulateMDDataTest.h
@@ -10,7 +10,7 @@
 #include "MantidGeometry/MDGeometry/MDCell.h"
 #include "MantidAPI/IMDWorkspace.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidMDAlgorithms/SimulateMDD.h"
 
 using namespace Mantid::API;
@@ -216,7 +216,7 @@ private:
         Coordinate c = Coordinate::createCoordinate4D(x, y, z, t);
         vertices.push_back(c);
         IDetector_sptr detector = IDetector_sptr(new DummyDetector("dummydetector"));
-        IInstrument_sptr instrument = IInstrument_sptr(new DummyInstrument("dummyinstrument"));
+        Instrument_sptr instrument = Instrument_sptr(new DummyInstrument("dummyinstrument"));
         return new MDPoint(s, e, vertices, detector, instrument);
     }
 
diff --git a/Code/Mantid/Framework/MDAlgorithms/test/TobyFitSimulateTest.h b/Code/Mantid/Framework/MDAlgorithms/test/TobyFitSimulateTest.h
index dd2fe5522467be9628fe34e4f9d4d06718131e41..3fe36ce625ea2d4d5412aac6860673182ad1b109 100644
--- a/Code/Mantid/Framework/MDAlgorithms/test/TobyFitSimulateTest.h
+++ b/Code/Mantid/Framework/MDAlgorithms/test/TobyFitSimulateTest.h
@@ -10,7 +10,7 @@
 #include "MantidGeometry/MDGeometry/MDCell.h"
 #include "MantidAPI/IMDWorkspace.h"
 #include "MantidGeometry/Instrument/Detector.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidMDAlgorithms/TobyFitSimulate.h"
 
 using namespace Mantid::API;
@@ -215,7 +215,7 @@ private:
     Coordinate c = Coordinate::createCoordinate4D(x, y, z, t);
     vertices.push_back(c);
     IDetector_sptr detector = IDetector_sptr(new DummyDetector("dummydetector"));
-    IInstrument_sptr instrument = IInstrument_sptr(new DummyInstrument("dummyinstrument"));
+    Instrument_sptr instrument = Instrument_sptr(new DummyInstrument("dummyinstrument"));
     return new MDPoint(s, e, vertices, detector, instrument);
   }
 
diff --git a/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDFitWorkspace.h b/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDFitWorkspace.h
index acd6027908e27531d336ab448ac6fd04450ea7aa..f093bacdb932161cd66eb1be424345abfbed00b9 100644
--- a/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDFitWorkspace.h
+++ b/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDFitWorkspace.h
@@ -6,7 +6,7 @@
 #include "MantidAPI/IMDWorkspace.h"
 #include "MantidGeometry/MDGeometry/MDCell.h"
 #include "MantidGeometry/MDGeometry/MDGeometry.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 
 #include <boost/scoped_ptr.hpp>
 #include <map>
@@ -123,7 +123,7 @@ namespace Mantid
       /// Get the geometry xml.
       virtual std::string getGeometryXML() const{return "";}
 
-      void setInstrument(const Mantid::Geometry::IInstrument_sptr& instr);
+      void setInstrument(const Geometry::Instrument_sptr& instr);
 
       /// Creates a new iterator pointing to the first cell in the workspace
       virtual API::IMDIterator* createIterator() const;
diff --git a/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDWorkspace.h b/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDWorkspace.h
index 6ae3f153aa04adf7b307c0eada1c0e5b01b0466b..8edc972d98985886cc966a94d1258330beb2a930 100644
--- a/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDWorkspace.h
+++ b/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/MDWorkspace.h
@@ -8,7 +8,7 @@
 #include "MDDataObjects/IMD_FileFormat.h"
 #include "MantidGeometry/MDGeometry/MDGeometry.h"
 #include "MantidGeometry/MDGeometry/MDDimension.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 
 
 /** MD-workspace -> main class which keeps all data objects necessary for work with 
@@ -174,7 +174,7 @@ namespace Mantid
       /// Get the geometry xml.
       virtual std::string getGeometryXML() const;
 
-      void setInstrument(const Mantid::Geometry::IInstrument_sptr& instr);
+      void setInstrument(const Geometry::Instrument_sptr& instr);
 
       /// Creates a new iterator pointing to the first cell in the workspace
       Mantid::API::IMDIterator* createIterator() const;
diff --git a/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/PrecompiledHeader.h b/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/PrecompiledHeader.h
index bc6a4519d35182315ecc77759a55fc502c3f6ff2..88b2f5837fee06f25511c491e458c9c469da0fdb 100644
--- a/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/PrecompiledHeader.h
+++ b/Code/Mantid/Framework/MDDataObjects/inc/MDDataObjects/PrecompiledHeader.h
@@ -7,7 +7,7 @@
 #include "MantidAPI/IMDWorkspace.h"
 #include "MantidGeometry/MDGeometry/MDGeometry.h"
 #include "MantidGeometry/MDGeometry/MDDimension.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 
 //STL
 #include <vector>
diff --git a/Code/Mantid/Framework/MDDataObjects/src/MDFitWorkspace.cpp b/Code/Mantid/Framework/MDDataObjects/src/MDFitWorkspace.cpp
index 179542288cfe4b87e015521ef4a6ca1e44d14a1e..68f7f21759dd9ad4aa6ee5093effa6994de9d7cc 100644
--- a/Code/Mantid/Framework/MDDataObjects/src/MDFitWorkspace.cpp
+++ b/Code/Mantid/Framework/MDDataObjects/src/MDFitWorkspace.cpp
@@ -48,7 +48,7 @@ namespace Mantid{
       return m_cells.size()*sizeof(MDCell) + m_points.size()*(2*sizeof(void*)+sizeof(MDPoint));
     } 
 
-    void  MDFitWorkspace::setInstrument(const IInstrument_sptr& instr)
+    void  MDFitWorkspace::setInstrument(const Instrument_sptr& instr)
     {
       boost::shared_ptr<Instrument> tmp = boost::dynamic_pointer_cast<Instrument>(instr);
       if (tmp->isParametrized())
diff --git a/Code/Mantid/Framework/MDDataObjects/src/MDWorkspace.cpp b/Code/Mantid/Framework/MDDataObjects/src/MDWorkspace.cpp
index 0a3936f9ab9bf5bfbe535ce3f4aa0633092ad758..6782fe90eeaff69137424a97bfee1ad99d83a698 100644
--- a/Code/Mantid/Framework/MDDataObjects/src/MDWorkspace.cpp
+++ b/Code/Mantid/Framework/MDDataObjects/src/MDWorkspace.cpp
@@ -117,7 +117,7 @@ MDWorkspace::MDWorkspace(unsigned int nDimensions, unsigned int nRecDims)
     } 
 
  //
-    void  MDWorkspace::setInstrument(const IInstrument_sptr& instr)
+    void  MDWorkspace::setInstrument(const Instrument_sptr& instr)
     {
       boost::shared_ptr<Instrument> tmp = boost::dynamic_pointer_cast<Instrument>(instr);
       if (tmp->isParametrized())
diff --git a/Code/Mantid/Framework/MDDataObjects/test/MDFitWorkspaceTest.h b/Code/Mantid/Framework/MDDataObjects/test/MDFitWorkspaceTest.h
index 40258b5e8733e19579bcf703301624bbf59d19ab..150055515bb09e0f6068a2a14467a996ca5de472 100644
--- a/Code/Mantid/Framework/MDDataObjects/test/MDFitWorkspaceTest.h
+++ b/Code/Mantid/Framework/MDDataObjects/test/MDFitWorkspaceTest.h
@@ -31,8 +31,8 @@ public:
     do
     {
       std::vector<boost::shared_ptr<Mantid::Geometry::MDPoint> > points(2);
-      points[0].reset(new MDPoint(double(rand() % 100),1.0,std::vector<Coordinate>(),IDetector_sptr(),IInstrument_sptr()));
-      points[1].reset(new MDPoint(double(rand() % 100),1.0,std::vector<Coordinate>(),IDetector_sptr(),IInstrument_sptr()));
+      points[0].reset(new MDPoint(double(rand() % 100),1.0,std::vector<Coordinate>(),IDetector_sptr(),Instrument_sptr()));
+      points[1].reset(new MDPoint(double(rand() % 100),1.0,std::vector<Coordinate>(),IDetector_sptr(),Instrument_sptr()));
       size_t i = it->getPointer();
       ws.setCell(i,points);
     }
diff --git a/Code/Mantid/Framework/MDEvents/src/MDEWFindPeaks.cpp b/Code/Mantid/Framework/MDEvents/src/MDEWFindPeaks.cpp
index a0b58f618f073d55bcc3b7b4495c9e890ac680d4..6a56d9685e17b05b2f1cbbc5142b234054a8a458 100644
--- a/Code/Mantid/Framework/MDEvents/src/MDEWFindPeaks.cpp
+++ b/Code/Mantid/Framework/MDEvents/src/MDEWFindPeaks.cpp
@@ -4,12 +4,10 @@
 #include "MantidMDEvents/MDEventFactory.h"
 #include <vector>
 #include <map>
-#include "MantidGeometry/IInstrument.h"
 
 using namespace Mantid::Kernel;
 using namespace Mantid::API;
 using namespace Mantid::DataObjects;
-using Mantid::Geometry::IInstrument_sptr;
 
 namespace Mantid
 {
@@ -109,7 +107,7 @@ namespace MDEvents
     // TODO: Do we need to pick a different instrument info?
     ExperimentInfo_sptr ei = ws->getExperimentInfo(0);
     // Instrument associated with workspace
-    IInstrument_sptr inst = ei->getInstrument();
+    Geometry::Instrument_sptr inst = ei->getInstrument();
 
     // Calculate a threshold below which a box is too diffuse to be considered a peak.
     signal_t thresholdDensity = 0.0;
diff --git a/Code/Mantid/Framework/MDEvents/test/MDCentroidPeaksTest.h b/Code/Mantid/Framework/MDEvents/test/MDCentroidPeaksTest.h
index e95663e239fb147cbab84d3076cd0c9ba141c50c..d375479e87a6e8f81584f2432265dab128b1205e 100644
--- a/Code/Mantid/Framework/MDEvents/test/MDCentroidPeaksTest.h
+++ b/Code/Mantid/Framework/MDEvents/test/MDCentroidPeaksTest.h
@@ -5,7 +5,6 @@
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidAPI/IMDEventWorkspace.h"
 #include "MantidDataObjects/PeaksWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/MDGeometry/MDHistoDimension.h"
 #include "MantidKernel/System.h"
 #include "MantidKernel/Timer.h"
@@ -83,7 +82,7 @@ public:
       std::string OutputWorkspace = "MDCentroidPeaksTest_Peaks")
   {
     // Make a fake instrument - doesn't matter, we won't use it really
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
 
     // --- Make a fake PeaksWorkspace in the given coordinate space ---
     PeaksWorkspace_sptr peakWS(new PeaksWorkspace());
diff --git a/Code/Mantid/Framework/MDEvents/test/MDEWFindPeaksTest.h b/Code/Mantid/Framework/MDEvents/test/MDEWFindPeaksTest.h
index 000ede6a1ae8294f50ec11f8edd553d43e28b7cc..e3610e1ba03fad07c7dd645dc149c8842bbae971 100644
--- a/Code/Mantid/Framework/MDEvents/test/MDEWFindPeaksTest.h
+++ b/Code/Mantid/Framework/MDEvents/test/MDEWFindPeaksTest.h
@@ -2,7 +2,6 @@
 #define MANTID_MDEVENTS_MDEWFINDPEAKSTEST_H_
 
 #include "MantidDataObjects/PeaksWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/System.h"
 #include "MantidKernel/Timer.h"
 #include "MantidMDEvents/MDEWFindPeaks.h"
@@ -16,7 +15,7 @@
 using namespace Mantid::MDEvents;
 using namespace Mantid::API;
 using namespace Mantid::DataObjects;
-using Mantid::Geometry::IInstrument_sptr;
+using Mantid::Geometry::Instrument_sptr;
 
 class MDEWFindPeaksTest : public CxxTest::TestSuite
 {
@@ -38,7 +37,7 @@ public:
         "OutputWorkspace", "MDEWS");
 
     // Give it an instrument
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(1, 16);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular2(1, 16);
     IMDEventWorkspace_sptr ws;
     TS_ASSERT_THROWS_NOTHING( ws = boost::dynamic_pointer_cast<IMDEventWorkspace>(AnalysisDataService::Instance().retrieve("MDEWS")) );
     ExperimentInfo_sptr ei(new ExperimentInfo());
diff --git a/Code/Mantid/Framework/MDEvents/test/MDEWPeakIntegrationTest.h b/Code/Mantid/Framework/MDEvents/test/MDEWPeakIntegrationTest.h
index b0d58059742002c19c35cfbde6739983937b4c24..d1559a97fe7526173fe13f49b4b9faecd106a90e 100644
--- a/Code/Mantid/Framework/MDEvents/test/MDEWPeakIntegrationTest.h
+++ b/Code/Mantid/Framework/MDEvents/test/MDEWPeakIntegrationTest.h
@@ -4,7 +4,6 @@
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidAPI/IMDEventWorkspace.h"
 #include "MantidDataObjects/PeaksWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/MDGeometry/MDHistoDimension.h"
 #include "MantidKernel/System.h"
 #include "MantidKernel/Timer.h"
@@ -107,7 +106,7 @@ public:
     TS_ASSERT_DELTA( mdews->getBox()->getSignal(), 3000.0, 1e-2);
 
     // Make a fake instrument - doesn't matter, we won't use it really
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
 
     // --- Make a fake PeaksWorkspace ---
     PeaksWorkspace_sptr peakWS(new PeaksWorkspace());
@@ -192,7 +191,7 @@ public:
     addPeak(1000, 0.,0.,0., 1.0);
 
     // Make a fake instrument - doesn't matter, we won't use it really
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
     // --- Make a fake PeaksWorkspace ---
     PeaksWorkspace_sptr peakWS(new PeaksWorkspace());
     peakWS->addPeak( Peak(inst, 1, 1.0, V3D(0., 0., 0.) ) );
@@ -242,7 +241,7 @@ public:
 
 
     // Make a fake instrument - doesn't matter, we won't use it really
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentCylindrical(5);
 
     boost::mt19937 rng;
     boost::uniform_real<double> u(-9.0, 9.0); // Random from -9 to 9.0
diff --git a/Code/Mantid/Framework/Nexus/inc/MantidNexus/NexusFileIO.h b/Code/Mantid/Framework/Nexus/inc/MantidNexus/NexusFileIO.h
index 2bab36c52a09439fcda002122ed46bf6cd005ca5..d8447924cf55689671c4fec73803bc4a5b4d5684 100644
--- a/Code/Mantid/Framework/Nexus/inc/MantidNexus/NexusFileIO.h
+++ b/Code/Mantid/Framework/Nexus/inc/MantidNexus/NexusFileIO.h
@@ -98,7 +98,7 @@ namespace Mantid
       bool writeNexusInstrumentXmlName(const std::string& instrumentXml,const std::string& date,
                             const std::string& version) const;
       /// write an instrument section - currently only the name
-      bool writeNexusInstrument(const Geometry::IInstrument_const_sptr& instrument) const;
+      bool writeNexusInstrument(const Geometry::Instrument_const_sptr& instrument) const;
       /// write any spectra map information to Nexus file
       bool writeNexusProcessedSpectraMap(const API::MatrixWorkspace_const_sptr& localWorkspace, const std::vector<int>& spec) const;
      /// write instrument parameters
diff --git a/Code/Mantid/Framework/Nexus/src/NexusFileIO.cpp b/Code/Mantid/Framework/Nexus/src/NexusFileIO.cpp
index eb72d6ff5e1b242e8fe7004374952e88694e2f11..9bd18ad11b5c53b99384862adf4f6ec26f7b432b 100644
--- a/Code/Mantid/Framework/Nexus/src/NexusFileIO.cpp
+++ b/Code/Mantid/Framework/Nexus/src/NexusFileIO.cpp
@@ -10,7 +10,7 @@
 #ifdef _WIN32
 #include <io.h>
 #endif /* _WIN32 */
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/TimeSeriesProperty.h"
 #include "MantidNexus/NexusFileIO.h"
 #include "MantidDataObjects/Workspace2D.h"
@@ -199,7 +199,7 @@ using namespace DataObjects;
 
 
   //-----------------------------------------------------------------------------------------------
-  bool NexusFileIO::writeNexusInstrument(const Geometry::IInstrument_const_sptr& instrument) const
+  bool NexusFileIO::writeNexusInstrument(const Geometry::Instrument_const_sptr& instrument) const
   {
     NXstatus status;
 
diff --git a/Code/Mantid/Framework/PythonAPI/inc/MantidPythonAPI/std_operator_definitions.h b/Code/Mantid/Framework/PythonAPI/inc/MantidPythonAPI/std_operator_definitions.h
index a7c54e5489e73d575a93acb981ed37951e25ebec..2ca80cda9e503d3fab695b46ece791399c39a852 100644
--- a/Code/Mantid/Framework/PythonAPI/inc/MantidPythonAPI/std_operator_definitions.h
+++ b/Code/Mantid/Framework/PythonAPI/inc/MantidPythonAPI/std_operator_definitions.h
@@ -3,7 +3,8 @@
 
 #include <MantidKernel/InstrumentInfo.h>
 
-/** 
+/** @file
+
     Some classes that are exported to Python do not define certain operators that are necessary
     to wrap them. These operators are added here.
 
diff --git a/Code/Mantid/Framework/PythonAPI/src/geometry_exports.cpp b/Code/Mantid/Framework/PythonAPI/src/geometry_exports.cpp
index 07ac32fb8a99040c83eddb966f44b7302ab427ad..7db947f8f698b5477dfb8474c6773de6b9f26edc 100644
--- a/Code/Mantid/Framework/PythonAPI/src/geometry_exports.cpp
+++ b/Code/Mantid/Framework/PythonAPI/src/geometry_exports.cpp
@@ -21,7 +21,7 @@
 #include <MantidGeometry/Instrument/Component.h>
 #include <MantidGeometry/Instrument/CompAssembly.h>
 #include <MantidGeometry/Instrument/Detector.h>
-#include <MantidGeometry/Instrument/Instrument.h>
+#include <MantidGeometry/Instrument.h>
 #include <MantidGeometry/Instrument/DetectorGroup.h>
 #include "MantidPythonAPI/geometryhelper.h" //exports for matrices to numpy arrays
 
@@ -138,24 +138,16 @@ namespace Mantid
   void export_instrument()
   {
     //Pointer to the interface
-    register_ptr_to_python<boost::shared_ptr<Geometry::IInstrument> >();
-    
-    //IInstrument class
-    class_< Geometry::IInstrument, boost::python::bases<Geometry::ICompAssembly>, 
-      boost::noncopyable>("IInstrument", no_init)
-      .def("getSample", &Geometry::IInstrument::getSample)
-      .def("getSource", &Geometry::IInstrument::getSource)
-      .def("getComponentByName", (boost::shared_ptr<Geometry::IComponent> (Geometry::IInstrument::*)(const std::string&))&Geometry::IInstrument::getComponentByName)
-      .def("getDetector", (Geometry::IDetector_sptr (Geometry::IInstrument::*)(const detid_t&)const)&Geometry::IInstrument::getDetector)
-      ;
-
-    /** Concrete implementations so that Python knows about them */
+    register_ptr_to_python<boost::shared_ptr<Geometry::Instrument> >();
     
     //Instrument class
-    class_< Geometry::Instrument, boost::python::bases<Geometry::IInstrument, Geometry::CompAssembly>, 
-	    boost::noncopyable>("Instrument", no_init)
+    class_< Geometry::Instrument, boost::python::bases<Geometry::CompAssembly>,
+      boost::noncopyable>("Instrument", no_init)
+      .def("getSample", &Geometry::Instrument::getSample)
+      .def("getSource", &Geometry::Instrument::getSource)
+      .def("getComponentByName", (boost::shared_ptr<Geometry::IComponent> (Geometry::Instrument::*)(const std::string&))&Geometry::Instrument::getComponentByName)
+      .def("getDetector", (Geometry::IDetector_sptr (Geometry::Instrument::*)(const detid_t&)const)&Geometry::Instrument::getDetector)
       ;
-    
   }
 
   void export_unit_cell()
diff --git a/Code/Mantid/Framework/TestHelpers/inc/MantidTestHelpers/ComponentCreationHelper.h b/Code/Mantid/Framework/TestHelpers/inc/MantidTestHelpers/ComponentCreationHelper.h
index 3b6969dd0b35f67cdf2c2e83dd90b32df921df96..51a13fe93217295e5de3a724500096c426c4f808 100644
--- a/Code/Mantid/Framework/TestHelpers/inc/MantidTestHelpers/ComponentCreationHelper.h
+++ b/Code/Mantid/Framework/TestHelpers/inc/MantidTestHelpers/ComponentCreationHelper.h
@@ -4,7 +4,7 @@
 #include "MantidTestHelpers/DLLExport.h"
 #include "MantidGeometry/Objects/Object.h"
 #include "MantidKernel/V3D.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/ISpectraDetectorMap.h"
 #include "MantidDataObjects/Workspace2D.h"
 
@@ -105,7 +105,7 @@ namespace ComponentCreationHelper
    * @param num_banks: number of 9-cylinder banks to create
    * @param verbose: prints out the instrument after creation.
    */
-  DLL_TESTHELPERS Mantid::Geometry::IInstrument_sptr 
+  DLL_TESTHELPERS Mantid::Geometry::Instrument_sptr
   createTestInstrumentCylindrical(int num_banks, bool verbose = false);
   /**
    * Create a test instrument with n panels of rectangular detectors, pixels*pixels in size, a source and spherical sample shape.
@@ -113,9 +113,9 @@ namespace ComponentCreationHelper
    * @param num_banks: number of 9-cylinder banks to create
    * @param verbose: prints out the instrument after creation.
    */
-  DLL_TESTHELPERS Mantid::Geometry::IInstrument_sptr createTestInstrumentRectangular(int num_banks, int pixels, double pixelSpacing = 0.008);
+  DLL_TESTHELPERS Mantid::Geometry::Instrument_sptr createTestInstrumentRectangular(int num_banks, int pixels, double pixelSpacing = 0.008);
 
-  DLL_TESTHELPERS Mantid::Geometry::IInstrument_sptr createTestInstrumentRectangular2(int num_banks, int pixels, double pixelSpacing = 0.008);
+  DLL_TESTHELPERS Mantid::Geometry::Instrument_sptr createTestInstrumentRectangular2(int num_banks, int pixels, double pixelSpacing = 0.008);
 
 }
 
diff --git a/Code/Mantid/Framework/TestHelpers/src/ComponentCreationHelper.cpp b/Code/Mantid/Framework/TestHelpers/src/ComponentCreationHelper.cpp
index 18828f2bb92afda4d4861e767a981eb11b07a403..7602c597d64c287cad5587fffc6b9b958788062f 100644
--- a/Code/Mantid/Framework/TestHelpers/src/ComponentCreationHelper.cpp
+++ b/Code/Mantid/Framework/TestHelpers/src/ComponentCreationHelper.cpp
@@ -257,7 +257,7 @@ namespace ComponentCreationHelper
    * @param num_banks: number of 9-cylinder banks to create
    * @param verbose: prints out the instrument after creation.
    */
-  IInstrument_sptr createTestInstrumentCylindrical(int num_banks, bool verbose)
+  Instrument_sptr createTestInstrumentCylindrical(int num_banks, bool verbose)
   {
     boost::shared_ptr<Instrument> testInst(new Instrument("basic"));
 
@@ -344,7 +344,7 @@ namespace ComponentCreationHelper
    * @param num_banks: number of rectangular banks to create
    * @param pixels :: number of pixels in each direction.
    */
-  IInstrument_sptr createTestInstrumentRectangular(int num_banks, int pixels, double pixelSpacing)
+  Instrument_sptr createTestInstrumentRectangular(int num_banks, int pixels, double pixelSpacing)
   {
     boost::shared_ptr<Instrument> testInst(new Instrument("basic_rect"));
 
@@ -407,7 +407,7 @@ namespace ComponentCreationHelper
    * @param num_banks: number of rectangular banks to create
    * @param pixels :: number of pixels in each direction.
    */
-  IInstrument_sptr createTestInstrumentRectangular2(int num_banks, int pixels, double pixelSpacing)
+  Instrument_sptr createTestInstrumentRectangular2(int num_banks, int pixels, double pixelSpacing)
   {
     boost::shared_ptr<Instrument> testInst(new Instrument("basic_rect"));
 
diff --git a/Code/Mantid/Framework/TestHelpers/src/MDEventsTestHelper.cpp b/Code/Mantid/Framework/TestHelpers/src/MDEventsTestHelper.cpp
index 57cafe4f22f609f0e667753bacead972265e8e1b..8b31b0c23248fe3013f9ea15e46b75e3b08f02c1 100644
--- a/Code/Mantid/Framework/TestHelpers/src/MDEventsTestHelper.cpp
+++ b/Code/Mantid/Framework/TestHelpers/src/MDEventsTestHelper.cpp
@@ -1,7 +1,7 @@
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidDataHandling/LoadInstrument.h"
 #include "MantidDataObjects/EventWorkspace.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/MDGeometry/MDTypes.h"
 #include "MantidKernel/cow_ptr.h"
 #include "MantidKernel/DateAndTime.h"
diff --git a/Code/Mantid/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp b/Code/Mantid/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp
index 3329dd7f1a8f0c749606a5d78419366223478315..2ba2de10eb070dd7a6003b1aebce486b27bdc8f8 100644
--- a/Code/Mantid/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp
+++ b/Code/Mantid/Framework/TestHelpers/src/WorkspaceCreationHelper.cpp
@@ -299,7 +299,7 @@ namespace WorkspaceCreationHelper
    */
   Mantid::DataObjects::Workspace2D_sptr create2DWorkspaceWithRectangularInstrument(int numBanks, int numPixels, int numBins)
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(numBanks, numPixels);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(numBanks, numPixels);
     Workspace2D_sptr ws = Create2DWorkspaceBinned(numBanks*numPixels*numPixels, numBins);
     ws->setInstrument(inst);
     ws->getAxis(0)->setUnit("dSpacing");
@@ -323,7 +323,7 @@ namespace WorkspaceCreationHelper
    */
   Mantid::DataObjects::EventWorkspace_sptr createEventWorkspaceWithFullInstrument(int numBanks, int numPixels, bool clearEvents)
   {
-    IInstrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(numBanks, numPixels);
+    Instrument_sptr inst = ComponentCreationHelper::createTestInstrumentRectangular(numBanks, numPixels);
     EventWorkspace_sptr ws = CreateEventWorkspace2(numBanks*numPixels*numPixels, 10);
     ws->setInstrument(inst);
     ws->getAxis(0)->setUnit("dSpacing");
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/CompAssemblyActor.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/CompAssemblyActor.cpp
index 3725c04ae22e489f2040206c0fced5eef282caab..667fffaccfeb6f535c7fb66070db24e8f3fd6811 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/CompAssemblyActor.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/CompAssemblyActor.cpp
@@ -4,12 +4,11 @@
 #include "RectangularDetectorActor.h"
 #include "OpenGLError.h"
 
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidKernel/V3D.h"
 #include "MantidGeometry/Objects/Object.h"
 #include "MantidGeometry/ICompAssembly.h"
 #include "MantidGeometry/Instrument/ObjCompAssembly.h"
-//#include "MantidGeometry/Instrument/ParObjCompAssembly.h"
 #include "MantidGeometry/IObjComponent.h"
 #include "MantidGeometry/IDetector.h"
 #include "MantidGeometry/Instrument/RectangularDetector.h"
@@ -17,12 +16,11 @@
 
 #include <cfloat>
 
-using Mantid::Geometry::IInstrument;
+using Mantid::Geometry::Instrument;
 using Mantid::Geometry::IComponent;
 using Mantid::Geometry::IObjComponent;
 using Mantid::Geometry::ICompAssembly;
 using Mantid::Geometry::ObjCompAssembly;
-//using Mantid::Geometry::ParObjCompAssembly;
 using Mantid::Geometry::ComponentID;
 using Mantid::Geometry::RectangularDetector;
 using Mantid::Geometry::RectangularDetector;
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ICompAssemblyActor.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ICompAssemblyActor.cpp
index dae45e9ca99492b3194c10248309cb26ce11ceb9..3fa07dfdf5ca2625da77a637d51d7885aa8bdf13 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ICompAssemblyActor.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ICompAssemblyActor.cpp
@@ -1,11 +1,9 @@
-#include "MantidGeometry/IInstrument.h"
-#include "MantidKernel/V3D.h"
-#include "MantidGeometry/Objects/Object.h"
-#include "MantidGeometry/ICompAssembly.h"
-#include "MantidGeometry/IObjComponent.h"
-#include "MantidKernel/Exception.h"
 #include "ICompAssemblyActor.h"
 #include <cfloat>
+
+#include "MantidKernel/V3D.h"
+#include "MantidGeometry/IComponent.h"
+
 using namespace Mantid;
 using namespace Geometry;
 
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.cpp
index 74bffc4aec2c18aeb28384166e18dd678def2440..a9564ecf7e92e151c9379a219767837c0152721e 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.cpp
@@ -98,7 +98,7 @@ bool InstrumentActor::accept(const GLActorVisitor& visitor)
   return ok;
 }
 
-boost::shared_ptr<const Mantid::Geometry::IInstrument> InstrumentActor::getInstrument()const
+boost::shared_ptr<const Mantid::Geometry::Instrument> InstrumentActor::getInstrument()const
 {
   return m_workspace->getInstrument();
 }
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.h b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.h
index a96283ebfad173c5d7495c532a55105b8ed42649..48e9fc55e7651917ae253d9c534d37e730ba0efa 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.h
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentActor.h
@@ -7,7 +7,7 @@
 #include "SampleActor.h"
 #include "MantidColorMap.h"
 
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidAPI/SpectraDetectorTypes.h"
 
 #include <boost/shared_ptr.hpp>
@@ -76,7 +76,7 @@ public:
   void getBoundingBox(Mantid::Kernel::V3D& minBound,Mantid::Kernel::V3D& maxBound)const{m_scene.getBoundingBox(minBound,maxBound);}
   bool accept(const GLActorVisitor& visitor);
 
-  boost::shared_ptr<const Mantid::Geometry::IInstrument> getInstrument()const;
+  boost::shared_ptr<const Mantid::Geometry::Instrument> getInstrument()const;
   boost::shared_ptr<const Mantid::API::MatrixWorkspace> getWorkspace()const{return m_workspace;}
   const MantidColorMap & getColorMap() const;
   void loadColorMap(const QString& ,bool reset_colors = true);
@@ -128,7 +128,7 @@ protected:
   /// The user requested data and bin ranges
   double m_DataMinValue, m_DataMaxValue;
   double m_BinMinValue, m_BinMaxValue;
-  boost::shared_ptr<const Mantid::Geometry::IInstrument::plottables> m_plottables;
+  boost::shared_ptr<const std::vector<Mantid::Geometry::IObjComponent_const_sptr> > m_plottables;
   boost::scoped_ptr<Mantid::detid2index_map> m_id2wi_map;
   mutable std::vector<Mantid::detid_t> m_detIDs; ///< all det ids in the instrument in order of pickIDs, populated by Obj..Actor constructors
   mutable std::vector<GLColor> m_colors; ///< colors in order of workspace indexes
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.cpp
index a7bfc0745061a758f9519926b471392c73dbe582..3fe2463fa5d7b7175f5f383add1f332bdd3839fd 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.cpp
@@ -4,10 +4,10 @@
 #endif
 #include "MantidKernel/Exception.h"
 #include "MantidGeometry/ICompAssembly.h"
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidAPI/MatrixWorkspace.h"
 
-using Mantid::Geometry::IInstrument;
+using Mantid::Geometry::Instrument;
 using Mantid::Geometry::IComponent;
 using Mantid::Geometry::ICompAssembly;
 using Mantid::Geometry::IObjComponent;
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.h b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.h
index 47b4a5681d674b91a2c34f39895f88abe2a23f2a..f543b926c290294c2ed09bb7d8ccb2806b913c75 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.h
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeModel.h
@@ -10,7 +10,7 @@ namespace Mantid
 {
   namespace Geometry
   {
-    class IInstrument;
+    class Instrument;
   }
   namespace API
   {
@@ -46,7 +46,7 @@ public:
 
 private:
   boost::shared_ptr<const Mantid::API::MatrixWorkspace> m_workspace;
-  boost::shared_ptr<const Mantid::Geometry::IInstrument> m_instrument; ///< instrument to which the model corresponds to
+  boost::shared_ptr<const Mantid::Geometry::Instrument> m_instrument; ///< instrument to which the model corresponds to
 };
 
 #endif
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.cpp
index 6f0067b5b37b88bb8ff693a32bcb7b2a3ce4b0c0..6fc343a797975003686a365464e0465867f0db53 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.cpp
@@ -5,7 +5,7 @@
 #endif
 #include "MantidKernel/Exception.h"
 #include "MantidGeometry/ICompAssembly.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidAPI/MatrixWorkspace.h"
 #include "GLActor.h"
 #include <queue>
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.h b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.h
index a75ef829720d98a6d718c6a30cfd4ab38bb68f86..770e0c36212c4d57dd1ec7d9075d585b4401daa5 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.h
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentTreeWidget.h
@@ -1,12 +1,26 @@
 #ifndef INSTRUMENTTREEWIDGET_H
 #define INSTRUMENTTREEWIDGET_H
 
+//---------------------------------------
+// Includes
+//--------------------------------------
 #include <QTreeView>
 #include "InstrumentTreeModel.h"
 #include "MantidGeometry/IComponent.h"
 
+//---------------------------------------
+// Forward declarations
+//--------------------------------------
 class InstrumentActor;
 
+namespace Mantid
+{
+  namespace Geometry
+  {
+    class Instrument;
+  }
+}
+
 /** The InstrumentTreeWidget is a tree view
  * of the components of an instrument.
  *
@@ -29,7 +43,7 @@ signals:
 private:
   InstrumentActor* m_instrActor;
   boost::shared_ptr<const Mantid::API::MatrixWorkspace> m_workspace;
-  boost::shared_ptr<const Mantid::Geometry::IInstrument> m_instrument;
+  boost::shared_ptr<const Mantid::Geometry::Instrument> m_instrument;
   InstrumentTreeModel *m_treeModel;
 };
 
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp
index ea17e92050ca601a13a806fc3ef393724d256ef0..dc339d23303b7ce723f69755a0063ab0b6cb4b69 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindow.cpp
@@ -184,7 +184,7 @@ void InstrumentWindow::setSurfaceType(int type)
     QApplication::setOverrideCursor(Qt::WaitCursor);
     m_surfaceType = SurfaceType(type);
     if (!m_instrumentActor) return;
-    boost::shared_ptr<Mantid::Geometry::IInstrument> instr = m_workspace->getInstrument();
+    Mantid::Geometry::Instrument_const_sptr instr = m_workspace->getInstrument();
     Mantid::Geometry::IObjComponent_sptr sample = instr->getSample();
     Mantid::Kernel::V3D sample_pos = sample->getPos();
     Mantid::Kernel::V3D axis;
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindowPickTab.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindowPickTab.cpp
index f23b06f1b5e2b21a747dabf57f9cfbd22039af6e..9a19fd8debf77c72689b8161d100f356ff6d6136 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindowPickTab.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/InstrumentWindowPickTab.cpp
@@ -482,7 +482,7 @@ void InstrumentWindowPickTab::addPeak(double x,double y)
   
   InstrumentActor* instrActor = m_instrWindow->getInstrumentActor();
   Mantid::API::MatrixWorkspace_const_sptr ws = instrActor->getWorkspace();
-  Mantid::Geometry::IInstrument_sptr instr = ws->getInstrument();
+  Mantid::Geometry::Instrument_sptr instr = ws->getInstrument();
   Mantid::Geometry::IObjComponent_const_sptr source = instr->getSource();
   Mantid::Geometry::IObjComponent_const_sptr sample = instr->getSample();
   Mantid::Geometry::IDetector_const_sptr det = instr->getDetector(m_currentDetID);
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ObjCompAssemblyActor.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ObjCompAssemblyActor.cpp
index 353e55abde488f4292fb47eef4957b473a880c4a..3f9982292f2d426dbbf2523af9ca76bcd67a5fed 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ObjCompAssemblyActor.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ObjCompAssemblyActor.cpp
@@ -3,14 +3,12 @@
 #include "InstrumentActor.h"
 #include "OpenGLError.h"
 
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/V3D.h"
 #include "MantidGeometry/Objects/Object.h"
 #include "MantidGeometry/ICompAssembly.h"
 #include "MantidGeometry/IObjComponent.h"
 #include "MantidGeometry/IDetector.h"
 #include "MantidGeometry/Instrument/ObjCompAssembly.h"
-//#include "MantidGeometry/Instrument/ParObjCompAssembly.h"
 #include "MantidKernel/Exception.h"
 #include <cfloat>
 using namespace Mantid;
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/Projection3D.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/Projection3D.cpp
index 76e651550592da3daae6b321f8c42674ad586db0..9b00610d71191985e3897c6be70f690d63f74ba0 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/Projection3D.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/Projection3D.cpp
@@ -9,7 +9,7 @@
 #include "UnwrappedSphere.h"
 #include "OpenGLError.h"
 #include "DetSelector.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Objects/Object.h"
 
 #include <boost/shared_ptr.hpp>
@@ -43,14 +43,14 @@ Projection3D::Projection3D(const InstrumentActor* rootActor,int winWidth,int win
   m_isKeyPressed(false)
 {
 
-  IInstrument_const_sptr instr = rootActor->getInstrument();
-  std::vector<boost::shared_ptr<IComponent> > allComponents;
+  Instrument_const_sptr instr = rootActor->getInstrument();
+  std::vector<IComponent_const_sptr> allComponents;
   instr->getChildren(allComponents,true);
   std::vector<ComponentID> nonDetectors;
-  std::vector<boost::shared_ptr<IComponent> >::const_iterator it = allComponents.begin();
+  std::vector<IComponent_const_sptr>::const_iterator it = allComponents.begin();
   for(; it != allComponents.end(); ++it)
   {
-    IDetector_const_sptr det = boost::dynamic_pointer_cast<IDetector>(*it);
+    IDetector_const_sptr det = boost::dynamic_pointer_cast<const IDetector>(*it);
     if (!det)
     {
       nonDetectors.push_back((*it)->getComponentID());
@@ -373,7 +373,7 @@ void Projection3D::getMaskedDetectors(QList<int>& dets)const
 void Projection3D::componentSelected(Mantid::Geometry::ComponentID id)
 {
 
-  IInstrument_const_sptr instr = m_instrActor->getInstrument();
+  Instrument_const_sptr instr = m_instrActor->getInstrument();
 
   if (id == NULL || id == instr->getComponentID())
   {
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ProjectionSurface.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ProjectionSurface.cpp
index bfca2bc3e4f154698b5fa7f251176d51aa99fa18..839eb482df35ac5b7b7a511cfabd7ce82ea68b1b 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ProjectionSurface.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/ProjectionSurface.cpp
@@ -5,7 +5,6 @@
 
 #include "MantidGeometry/IDetector.h"
 #include "MantidGeometry/Objects/Object.h"
-#include "MantidGeometry/IInstrument.h"
 
 #include <QRgb>
 #include <QSet>
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/RectangularDetectorActor.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/RectangularDetectorActor.cpp
index 322c0d7d1927bba0f601ec21888125d7a4edcdae..ff05f4725d50c215d31aff9622e171cfd7ebd4c5 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/RectangularDetectorActor.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/RectangularDetectorActor.cpp
@@ -3,7 +3,6 @@
 #include "RectangularDetectorActor.h"
 #include "InstrumentActor.h"
 
-#include "MantidGeometry/IInstrument.h"
 #include "MantidKernel/V3D.h"
 #include "MantidGeometry/Objects/Object.h"
 #include "MantidGeometry/Objects/BoundingBox.h"
diff --git a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/UnwrappedSurface.cpp b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/UnwrappedSurface.cpp
index 57eee980efd1ec09f7c968b664e5ed8a60e21fc2..5e0442edb33b143949fed1ec6dbe20709a76da84 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/UnwrappedSurface.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/InstrumentWidget/UnwrappedSurface.cpp
@@ -5,7 +5,7 @@
 
 #include "MantidGeometry/IDetector.h"
 #include "MantidGeometry/Objects/Object.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 
 #include <QRgb>
 #include <QSet>
@@ -340,7 +340,7 @@ bool hasParent(boost::shared_ptr<const Mantid::Geometry::IComponent> comp,Mantid
 
 void UnwrappedSurface::componentSelected(Mantid::Geometry::ComponentID id)
 {
-  boost::shared_ptr<const Mantid::Geometry::IInstrument> instr = m_instrActor->getInstrument();
+  boost::shared_ptr<const Mantid::Geometry::Instrument> instr = m_instrActor->getInstrument();
   if (id == NULL)
   {
     id = instr->getComponentID();
@@ -589,4 +589,4 @@ QString UnwrappedSurface::getInfoText()const
 QRectF UnwrappedSurface::getSurfaceBounds()const
 {
   return QRectF(m_viewRect.left(),m_viewRect.bottom(),m_viewRect.width(),-m_viewRect.height());
-}
\ No newline at end of file
+}
diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp b/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp
index dd0904ea19fab929d209f6ddf77f43f465667b1e..7a63a73a60e6c5e438c3b392bcd3abd08f36bf3d 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/MantidDock.cpp
@@ -535,7 +535,7 @@ void MantidDockWidget::populateExperimentInfoData(Mantid::API::ExperimentInfo_sp
   std::string s;
   std::ostringstream out;
 
-  IInstrument_sptr inst = workspace->getInstrument();
+  Instrument_const_sptr inst = workspace->getInstrument();
   out << "Instrument: " << inst->getName() << " ("
       << inst->getValidFromDate().to_string("%Y-%b-%d")
       << " to " << inst->getValidToDate().to_string("%Y-%b-%d") << ")";
diff --git a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp
index 1b4e3d88c85cfffb1dd3c300463408df800210e2..beb0f002053ad4511bd7a0cfc78a9688bc8c8561 100644
--- a/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp
+++ b/Code/Mantid/MantidPlot/src/Mantid/MantidUI.cpp
@@ -1527,7 +1527,7 @@ InstrumentWindow* MantidUI::getInstrumentView(const QString & wsName, int tab)
   if( !Mantid::API::AnalysisDataService::Instance().doesExist(wsName.toStdString()) ) return NULL;
   Mantid::API::MatrixWorkspace_sptr ws = boost::dynamic_pointer_cast<Mantid::API::MatrixWorkspace>(getWorkspace(wsName));
   if (!ws) return NULL;
-  Mantid::Geometry::IInstrument_const_sptr instr = ws->getInstrument();
+  Mantid::Geometry::Instrument_const_sptr instr = ws->getInstrument();
   if (!instr || instr->getName().empty())
   {
     return NULL;
@@ -3005,7 +3005,7 @@ void MantidUI::memoryImage2()
 // End of Windows specfic stuff
 //=======================================================================
 
-#include "MantidGeometry/Instrument/Instrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/Instrument/CompAssembly.h"
 
 void MantidUI::test()
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp
index 6f3a8154466d8409d8c7f3848cfa1af42a221c2a..818f8f5a9806ed6d9c86e7393093e88e409ed2f1 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MuonAnalysis.cpp
@@ -18,7 +18,6 @@
 #include "MantidAPI/WorkspaceGroup.h"
 #include "MantidAPI/SpectraDetectorMap.h"
 #include "MantidAPI/Run.h"
-#include "MantidGeometry/IInstrument.h"
 #include "MantidGeometry/IComponent.h"
 #include "MantidGeometry/IDetector.h"
 #include "MantidKernel/V3D.h"
@@ -2103,7 +2102,7 @@ void MuonAnalysis::setDummyGrouping(const int numDetectors)
  */
 void MuonAnalysis::setGroupingFromIDF(const std::string& mainFieldDirection, MatrixWorkspace_sptr matrix_workspace)
 {
-  IInstrument_sptr inst = matrix_workspace->getInstrument();
+  Instrument_const_sptr inst = matrix_workspace->getInstrument();
 
   QString instname = m_uiForm.instrSelector->currentText().toUpper();
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSDiagnostics.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSDiagnostics.cpp
index d6b61ee932ee9a56b04831eef3bc1fcf93dccf17..665620664e7d3b54cc8932301fb85335265d2cea 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSDiagnostics.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSDiagnostics.cpp
@@ -366,7 +366,7 @@ namespace MantidQt
       {
         return std::vector<boost::shared_ptr<RectDetectorDetails> > ();
       }
-      Mantid::Geometry::IInstrument_sptr inst=mws_sptr->getInstrument();
+      Mantid::Geometry::Instrument_const_sptr inst=mws_sptr->getInstrument();
       if(!inst)
       {       
         return std::vector<boost::shared_ptr<RectDetectorDetails> > ();
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp
index 68743b9527ee1658c5f5bc19ae89089ab21a95e1..bfc9efda66c50acaa2e6347bcc956767542e990a 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp
@@ -16,7 +16,7 @@
 #include "MantidAPI/AnalysisDataService.h"
 #include "MantidAPI/WorkspaceGroup.h"
 #include "MantidAPI/SpectraDetectorMap.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 #include "MantidGeometry/IComponent.h"
 #include "MantidKernel/V3D.h"
 #include "MantidKernel/Exception.h"
@@ -54,8 +54,7 @@ using namespace MantidQt::CustomInterfaces;
 using namespace Mantid::Kernel;
 using namespace Mantid::API;
 using namespace Mantid;
-using Mantid::Geometry::IInstrument_sptr;
-using Mantid::Geometry::IInstrument;
+using Mantid::Geometry::Instrument_const_sptr;
 
 // Initialize the logger
 Logger& SANSRunWindow::g_log = Logger::get("SANSRunWindow");
@@ -1031,8 +1030,8 @@ void SANSRunWindow::addTimeMasksToTable(const QString & mask_string, const QStri
  */
 void SANSRunWindow::componentLOQDistances(Mantid::API::MatrixWorkspace_sptr workspace, double & lms, double & lsda, double & lsdb)
 {
-  IInstrument_sptr instr = workspace->getInstrument();
-  if( instr == boost::shared_ptr<IInstrument>() ) return;
+  Instrument_const_sptr instr = workspace->getInstrument();
+  if( !instr ) return;
 
   Mantid::Geometry::IObjComponent_sptr source = instr->getSource();
   if( source == boost::shared_ptr<Mantid::Geometry::IObjComponent>() ) return;
@@ -1042,7 +1041,7 @@ void SANSRunWindow::componentLOQDistances(Mantid::API::MatrixWorkspace_sptr work
   lms = source->getPos().distance(sample->getPos()) * 1000.;
    
   //Find the main detector bank
-  boost::shared_ptr<Mantid::Geometry::IComponent> comp = instr->getComponentByName("main-detector-bank");
+  Mantid::Geometry::IComponent_const_sptr comp = instr->getComponentByName("main-detector-bank");
   if( comp != boost::shared_ptr<Mantid::Geometry::IComponent>() )
   {
     lsda = sample->getPos().distance(comp->getPos()) * 1000.;
@@ -1307,7 +1306,7 @@ void SANSRunWindow::setGeometryDetails(const QString & sample_logs, const QStrin
     sample_workspace = getGroupMember(workspace_ptr, 1);
   }
 
-  IInstrument_sptr instr = sample_workspace->getInstrument();
+  Instrument_const_sptr instr = sample_workspace->getInstrument();
   boost::shared_ptr<Mantid::Geometry::IComponent> source = instr->getSource();
 
   // Moderator-monitor distance is common to LOQ and S2D
@@ -1444,7 +1443,7 @@ void SANSRunWindow::setSANS2DGeometry(Mantid::API::MatrixWorkspace_sptr workspac
 {  
   double unitconv = 1000.;
 
-  IInstrument_sptr instr = workspace->getInstrument();
+  Instrument_const_sptr instr = workspace->getInstrument();
   boost::shared_ptr<Mantid::Geometry::IComponent> sample = instr->getSample();
   boost::shared_ptr<Mantid::Geometry::IComponent> source = instr->getSource();
   double distance = source->getDistance(*sample) * unitconv;
diff --git a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWDiag.h b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWDiag.h
index b5508e1633240eff1598cb3af56aa4fafebdd90a..1f1b92ddc774e574983ee4f7c5104653ca9e741f 100644
--- a/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWDiag.h
+++ b/Code/Mantid/MantidQt/MantidWidgets/inc/MantidQtMantidWidgets/MWDiag.h
@@ -16,7 +16,7 @@ namespace Mantid
 {
   namespace Geometry
   {
-    class IInstrument;
+    class Instrument;
   }
 }
 
@@ -71,9 +71,9 @@ namespace MantidQt
 
       void closeDialog();
       QString openFileDialog(const bool save, const QStringList &exts);
-      boost::shared_ptr<Mantid::Geometry::IInstrument> getInstrument(const QString & name);
+      boost::shared_ptr<const Mantid::Geometry::Instrument> getInstrument(const QString & name);
       QString getSetting(const QString & settingName, 
-			 boost::shared_ptr<Mantid::Geometry::IInstrument> inst = boost::shared_ptr<Mantid::Geometry::IInstrument>(), 
+			 boost::shared_ptr<const Mantid::Geometry::Instrument> inst = boost::shared_ptr<const Mantid::Geometry::Instrument>(),
 			 const QString & idfName = "") const;
       void saveDefaults();
       void setupToolTips();
diff --git a/Code/Mantid/MantidQt/MantidWidgets/src/MWDiag.cpp b/Code/Mantid/MantidQt/MantidWidgets/src/MWDiag.cpp
index 4fc09e6ad7d16551668a5424cd213465aaa8e45b..43c5f1cf72e5e8dd3b1ba9687abda97820325afd 100644
--- a/Code/Mantid/MantidQt/MantidWidgets/src/MWDiag.cpp
+++ b/Code/Mantid/MantidQt/MantidWidgets/src/MWDiag.cpp
@@ -8,7 +8,7 @@
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidKernel/Exception.h"
 #include "MantidAPI/FileProperty.h"
-#include "MantidGeometry/IInstrument.h"
+#include "MantidGeometry/Instrument.h"
 
 #include <QSignalMapper>
 #include <QFileInfo>
@@ -25,7 +25,7 @@ using namespace Mantid::Kernel;
 using namespace Mantid::API;
 using namespace MantidQt::API;
 using namespace MantidQt::MantidWidgets;
-using Mantid::Geometry::IInstrument_sptr;
+using Mantid::Geometry::Instrument_const_sptr;
 
 MWDiag::MWDiag(QWidget *parent, QString prevSettingsGr, const QComboBox * const instru):
   MantidWidget(parent),
@@ -47,7 +47,7 @@ MWDiag::MWDiag(QWidget *parent, QString prevSettingsGr, const QComboBox * const
 void MWDiag::loadSettings()
 {
   // Want the defaults from the instrument if nothing is saved in the config
-  IInstrument_sptr instrument = getInstrument(m_instru->currentText());
+  Instrument_const_sptr instrument = getInstrument(m_instru->currentText());
 
   m_designWidg.leIFile->setText(getSetting("input mask"));
   m_designWidg.leOFile->setText(getSetting("output file"));
@@ -87,7 +87,7 @@ void MWDiag::setSumState(bool checked)
 /**
  * Get an instrument pointer for the name instrument
  */
-IInstrument_sptr MWDiag::getInstrument(const QString & name)
+Instrument_const_sptr MWDiag::getInstrument(const QString & name)
 {
   std::string ws_name = "__empty_" + name.toStdString();
   
@@ -101,7 +101,7 @@ IInstrument_sptr MWDiag::getInstrument(const QString & name)
     runPythonCode(pyInput);
     if( !dataStore.doesExist(ws_name) )
     {
-      return IInstrument_sptr();
+      return Instrument_const_sptr();
     }
   }
   MatrixWorkspace_sptr inst_ws = 
@@ -110,8 +110,8 @@ IInstrument_sptr MWDiag::getInstrument(const QString & name)
   return inst_ws->getInstrument();
 }
 
-QString MWDiag::getSetting(const QString & settingName, IInstrument_sptr instrument,
-			   const QString & idfName) const
+QString MWDiag::getSetting(const QString & settingName, Instrument_const_sptr instrument,
+                           const QString & idfName) const
 {
   QString value;
   if( m_prevSets.contains(settingName) )