diff --git a/Framework/Kernel/inc/MantidKernel/CatalogInfo.h b/Framework/Kernel/inc/MantidKernel/CatalogInfo.h
index 1f1af9ef2bf427e4df8b15e6d54b883a2c3843e0..d541b294ed7ec651cd9d00b4165a4b619df1f3ff 100644
--- a/Framework/Kernel/inc/MantidKernel/CatalogInfo.h
+++ b/Framework/Kernel/inc/MantidKernel/CatalogInfo.h
@@ -64,6 +64,8 @@ public:
   virtual const std::string macPrefix() const;
   /// Obtain Linux prefix from facility file.
   const std::string linuxPrefix() const;
+  /// Clone
+  virtual CatalogInfo *clone() const;
 
 private:
   /// Obtain the attribute from a given element tag and attribute name.
diff --git a/Framework/Kernel/inc/MantidKernel/ICatalogInfo.h b/Framework/Kernel/inc/MantidKernel/ICatalogInfo.h
index 4447ed957bb32805e45a7436065c4a07e84ea1c2..780a261e5e29988332c1e1fbd7f59099ae38688f 100644
--- a/Framework/Kernel/inc/MantidKernel/ICatalogInfo.h
+++ b/Framework/Kernel/inc/MantidKernel/ICatalogInfo.h
@@ -46,8 +46,11 @@ public:
   virtual const std::string macPrefix() const = 0;
   /// Obtain Linux prefix from facility file.
   virtual const std::string linuxPrefix() const = 0;
+  /// Clone
+  virtual ICatalogInfo *clone() const = 0;
   /// Transform's the archive path based on operating system used.
   std::string transformArchivePath(const std::string &path) const;
+
   /// virtual destructor
   virtual ~ICatalogInfo();
 
diff --git a/Framework/Kernel/inc/MantidKernel/UserCatalogInfo.h b/Framework/Kernel/inc/MantidKernel/UserCatalogInfo.h
index 929c087e4d2c8cad9b2f53c50eb82cdc278502df..0312b59f665dd4d281a14893819c3f1a62da860b 100644
--- a/Framework/Kernel/inc/MantidKernel/UserCatalogInfo.h
+++ b/Framework/Kernel/inc/MantidKernel/UserCatalogInfo.h
@@ -5,6 +5,7 @@
 #include "MantidKernel/ICatalogInfo.h"
 #include "Poco/Path.h"
 #include <boost/optional.hpp>
+#include <memory>
 
 namespace Mantid {
 namespace Kernel {
@@ -65,6 +66,8 @@ class MANTID_KERNEL_DLL UserCatalogInfo : public ICatalogInfo {
 public:
   UserCatalogInfo(const ICatalogInfo &catInfo,
                   const CatalogConfigService &catalogConfigService);
+
+  UserCatalogInfo(const UserCatalogInfo &other);
   virtual ~UserCatalogInfo();
 
   // ICatalogInfo interface
@@ -75,13 +78,13 @@ public:
   const std::string windowsPrefix() const;
   const std::string macPrefix() const;
   const std::string linuxPrefix() const;
+  UserCatalogInfo *clone() const;
 
 private:
   /// Facility catalog info. Aggregation only solution here.
-  const ICatalogInfo &m_catInfo;
-
-  /// Catalog config service. Aggregation only solution here.
-  const CatalogConfigService &m_catalogConfigService;
+  const std::unique_ptr<ICatalogInfo> m_catInfo;
+  /// Archive mount point
+  const OptionalPath m_mountPoint;
 };
 
 } // namespace Kernel
diff --git a/Framework/Kernel/src/CatalogInfo.cpp b/Framework/Kernel/src/CatalogInfo.cpp
index 4329ad0b230d947d188d15748dfb7938905b733d..f4d2530deedddc808135380fe88345005336b7f8 100644
--- a/Framework/Kernel/src/CatalogInfo.cpp
+++ b/Framework/Kernel/src/CatalogInfo.cpp
@@ -71,6 +71,12 @@ const std::string CatalogInfo::macPrefix() const { return (m_macPrefix); }
  */
 const std::string CatalogInfo::linuxPrefix() const { return (m_linuxPrefix); }
 
+/**
+ * Virtual constructor
+ * @return deep copy of this
+ */
+CatalogInfo *CatalogInfo::clone() const { return new CatalogInfo(*this); }
+
 /**
  * Obtain the attribute from a given element tag and attribute name.
  * @param element       :: The name of the element in the XML file.
diff --git a/Framework/Kernel/src/UserCatalogInfo.cpp b/Framework/Kernel/src/UserCatalogInfo.cpp
index 832042b201bb6ed1946a50f808ec448734c62ea8..4b0987186e969b3abb2be07b986f28d73b9c8e4d 100644
--- a/Framework/Kernel/src/UserCatalogInfo.cpp
+++ b/Framework/Kernel/src/UserCatalogInfo.cpp
@@ -6,48 +6,53 @@ namespace Kernel {
 UserCatalogInfo::UserCatalogInfo(
     const ICatalogInfo &catInfo,
     const CatalogConfigService &catalogConfigService)
-    : m_catInfo(catInfo), m_catalogConfigService(catalogConfigService) {}
+    : m_catInfo(catInfo.clone()),
+      m_mountPoint(catalogConfigService.preferredMountPoint()) {}
+
+UserCatalogInfo::UserCatalogInfo(const UserCatalogInfo &other)
+    : m_catInfo(other.m_catInfo->clone()), m_mountPoint(other.m_mountPoint) {}
 
 UserCatalogInfo::~UserCatalogInfo() {}
 
 const std::string UserCatalogInfo::catalogName() const {
-  return m_catInfo.catalogName();
+  return m_catInfo->catalogName();
 }
 
 const std::string UserCatalogInfo::soapEndPoint() const {
-  return m_catInfo.soapEndPoint();
+  return m_catInfo->soapEndPoint();
 }
 
 const std::string UserCatalogInfo::externalDownloadURL() const {
-  return m_catInfo.externalDownloadURL();
+  return m_catInfo->externalDownloadURL();
 }
 
 const std::string UserCatalogInfo::catalogPrefix() const {
-  return m_catInfo.catalogPrefix();
+  return m_catInfo->catalogPrefix();
 }
 
 const std::string UserCatalogInfo::windowsPrefix() const {
-  auto userPrefix = m_catalogConfigService.preferredMountPoint();
-  if (userPrefix) {
-    return userPrefix.get();
+  if (m_mountPoint) {
+    return m_mountPoint.get();
   }
-  return m_catInfo.windowsPrefix();
+  return m_catInfo->windowsPrefix();
 }
 
 const std::string UserCatalogInfo::macPrefix() const {
-  auto userPrefix = m_catalogConfigService.preferredMountPoint();
-  if (userPrefix) {
-    return userPrefix.get();
+  if (m_mountPoint) {
+    return m_mountPoint.get();
   }
-  return m_catInfo.macPrefix();
+  return m_catInfo->macPrefix();
 }
 
 const std::string UserCatalogInfo::linuxPrefix() const {
-  auto userPrefix = m_catalogConfigService.preferredMountPoint();
-  if (userPrefix) {
-    return userPrefix.get();
+  if (m_mountPoint) {
+    return m_mountPoint.get();
   }
-  return m_catInfo.linuxPrefix();
+  return m_catInfo->linuxPrefix();
+}
+
+UserCatalogInfo *UserCatalogInfo::clone() const {
+  return new UserCatalogInfo(*this);
 }
 
 } // namespace Kernel
diff --git a/Framework/Kernel/test/UserCatalogInfoTest.h b/Framework/Kernel/test/UserCatalogInfoTest.h
index 87a63870a7a78a7601e7091b03dc5498a89bf26e..effc4412add3a5d5d9a114151b6a80a0a2524931 100644
--- a/Framework/Kernel/test/UserCatalogInfoTest.h
+++ b/Framework/Kernel/test/UserCatalogInfoTest.h
@@ -34,6 +34,7 @@ public:
   MOCK_CONST_METHOD0(windowsPrefix, const std::string());
   MOCK_CONST_METHOD0(macPrefix, const std::string());
   MOCK_CONST_METHOD0(linuxPrefix, const std::string());
+  MOCK_CONST_METHOD0(clone, ICatalogInfo *());
   virtual ~MockICatalogInfo() {}
 };
 
@@ -49,14 +50,19 @@ public:
   void test_pass_through_adaptee() {
 
     // Adaptee
-    MockICatalogInfo mockCatInfo;
-    EXPECT_CALL(mockCatInfo, catalogName()).Times(Exactly(1));
-    EXPECT_CALL(mockCatInfo, catalogPrefix()).Times(Exactly(1));
-    EXPECT_CALL(mockCatInfo, externalDownloadURL()).Times(Exactly(1));
-    EXPECT_CALL(mockCatInfo, linuxPrefix()).Times(Exactly(1));
-    EXPECT_CALL(mockCatInfo, macPrefix()).Times(Exactly(1));
-    EXPECT_CALL(mockCatInfo, windowsPrefix()).Times(Exactly(1));
-    EXPECT_CALL(mockCatInfo, soapEndPoint()).Times(Exactly(1));
+    MockICatalogInfo host;
+    auto mockCatInfo = new MockICatalogInfo;
+
+    // because the input gets cloned, we need to set our expectations upon the
+    // clone product
+    EXPECT_CALL(host, clone()).WillOnce(Return(mockCatInfo));
+    EXPECT_CALL(*mockCatInfo, catalogName()).Times(Exactly(1));
+    EXPECT_CALL(*mockCatInfo, catalogPrefix()).Times(Exactly(1));
+    EXPECT_CALL(*mockCatInfo, externalDownloadURL()).Times(Exactly(1));
+    EXPECT_CALL(*mockCatInfo, linuxPrefix()).Times(Exactly(1));
+    EXPECT_CALL(*mockCatInfo, macPrefix()).Times(Exactly(1));
+    EXPECT_CALL(*mockCatInfo, windowsPrefix()).Times(Exactly(1));
+    EXPECT_CALL(*mockCatInfo, soapEndPoint()).Times(Exactly(1));
 
     // The user service will return to the effect that there are no user
     // overrides
@@ -65,7 +71,7 @@ public:
         .WillRepeatedly(Return(OptionalPath())); // No user override
 
     // Setup the UserCatalogInfo
-    UserCatalogInfo userAdapter(mockCatInfo, mockConfigService);
+    UserCatalogInfo userAdapter(host, mockConfigService);
 
     userAdapter.catalogName();
     userAdapter.catalogPrefix();
@@ -81,53 +87,66 @@ public:
 
   void test_mac_path_customizeable() {
 
-    MockICatalogInfo mockCatInfo;
+    auto mockCatInfo = new MockICatalogInfo;
+    MockICatalogInfo host;
     MockCatalogConfigService mockConfigService;
 
-    const std::string expectedPath = "/custom_mac_mountpoint";
+    const std::string expectedPath = "/custom_windows_mountpoint";
 
     // Set the User override to be used to return the expected path.
     EXPECT_CALL(mockConfigService, preferredMountPoint())
         .WillRepeatedly(Return(OptionalPath(expectedPath))); // overriden path.
 
+    EXPECT_CALL(host, clone())
+        .WillOnce(Return(mockCatInfo)); // because the input gets cloned, we
+                                        // need to set our expectations upon the
+                                        // clone product
     // Expect that the facility default is not used.
-    EXPECT_CALL(mockCatInfo, macPrefix()).Times(Exactly(0));
+    EXPECT_CALL(*mockCatInfo, macPrefix()).Times(Exactly(0));
 
-    UserCatalogInfo userCatInfo(mockCatInfo, mockConfigService);
+    UserCatalogInfo userCatInfo(host, mockConfigService);
     std::string actualPath = userCatInfo.macPrefix();
 
     TSM_ASSERT_EQUALS("Mac mount point should have come from user override",
                       expectedPath, actualPath);
-    TS_ASSERT(Mock::VerifyAndClear(&mockCatInfo));
+    TS_ASSERT(Mock::VerifyAndClear(mockCatInfo));
+    TS_ASSERT(Mock::VerifyAndClear(&host));
     TS_ASSERT(Mock::VerifyAndClear(&mockConfigService));
   }
 
   void test_linux_path_customizeable() {
 
-    MockICatalogInfo mockCatInfo;
+    auto mockCatInfo = new MockICatalogInfo;
+    MockICatalogInfo host;
     MockCatalogConfigService mockConfigService;
 
-    const std::string expectedPath = "/custom_linux_mountpoint";
+    const std::string expectedPath = "/custom_windows_mountpoint";
 
     // Set the User override to be used to return the expected path.
     EXPECT_CALL(mockConfigService, preferredMountPoint())
         .WillRepeatedly(Return(OptionalPath(expectedPath))); // overriden path.
 
+    EXPECT_CALL(host, clone())
+        .WillOnce(Return(mockCatInfo)); // because the input gets cloned, we
+                                        // need to set our expectations upon the
+                                        // clone product
     // Expect that the facility default is not used.
-    EXPECT_CALL(mockCatInfo, linuxPrefix()).Times(Exactly(0));
+    EXPECT_CALL(*mockCatInfo, linuxPrefix()).Times(Exactly(0));
 
-    UserCatalogInfo userCatInfo(mockCatInfo, mockConfigService);
+    UserCatalogInfo userCatInfo(host, mockConfigService);
     std::string actualPath = userCatInfo.linuxPrefix();
 
     TSM_ASSERT_EQUALS("Linux mount point should have come from user override",
                       expectedPath, actualPath);
-    TS_ASSERT(Mock::VerifyAndClear(&mockCatInfo));
+    TS_ASSERT(Mock::VerifyAndClear(mockCatInfo));
+    TS_ASSERT(Mock::VerifyAndClear(&host));
     TS_ASSERT(Mock::VerifyAndClear(&mockConfigService));
   }
 
   void test_windows_path_customizeable() {
 
-    MockICatalogInfo mockCatInfo;
+    auto mockCatInfo = new MockICatalogInfo;
+    MockICatalogInfo host;
     MockCatalogConfigService mockConfigService;
 
     const std::string expectedPath = "/custom_windows_mountpoint";
@@ -136,15 +155,20 @@ public:
     EXPECT_CALL(mockConfigService, preferredMountPoint())
         .WillRepeatedly(Return(OptionalPath(expectedPath))); // overriden path.
 
+    EXPECT_CALL(host, clone())
+        .WillOnce(Return(mockCatInfo)); // because the input gets cloned, we
+                                        // need to set our expectations upon the
+                                        // clone product
     // Expect that the facility default is not used.
-    EXPECT_CALL(mockCatInfo, windowsPrefix()).Times(Exactly(0));
+    EXPECT_CALL(*mockCatInfo, windowsPrefix()).Times(Exactly(0));
 
-    UserCatalogInfo userCatInfo(mockCatInfo, mockConfigService);
+    UserCatalogInfo userCatInfo(host, mockConfigService);
     std::string actualPath = userCatInfo.windowsPrefix();
 
     TSM_ASSERT_EQUALS("Windows mount point should have come from user override",
                       expectedPath, actualPath);
-    TS_ASSERT(Mock::VerifyAndClear(&mockCatInfo));
+    TS_ASSERT(Mock::VerifyAndClear(mockCatInfo));
+    TS_ASSERT(Mock::VerifyAndClear(&host));
     TS_ASSERT(Mock::VerifyAndClear(&mockConfigService));
   }
 
diff --git a/MantidQt/CustomInterfaces/CMakeLists.txt b/MantidQt/CustomInterfaces/CMakeLists.txt
index 08b8c62d2cdcba6fc952a66ae25316d9a3653158..099c5731b8a3a130e954309f03a7cf0317a7cc6f 100644
--- a/MantidQt/CustomInterfaces/CMakeLists.txt
+++ b/MantidQt/CustomInterfaces/CMakeLists.txt
@@ -204,6 +204,7 @@ set ( INC_FILES
 	inc/MantidQtCustomInterfaces/ReflMainView.h
 	inc/MantidQtCustomInterfaces/ReflMainViewPresenter.h
 	inc/MantidQtCustomInterfaces/ReflMeasureTransferStrategy.h
+	inc/MantidQtCustomInterfaces/ReflMeasurementSource.h
 	inc/MantidQtCustomInterfaces/ReflSearchModel.h
 	inc/MantidQtCustomInterfaces/ReflTableSchema.h
 	inc/MantidQtCustomInterfaces/ReflTransferStrategy.h
diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMeasureTransferStrategy.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMeasureTransferStrategy.h
index eeec7c946595326620e07e3fb23257577cf84271..8efeb1fce2517fa4a0f8818a19c301eb69ab7338 100644
--- a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMeasureTransferStrategy.h
+++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMeasureTransferStrategy.h
@@ -7,10 +7,21 @@
 #include <vector>
 #include <map>
 #include <string>
+#include <memory>
+
+namespace Mantid {
+namespace Kernel {
+// Forward dec
+class ICatalogInfo;
+}
+}
 
 namespace MantidQt {
 namespace CustomInterfaces {
 
+// Forward dec
+class ReflMeasurementSource;
+
 /** ReflMeasureTransferStrategy : Transfer strategy that uses the measurement
   information
   from the loaded workspaces to complete the transfer.
@@ -39,7 +50,11 @@ namespace CustomInterfaces {
 class MANTIDQT_CUSTOMINTERFACES_DLL ReflMeasureTransferStrategy
     : public ReflTransferStrategy {
 public:
-  ReflMeasureTransferStrategy();
+  ReflMeasureTransferStrategy(
+      std::unique_ptr<Mantid::Kernel::ICatalogInfo> catInfo,
+      std::unique_ptr<ReflMeasurementSource> measurementSource);
+
+  ReflMeasureTransferStrategy(const ReflMeasureTransferStrategy &other);
 
   virtual std::vector<std::map<std::string, std::string>>
   transferRuns(const SearchResultMap &searchResults,
@@ -50,6 +65,13 @@ public:
   virtual bool knownFileType(const std::string &filename) const;
 
   virtual ~ReflMeasureTransferStrategy();
+
+private:
+  /// Catalog information needed for transformations
+  std::unique_ptr<Mantid::Kernel::ICatalogInfo> m_catInfo;
+
+  /// Measurement source for loading.
+  std::unique_ptr<ReflMeasurementSource> m_measurementSource;
 };
 
 } // namespace CustomInterfaces
diff --git a/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMeasurementSource.h b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMeasurementSource.h
new file mode 100644
index 0000000000000000000000000000000000000000..2f2cb98f177aed8d96a6a4f8153153ad893b5d46
--- /dev/null
+++ b/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ReflMeasurementSource.h
@@ -0,0 +1,58 @@
+#ifndef MANTIDQT_CUSTOMINTERFACES_REFLMEASUREMENTSOURCE_H_
+#define MANTIDQT_CUSTOMINTERFACES_REFLMEASUREMENTSOURCE_H_
+
+#include "MantidQtCustomInterfaces/DllConfig.h"
+#include <string>
+
+namespace MantidQt {
+namespace CustomInterfaces {
+
+/**
+ * Measurement block
+ */
+struct Measurement {
+  std::string measurementId;
+  std::string subId;
+  std::string label;
+  std::string type;
+};
+
+/** ReflMeasurementSource : Repository pattern abstracting data mapping from
+ domain. Specifically for accessing
+ * measurement information from some data map/repository.
+
+  Copyright &copy; 2015 ISIS Rutherford Appleton Laboratory, NScD Oak Ridge
+  National Laboratory & European Spallation Source
+
+  This file is part of Mantid.
+
+  Mantid is free software; you can redistribute it and/or modify
+  it under the terms of the GNU General Public License as published by
+  the Free Software Foundation; either version 3 of the License, or
+  (at your option) any later version.
+
+  Mantid is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+  GNU General Public License for more details.
+
+  You should have received a copy of the GNU General Public License
+  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+  File change history is stored at: <https://github.com/mantidproject/mantid>
+  Code Documentation is available at: <http://doxygen.mantidproject.org>
+*/
+class MANTIDQT_CUSTOMINTERFACES_DLL ReflMeasurementSource {
+public:
+  /// Get the measurement somehow using location
+  virtual Measurement obtain(const std::string &location) const = 0;
+  /// Virtual destructor
+  virtual ReflMeasurementSource *clone() const = 0;
+  /// Destructor
+  virtual ~ReflMeasurementSource(){};
+};
+
+} // namespace CustomInterfaces
+} // namespace Mantid
+
+#endif /* MANTIDQT_CUSTOMINTERFACES_REFLMEASUREMENTSOURCE_H_ */
diff --git a/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp b/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp
index 823fc725ca4eb30d9b4f28171b73d08121d8c6c3..068c448d3c2c15cfa3c58f9acfbcb45f82d0128e 100644
--- a/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp
+++ b/MantidQt/CustomInterfaces/src/ReflMainViewPresenter.cpp
@@ -21,6 +21,10 @@
 #include "MantidQtMantidWidgets/AlgorithmHintStrategy.h"
 #include "MantidQtCustomInterfaces/ParseKeyValueString.h"
 
+#include "MantidKernel/FacilityInfo.h"
+#include "MantidKernel/CatalogInfo.h"
+#include "MantidKernel/ConfigService.h"
+
 #include <boost/regex.hpp>
 #include <boost/tokenizer.hpp>
 #include <fstream>
@@ -140,6 +144,15 @@ ReflMainViewPresenter::ReflMainViewPresenter(
       m_clearObserver(*this, &ReflMainViewPresenter::handleClearEvent),
       m_renameObserver(*this, &ReflMainViewPresenter::handleRenameEvent),
       m_replaceObserver(*this, &ReflMainViewPresenter::handleReplaceEvent) {
+
+  // TODO. Select strategy.
+  /*
+  std::unique_ptr<CatalogConfigService> catConfigService(
+      makeCatalogConfigServiceAdapter(ConfigService::Instance()));
+  UserCatalogInfo catalogInfo(
+      ConfigService::Instance().getFacility().catalogInfo(), *catConfigService);
+  */
+
   // Initialise options
   initOptions();
 
diff --git a/MantidQt/CustomInterfaces/src/ReflMeasureTransferStrategy.cpp b/MantidQt/CustomInterfaces/src/ReflMeasureTransferStrategy.cpp
index 99de22a5851cdc33f203a878b805ddc22830c24d..99de3eef1b0439a3e92629f050e0a4440ee661da 100644
--- a/MantidQt/CustomInterfaces/src/ReflMeasureTransferStrategy.cpp
+++ b/MantidQt/CustomInterfaces/src/ReflMeasureTransferStrategy.cpp
@@ -1,5 +1,13 @@
 #include "MantidQtCustomInterfaces/ReflMeasureTransferStrategy.h"
+#include "MantidQtCustomInterfaces/ReflMeasurementSource.h"
+
+#include "MantidKernel/ICatalogInfo.h"
+#include "MantidKernel/ProgressBase.h"
+#include "MantidKernel/UserCatalogInfo.h"
 #include <boost/regex.hpp>
+#include <memory>
+
+using namespace Mantid::Kernel;
 
 namespace MantidQt {
 namespace CustomInterfaces {
@@ -7,7 +15,18 @@ namespace CustomInterfaces {
 //----------------------------------------------------------------------------------------------
 /** Constructor
  */
-ReflMeasureTransferStrategy::ReflMeasureTransferStrategy() {}
+ReflMeasureTransferStrategy::ReflMeasureTransferStrategy(
+    std::unique_ptr<ICatalogInfo> catInfo,
+    std::unique_ptr<ReflMeasurementSource> measurementSource)
+    : m_catInfo(std::move(catInfo)),
+      m_measurementSource(std::move(measurementSource)) {}
+
+ReflMeasureTransferStrategy::ReflMeasureTransferStrategy(
+    const ReflMeasureTransferStrategy &other)
+    : m_catInfo(other.m_catInfo->clone()),
+      m_measurementSource(other.m_measurementSource->clone())
+
+{}
 
 //----------------------------------------------------------------------------------------------
 /** Destructor
@@ -19,6 +38,25 @@ MantidQt::CustomInterfaces::ReflMeasureTransferStrategy::transferRuns(
     const SearchResultMap &searchResults,
     Mantid::Kernel::ProgressBase &progress) {
 
+  for (auto it = searchResults.begin(); it != searchResults.end(); ++it) {
+    const auto location = it->second.location;
+    const auto run = it->first;
+
+    const auto loadPath = m_catInfo->transformArchivePath(location);
+
+    Measurement metaData = m_measurementSource->obtain(loadPath);
+    /*
+    const Poco::File filePath(loadPath);
+    if (filePath.exists() && filePath.isFile()) {
+
+
+    } else {
+        // Load from this path
+    }
+    */
+
+    progress.report();
+  }
   return std::vector<std::map<std::string, std::string>>(1); // HACK
 }
 
@@ -28,6 +66,10 @@ ReflMeasureTransferStrategy *ReflMeasureTransferStrategy::clone() const {
 
 bool
 ReflMeasureTransferStrategy::knownFileType(const std::string &filename) const {
+
+  // TODO. I think this file type matching should be deferred to the
+  // ReflMeasurementSource
+
   boost::regex pattern("nxs$", boost::regex::icase);
   boost::smatch match; // Unused.
   return boost::regex_search(filename, match, pattern);
diff --git a/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h b/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h
index 5658a0f7a3f28f605b7ceecad908ded4063eae32..57af42cab9ce788d4ae936510bea99902bfba062 100644
--- a/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h
+++ b/MantidQt/CustomInterfaces/test/ReflMainViewMockObjects.h
@@ -8,6 +8,7 @@
 #include "MantidQtCustomInterfaces/ReflTableSchema.h"
 #include "MantidQtCustomInterfaces/QReflTableModel.h"
 #include "MantidAPI/TableRow.h"
+#include "MantidKernel/ICatalogInfo.h"
 #include "MantidKernel/ProgressBase.h"
 
 using namespace MantidQt::CustomInterfaces;
@@ -75,10 +76,22 @@ public:
 };
 
 class MockProgressBase : public Mantid::Kernel::ProgressBase {
-
 public:
   MOCK_METHOD1(doReport, void(const std::string &));
   ~MockProgressBase() {}
 };
 
+class MockICatalogInfo : public Mantid::Kernel::ICatalogInfo {
+public:
+  MOCK_CONST_METHOD0(catalogName, const std::string());
+  MOCK_CONST_METHOD0(soapEndPoint, const std::string());
+  MOCK_CONST_METHOD0(externalDownloadURL, const std::string());
+  MOCK_CONST_METHOD0(catalogPrefix, const std::string());
+  MOCK_CONST_METHOD0(windowsPrefix, const std::string());
+  MOCK_CONST_METHOD0(macPrefix, const std::string());
+  MOCK_CONST_METHOD0(linuxPrefix, const std::string());
+  MOCK_CONST_METHOD0(clone, ICatalogInfo *());
+  virtual ~MockICatalogInfo() {}
+};
+
 #endif /*MANTID_CUSTOMINTERFACES_REFLMAINVIEWMOCKOBJECTS_H*/
diff --git a/MantidQt/CustomInterfaces/test/ReflMeasureTransferStrategyTest.h b/MantidQt/CustomInterfaces/test/ReflMeasureTransferStrategyTest.h
index b72532313281468aafb07e5bff99c876ee7fb52a..9a906ee390849a9dd4e555bffed1d8cc8583cfef 100644
--- a/MantidQt/CustomInterfaces/test/ReflMeasureTransferStrategyTest.h
+++ b/MantidQt/CustomInterfaces/test/ReflMeasureTransferStrategyTest.h
@@ -2,8 +2,22 @@
 #define MANTID_CUSTOMINTERFACES_REFLMEASURETRANSFERSTRATEGYTEST_H_
 
 #include <cxxtest/TestSuite.h>
-
+#include "ReflMainViewMockObjects.h"
 #include "MantidQtCustomInterfaces/ReflMeasureTransferStrategy.h"
+#include "MantidQtCustomInterfaces/ReflMeasurementSource.h"
+#include <memory>
+#include <gmock/gmock.h>
+
+using namespace testing;
+
+class MockReflMeasurementSource
+    : public MantidQt::CustomInterfaces::ReflMeasurementSource {
+public:
+  MOCK_CONST_METHOD1(
+      obtain, MantidQt::CustomInterfaces::Measurement(const std::string &));
+  MOCK_CONST_METHOD0(clone, MockReflMeasurementSource *());
+  ~MockReflMeasurementSource() {}
+};
 
 using MantidQt::CustomInterfaces::ReflMeasureTransferStrategy;
 
@@ -19,14 +33,33 @@ public:
   }
 
   void test_clone() {
-    ReflMeasureTransferStrategy strategy;
+
+    // Sub component ICatalogInfo will be cloned
+    auto pCatInfo = new MockICatalogInfo;
+    EXPECT_CALL(*pCatInfo, clone()).WillOnce(Return(new MockICatalogInfo));
+
+    // Sub component Measurment source will be cloned
+    auto pMeasurementSource = new MockReflMeasurementSource;
+    EXPECT_CALL(*pMeasurementSource, clone())
+        .WillOnce(Return(new MockReflMeasurementSource));
+
+    // Create it
+    ReflMeasureTransferStrategy strategy(
+        std::move(std::unique_ptr<MockICatalogInfo>(pCatInfo)),
+        std::move(
+            std::unique_ptr<MockReflMeasurementSource>(pMeasurementSource)));
+    // Clone it
     auto *clone = strategy.clone();
     TS_ASSERT(dynamic_cast<ReflMeasureTransferStrategy *>(clone));
     delete clone;
   }
 
   void test_filtering() {
-    ReflMeasureTransferStrategy strategy;
+
+    ReflMeasureTransferStrategy strategy(
+        std::unique_ptr<MockICatalogInfo>(new MockICatalogInfo),
+        std::unique_ptr<MockReflMeasurementSource>(
+            new MockReflMeasurementSource));
 
     // ISIS nexus format files can have the right logs.
     TSM_ASSERT("Yes this transfer mechanism should know about nexus formats",