diff --git a/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h b/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h
index 01edd88c41687fcb3dff71a37e7140f1cd711036..c22d72370816a2ddc30d48b49f2b1701f46aae74 100644
--- a/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h
+++ b/Code/Mantid/Framework/Kernel/inc/MantidKernel/ConfigService.h
@@ -188,6 +188,8 @@ namespace Mantid
       std::string defaultConfig() const;
       /// Writes out a fresh user properties file
       void createUserPropertiesFile() const;
+      /// Adds the passed path to the end of the list of data search paths
+      void appendDataSearchDir(const std::string & path);
       /// Convert any relative paths to absolute ones and store them locally so that
       /// if the working directory is altered the paths will not be affected
       void convertRelativeToAbsolute();
@@ -197,6 +199,8 @@ namespace Mantid
       void cacheDataSearchPaths();
       /// Create the storage of the user search directories
       void cacheUserSearchPaths();
+      /// Returns true if the path is in the data search list
+      bool isADataSearchDir(const std::string & path) const;
 
       // Forward declaration of inner class
       template <class T>
diff --git a/Code/Mantid/Framework/Kernel/src/ConfigService.cpp b/Code/Mantid/Framework/Kernel/src/ConfigService.cpp
index 55e082087b12f472f8202de66813bd7c55ef3df6..7e114ea188f70041e7c1f86ef0ec52b61d78a3eb 100644
--- a/Code/Mantid/Framework/Kernel/src/ConfigService.cpp
+++ b/Code/Mantid/Framework/Kernel/src/ConfigService.cpp
@@ -465,6 +465,46 @@ void ConfigServiceImpl::cacheUserSearchPaths()
   }
 }
 
+/**
+ *  The path that is passed should be as returned by makeAbsolute() and
+ *  this function will return true if that path is in the list
+ *  @param path the absolute path name to search for
+ *  @return true if the path was found
+ */
+bool ConfigServiceImpl::isADataSearchDir(const std::string & path) const
+{
+  std::vector<std::string>::const_iterator it = m_DataSearchDirs.begin();
+  for( ; it != m_DataSearchDirs.end(); ++it)
+  {
+    if ( path == *it )
+    {
+      return true;
+    }
+  }
+  return false;
+}
+
+/**
+ *  Adds the passed path to the end of the list of data search paths
+ *  the path name must be absolute
+ *  @param path the absolute path to add
+ */
+void ConfigServiceImpl::appendDataSearchDir(const std::string & path)
+{
+  if ( ! isADataSearchDir(path) )
+  {
+    std::string newSearchString;
+    std::vector<std::string>::const_iterator it = m_DataSearchDirs.begin();
+    for( ; it != m_DataSearchDirs.end(); ++it)
+    {
+      newSearchString.append(*it);
+      newSearchString.append(";");
+    }
+    newSearchString.append(path);
+    setString("datasearch.directories", newSearchString);
+  }
+}
+
 /**
  * writes a basic placeholder user.properties file to disk
  * any errors are caught and logged, but not propagated
@@ -726,11 +766,15 @@ void ConfigServiceImpl::setString(const std::string & key, const std::string & v
   {
     cacheDataSearchPaths();
   }
-
-  if (key == "usersearch.directories")
+  else if (key == "usersearch.directories")
   {
     cacheUserSearchPaths();
   }
+  else if (key == "defaultsave.directory")
+  {
+    //Some recursion here! As this call calls the current function
+    appendDataSearchDir(m_AbsolutePaths[key]);
+  }
 
   // If this key exists within the loaded configuration then mark that its value will have
   // changed from the default
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h
index 1e8f216da6f4f44d079ea61661cf71c5874e6b4b..c2f69c48795acf97bca661d145f49adbe07051fa 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSAddFiles.h
@@ -44,7 +44,6 @@ private:
   void initLayout();
   void setToolTips();
   QListWidgetItem* insertListFront(const QString &text);
-  ///The directory where files are saved is defined by the config data service
   void changeOutputDir(Mantid::Kernel::ConfigValChangeNotification_ptr pDirInfo);
   void setOutDir(std::string dir);
   void readSettings();
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h
index 5864772ef62fac5e340a9dec6f35ec89933f690f..b1f70c8f17c6d98670d0b42206214dc25a35f61b 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.h
@@ -14,7 +14,8 @@
 #include <QStringList>
 #include "Poco/NObserver.h"
 #include "MantidAPI/AnalysisDataService.h"
-#include "MantidAPI/MatrixWorkspace.h"
+#include "MantidAPI/MatrixWorkspace.h"
+#include "MantidKernel/ConfigService.h"
 
 namespace Mantid
 {
@@ -78,7 +79,9 @@ signals:
 
 private:
   ///Mode enumeration
-  enum RunMode { SingleMode = 0, BatchMode };
+  enum RunMode { SingleMode = 0, BatchMode };
+
+
   /// Initialize the layout
   virtual void initLayout();
   /// Init Python environment
@@ -268,7 +271,9 @@ private:
   typedef QHash<const QCheckBox * const, QString>::const_iterator SavFormatsConstIt;
   /// A flag indicating there were warning messsages in the log
   bool m_log_warnings;
-  // An observer for a delete notification from Mantid
+  /// Get notified when the system input directories have changed
+  Poco::NObserver<SANSRunWindow, Mantid::Kernel::ConfigValChangeNotification> m_newInDir;
+  /// An observer for a delete notification from Mantid
   Poco::NObserver<SANSRunWindow, Mantid::API::WorkspaceDeleteNotification> m_delete_observer;
   /// A map of S2D detector names to QLabel pointers
   QList<QHash<QString, QLabel*> > m_s2d_detlabels;
@@ -290,8 +295,10 @@ private:
   QAction *m_batch_paste;
   ///A clear action for the batch table
   QAction *m_batch_clear;
-
-  bool setDataDir();
+  
+  void upDateDataDir();
+  bool exportDataDir();
+  void handleInputDirChange(Mantid::Kernel::ConfigValChangeNotification_ptr pDirInfo);
 
   //A reference to a logger
   static Mantid::Kernel::Logger & g_log;
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui
index 96e07a2a3ebc5ab4e706ac18e1e74e0ab3c5f8be..d3b6db5ad5c43a0133fa2406244dc51bdced801b 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/SANSRunWindow.ui
@@ -5,8 +5,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>724</width>
-    <height>450</height>
+    <width>719</width>
+    <height>480</height>
    </rect>
   </property>
   <property name="sizePolicy" >
@@ -73,32 +73,32 @@
       <attribute name="title" >
        <string>Run Numbers</string>
       </attribute>
-      <layout class="QGridLayout" name="gridLayout_21" >
-       <item row="0" column="0" colspan="2" >
-        <layout class="QHBoxLayout" name="horizontalLayout_12" >
-         <item>
-          <widget class="QLabel" name="label_7" >
+      <layout class="QGridLayout" name="gridLayout_47" >
+       <item row="0" column="0" >
+        <layout class="QGridLayout" name="gridLayout_46" >
+         <item row="0" column="0" >
+          <widget class="QLabel" name="label_11" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Maximum" hsizetype="Maximum" >
-             <horstretch>0</horstretch>
+             <horstretch>39</horstretch>
              <verstretch>0</verstretch>
             </sizepolicy>
            </property>
-           <property name="maximumSize" >
+           <property name="minimumSize" >
             <size>
-             <width>16777215</width>
-             <height>16777215</height>
+             <width>39</width>
+             <height>0</height>
             </size>
            </property>
            <property name="text" >
-            <string>Data directory</string>
+            <string>User file: </string>
            </property>
           </widget>
          </item>
-         <item>
-          <widget class="QLineEdit" name="datadir_edit" >
+         <item row="0" column="1" colspan="2" >
+          <widget class="QLineEdit" name="userfile_edit" >
            <property name="sizePolicy" >
-            <sizepolicy vsizetype="Maximum" hsizetype="Minimum" >
+            <sizepolicy vsizetype="Maximum" hsizetype="Preferred" >
              <horstretch>0</horstretch>
              <verstretch>0</verstretch>
             </sizepolicy>
@@ -111,8 +111,8 @@
            </property>
           </widget>
          </item>
-         <item>
-          <widget class="QPushButton" name="data_dirBtn" >
+         <item row="0" column="3" >
+          <widget class="QPushButton" name="userfileBtn" >
            <property name="sizePolicy" >
             <sizepolicy vsizetype="Maximum" hsizetype="Minimum" >
              <horstretch>0</horstretch>
@@ -120,68 +120,74 @@
             </sizepolicy>
            </property>
            <property name="text" >
-            <string>Browse</string>
+            <string>Load Mask</string>
            </property>
            <property name="autoDefault" >
             <bool>false</bool>
            </property>
           </widget>
          </item>
-         <item>
-          <spacer name="horizontalSpacer" >
-           <property name="orientation" >
-            <enum>Qt::Horizontal</enum>
+         <item row="1" column="0" >
+          <widget class="QLabel" name="outDirs_lb" >
+           <property name="sizePolicy" >
+            <sizepolicy vsizetype="Preferred" hsizetype="Minimum" >
+             <horstretch>50</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
            </property>
-           <property name="sizeHint" stdset="0" >
+           <property name="minimumSize" >
             <size>
-             <width>40</width>
-             <height>20</height>
+             <width>0</width>
+             <height>0</height>
             </size>
            </property>
-          </spacer>
-         </item>
-         <item>
-          <widget class="QLabel" name="label_11" >
-           <property name="sizePolicy" >
-            <sizepolicy vsizetype="Maximum" hsizetype="Maximum" >
-             <horstretch>0</horstretch>
-             <verstretch>0</verstretch>
-            </sizepolicy>
+           <property name="maximumSize" >
+            <size>
+             <width>16777215</width>
+             <height>16777215</height>
+            </size>
            </property>
            <property name="text" >
-            <string>User file</string>
+            <string>Data Directory:</string>
            </property>
           </widget>
          </item>
-         <item>
-          <widget class="QLineEdit" name="userfile_edit" >
+         <item row="1" column="1" >
+          <widget class="QLabel" name="saveDir_lb" >
+           <property name="text" >
+            <string>TextLabel</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="2" >
+          <widget class="QLabel" name="plusDirs_lb" >
            <property name="sizePolicy" >
-            <sizepolicy vsizetype="Maximum" hsizetype="Maximum" >
-             <horstretch>0</horstretch>
+            <sizepolicy vsizetype="Minimum" hsizetype="Minimum" >
+             <horstretch>55</horstretch>
              <verstretch>0</verstretch>
             </sizepolicy>
            </property>
            <property name="minimumSize" >
             <size>
-             <width>200</width>
+             <width>55</width>
              <height>0</height>
             </size>
            </property>
-           <property name="alignment" >
-            <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+           <property name="text" >
+            <string>+? others</string>
            </property>
           </widget>
          </item>
-         <item>
-          <widget class="QPushButton" name="userfileBtn" >
+         <item row="1" column="3" >
+          <widget class="QPushButton" name="data_dirBtn" >
            <property name="sizePolicy" >
-            <sizepolicy vsizetype="Maximum" hsizetype="Maximum" >
+            <sizepolicy vsizetype="Maximum" hsizetype="Minimum" >
              <horstretch>0</horstretch>
              <verstretch>0</verstretch>
             </sizepolicy>
            </property>
            <property name="text" >
-            <string>Load Mask</string>
+            <string>Manage Directories</string>
            </property>
            <property name="autoDefault" >
             <bool>false</bool>
@@ -190,7 +196,7 @@
          </item>
         </layout>
        </item>
-       <item row="1" column="0" colspan="2" >
+       <item row="1" column="0" >
         <layout class="QHBoxLayout" name="horizontalLayout_8" >
          <item>
           <widget class="QRadioButton" name="single_mode_btn" >
@@ -270,78 +276,18 @@
          </item>
         </layout>
        </item>
-       <item row="4" column="0" >
-        <widget class="QGroupBox" name="groupBox_4" >
-         <property name="title" >
-          <string>Options</string>
-         </property>
-         <layout class="QGridLayout" name="gridLayout_20" >
-          <item row="0" column="1" >
-           <widget class="QCheckBox" name="verbose_check" >
-            <property name="text" >
-             <string>Verbose</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="2" >
-           <widget class="QCheckBox" name="log_colette" >
-            <property name="text" >
-             <string>Log Colette cmds</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="0" >
-           <widget class="QCheckBox" name="plot_check" >
-            <property name="text" >
-             <string>Plot result</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item row="5" column="0" >
-        <widget class="QGroupBox" name="groupBox_7" >
-         <property name="title" >
-          <string>Reduce</string>
-         </property>
-         <property name="flat" >
-          <bool>false</bool>
-         </property>
-         <layout class="QGridLayout" name="gridLayout_19" >
-          <item row="0" column="0" >
-           <widget class="QPushButton" name="load_dataBtn" >
-            <property name="text" >
-             <string>Load Data</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="1" >
-           <widget class="QPushButton" name="oneDBtn" >
-            <property name="text" >
-             <string>1D Reduce</string>
-            </property>
-           </widget>
-          </item>
-          <item row="0" column="2" >
-           <widget class="QPushButton" name="twoDBtn" >
-            <property name="text" >
-             <string>2D Reduce</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
-       <item row="2" column="0" colspan="2" >
+       <item row="2" column="0" >
         <widget class="Line" name="line_2" >
          <property name="orientation" >
           <enum>Qt::Horizontal</enum>
          </property>
         </widget>
        </item>
-       <item row="3" column="0" colspan="2" >
+       <item row="3" column="0" >
         <widget class="QStackedWidget" name="mode_stack" >
+         <property name="lineWidth" >
+          <number>0</number>
+         </property>
          <property name="currentIndex" >
           <number>0</number>
          </property>
@@ -908,6 +854,185 @@
              </item>
             </layout>
            </item>
+           <item>
+            <layout class="QGridLayout" name="gridLayout_44" >
+             <item row="0" column="0" >
+              <widget class="QGroupBox" name="groupBox_4" >
+               <property name="title" >
+                <string>Options</string>
+               </property>
+               <layout class="QGridLayout" name="gridLayout_20" >
+                <item row="0" column="1" >
+                 <widget class="QCheckBox" name="verbose_check" >
+                  <property name="text" >
+                   <string>Verbose</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="2" >
+                 <widget class="QCheckBox" name="log_colette" >
+                  <property name="text" >
+                   <string>Log Colette cmds</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="0" >
+                 <widget class="QCheckBox" name="plot_check" >
+                  <property name="text" >
+                   <string>Plot result</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </widget>
+             </item>
+             <item row="1" column="0" >
+              <widget class="QGroupBox" name="groupBox_7" >
+               <property name="title" >
+                <string>Reduce</string>
+               </property>
+               <property name="flat" >
+                <bool>false</bool>
+               </property>
+               <layout class="QGridLayout" name="gridLayout_19" >
+                <item row="0" column="0" >
+                 <widget class="QPushButton" name="load_dataBtn" >
+                  <property name="text" >
+                   <string>Load Data</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="1" >
+                 <widget class="QPushButton" name="oneDBtn" >
+                  <property name="text" >
+                   <string>1D Reduce</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="0" column="2" >
+                 <widget class="QPushButton" name="twoDBtn" >
+                  <property name="text" >
+                   <string>2D Reduce</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </widget>
+             </item>
+             <item rowspan="2" row="0" column="1" >
+              <widget class="QGroupBox" name="groupBox_5" >
+               <property name="title" >
+                <string>Save</string>
+               </property>
+               <layout class="QGridLayout" name="gridLayout" >
+                <item rowspan="2" row="0" column="4" >
+                 <widget class="QPushButton" name="saveFilename_btn" >
+                  <property name="minimumSize" >
+                   <size>
+                    <width>0</width>
+                    <height>0</height>
+                   </size>
+                  </property>
+                  <property name="toolTip" >
+                   <string>Save the output workspace to this file</string>
+                  </property>
+                  <property name="text" >
+                   <string>Browse</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="3" column="4" >
+                 <widget class="QCheckBox" name="saveCSV_check" >
+                  <property name="toolTip" >
+                   <string>Select one or more file formats</string>
+                  </property>
+                  <property name="text" >
+                   <string>CSV</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="3" column="3" >
+                 <widget class="QCheckBox" name="saveRKH_check" >
+                  <property name="toolTip" >
+                   <string>Select one or more file formats</string>
+                  </property>
+                  <property name="text" >
+                   <string>RKH</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="3" column="2" >
+                 <widget class="QCheckBox" name="saveCan_check" >
+                  <property name="toolTip" >
+                   <string>Select one or more file formats</string>
+                  </property>
+                  <property name="text" >
+                   <string>CanSAS</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="3" column="1" >
+                 <widget class="QCheckBox" name="saveNex_check" >
+                  <property name="toolTip" >
+                   <string>Select one or more file formats</string>
+                  </property>
+                  <property name="text" >
+                   <string>Nexus</string>
+                  </property>
+                 </widget>
+                </item>
+                <item rowspan="2" row="0" column="0" >
+                 <widget class="QLabel" name="label_58" >
+                  <property name="toolTip" >
+                   <string>Save the output workspace to this file</string>
+                  </property>
+                  <property name="text" >
+                   <string>Filename:</string>
+                  </property>
+                 </widget>
+                </item>
+                <item rowspan="2" row="2" column="0" >
+                 <widget class="QLabel" name="label_64" >
+                  <property name="toolTip" >
+                   <string>Select one or more file formats</string>
+                  </property>
+                  <property name="text" >
+                   <string>Formats:</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="4" column="1" colspan="2" >
+                 <widget class="QPushButton" name="saveDefault_btn" >
+                  <property name="toolTip" >
+                   <string>Save the workspace from a single run file reduction</string>
+                  </property>
+                  <property name="text" >
+                   <string>Save Result</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="1" column="1" colspan="3" >
+                 <widget class="QLineEdit" name="outfile_edit" >
+                  <property name="toolTip" >
+                   <string>Save the output workspace to this file</string>
+                  </property>
+                 </widget>
+                </item>
+                <item row="4" column="3" colspan="2" >
+                 <widget class="QPushButton" name="saveSel_btn" >
+                  <property name="toolTip" >
+                   <string>Save multiple workspaces</string>
+                  </property>
+                  <property name="text" >
+                   <string>Save Other</string>
+                  </property>
+                 </widget>
+                </item>
+               </layout>
+              </widget>
+             </item>
+            </layout>
+           </item>
           </layout>
          </widget>
          <widget class="QWidget" name="page_6" >
@@ -1033,118 +1158,6 @@
          </widget>
         </widget>
        </item>
-       <item rowspan="2" row="4" column="1" >
-        <widget class="QGroupBox" name="groupBox_5" >
-         <property name="title" >
-          <string>Save</string>
-         </property>
-         <layout class="QGridLayout" name="gridLayout" >
-          <item rowspan="2" row="0" column="4" >
-           <widget class="QPushButton" name="saveFilename_btn" >
-            <property name="minimumSize" >
-             <size>
-              <width>0</width>
-              <height>0</height>
-             </size>
-            </property>
-            <property name="toolTip" >
-             <string>Save the output workspace to this file</string>
-            </property>
-            <property name="text" >
-             <string>Browse</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="4" >
-           <widget class="QCheckBox" name="saveCSV_check" >
-            <property name="toolTip" >
-             <string>Select one or more file formats</string>
-            </property>
-            <property name="text" >
-             <string>CSV</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="3" >
-           <widget class="QCheckBox" name="saveRKH_check" >
-            <property name="toolTip" >
-             <string>Select one or more file formats</string>
-            </property>
-            <property name="text" >
-             <string>RKH</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="2" >
-           <widget class="QCheckBox" name="saveCan_check" >
-            <property name="toolTip" >
-             <string>Select one or more file formats</string>
-            </property>
-            <property name="text" >
-             <string>CanSAS</string>
-            </property>
-           </widget>
-          </item>
-          <item row="3" column="1" >
-           <widget class="QCheckBox" name="saveNex_check" >
-            <property name="toolTip" >
-             <string>Select one or more file formats</string>
-            </property>
-            <property name="text" >
-             <string>Nexus</string>
-            </property>
-           </widget>
-          </item>
-          <item rowspan="2" row="0" column="0" >
-           <widget class="QLabel" name="label_58" >
-            <property name="toolTip" >
-             <string>Save the output workspace to this file</string>
-            </property>
-            <property name="text" >
-             <string>Filename:</string>
-            </property>
-           </widget>
-          </item>
-          <item rowspan="2" row="2" column="0" >
-           <widget class="QLabel" name="label_64" >
-            <property name="toolTip" >
-             <string>Select one or more file formats</string>
-            </property>
-            <property name="text" >
-             <string>Formats:</string>
-            </property>
-           </widget>
-          </item>
-          <item row="4" column="1" colspan="2" >
-           <widget class="QPushButton" name="saveDefault_btn" >
-            <property name="toolTip" >
-             <string>Save the workspace from a single run file reduction</string>
-            </property>
-            <property name="text" >
-             <string>Save Result</string>
-            </property>
-           </widget>
-          </item>
-          <item row="1" column="1" colspan="3" >
-           <widget class="QLineEdit" name="outfile_edit" >
-            <property name="toolTip" >
-             <string>Save the output workspace to this file</string>
-            </property>
-           </widget>
-          </item>
-          <item row="4" column="3" colspan="2" >
-           <widget class="QPushButton" name="saveSel_btn" >
-            <property name="toolTip" >
-             <string>Save multiple workspaces</string>
-            </property>
-            <property name="text" >
-             <string>Save Other</string>
-            </property>
-           </widget>
-          </item>
-         </layout>
-        </widget>
-       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_2" >
@@ -1152,7 +1165,7 @@
        <string>Analysis Details</string>
       </attribute>
       <layout class="QGridLayout" name="gridLayout_13" >
-       <item row="0" column="0" >
+       <item row="1" column="0" >
         <layout class="QHBoxLayout" name="horizontalLayout_4" >
          <item>
           <widget class="QGroupBox" name="limits_group" >
@@ -1641,7 +1654,7 @@ p, li { white-space: pre-wrap; }
          </item>
         </layout>
        </item>
-       <item row="0" column="1" >
+       <item row="1" column="1" >
         <layout class="QVBoxLayout" name="verticalLayout_8" >
          <item>
           <widget class="QGroupBox" name="groupBox_14" >
@@ -1825,7 +1838,7 @@ p, li { white-space: pre-wrap; }
          </item>
         </layout>
        </item>
-       <item rowspan="2" row="1" column="0" >
+       <item rowspan="2" row="3" column="0" >
         <widget class="QGroupBox" name="groupBox_6" >
          <property name="title" >
           <string>Efficiency correction</string>
@@ -1906,7 +1919,7 @@ p, li { white-space: pre-wrap; }
          </layout>
         </widget>
        </item>
-       <item row="1" column="1" >
+       <item row="3" column="1" >
         <layout class="QHBoxLayout" name="horizontalLayout_6" >
          <item>
           <widget class="QGroupBox" name="groupBox_3" >
@@ -2027,7 +2040,7 @@ p, li { white-space: pre-wrap; }
          </item>
         </layout>
        </item>
-       <item row="2" column="1" >
+       <item row="4" column="1" >
         <spacer name="verticalSpacer_2" >
          <property name="orientation" >
           <enum>Qt::Vertical</enum>
@@ -2040,6 +2053,58 @@ p, li { white-space: pre-wrap; }
          </property>
         </spacer>
        </item>
+       <item row="5" column="0" >
+        <spacer name="verticalSpacer_5" >
+         <property name="orientation" >
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0" >
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="0" column="0" >
+        <spacer name="verticalSpacer_11" >
+         <property name="orientation" >
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0" >
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="2" column="0" >
+        <spacer name="verticalSpacer_12" >
+         <property name="orientation" >
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0" >
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
+       <item row="2" column="1" >
+        <spacer name="verticalSpacer_13" >
+         <property name="orientation" >
+          <enum>Qt::Vertical</enum>
+         </property>
+         <property name="sizeHint" stdset="0" >
+          <size>
+           <width>20</width>
+           <height>40</height>
+          </size>
+         </property>
+        </spacer>
+       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_4" >
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp
index 14566988b4e40007744cf4e5c3f13223d539b628..817e3b16b38a95cab86ae64c9b24cbc117a9ba01 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSAddFiles.cpp
@@ -145,7 +145,7 @@ void SANSAddFiles::setOutDir(std::string dir)
   m_outDir = QString::fromStdString(dir);
   m_SANSForm->summedPath_lb->setText(OUT_MSG+m_outDir);
 }
-/** Update the output directory edit box if the Mantid system output
+/** Update the output directory label if the Mantid system output
 *  directory has changed
 *  @param pDirInfo a pointer to an object with the output directory name in it
 */
@@ -285,9 +285,9 @@ void SANSAddFiles::new2AddBrowse()
 {
   QSettings prevVals;
   prevVals.beginGroup("CustomInterfaces/SANSRunWindow/AddRuns");
-  //get the previous data input directory or, if there wasn't one, use the directory entered on the main form
-  QString dir =
-    prevVals.value("InPath", m_SANSForm->datadir_edit->text()).toString();
+  //get the previous data input directory or, if there wasn't one, the first directory of on the default load path
+  std::string d0 = ConfigService::Instance().getDataSearchDirs()[0];
+  QString dir = prevVals.value("InPath",QString::fromStdString(d0)).toString();
   
 	QString fileFilter = "Files (";
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp
index 3b58757e259c7432eede245eb51c90a2c39b4d1c..a86ef93077051deea1077ab35c7e0db8675df46a 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/SANSRunWindow.cpp
@@ -3,7 +3,8 @@
 //----------------------
 #include "MantidQtCustomInterfaces/SANSRunWindow.h"
 #include "MantidQtCustomInterfaces/SANSUtilityDialogs.h"
-#include "MantidQtCustomInterfaces/SANSAddFiles.h"
+#include "MantidQtCustomInterfaces/SANSAddFiles.h"
+#include "MantidQtAPI/ManageUserDirectories.h"
 #include "MantidQtAPI/FileDialogHandler.h"
 
 #include "MantidKernel/ConfigService.h"
@@ -63,22 +64,31 @@ SANSRunWindow::SANSRunWindow(QWidget *parent) :
   m_data_dir(""), m_ins_defdir(""), m_last_dir(""),
   m_cfg_loaded(true), m_userFname(false), m_sample_no(), m_run_no_boxes(),
   m_period_lbls(), m_warnings_issued(false), m_force_reload(false),
-  m_log_warnings(false),
+  m_log_warnings(false), m_newInDir(*this, &SANSRunWindow::handleInputDirChange),
   m_delete_observer(*this, &SANSRunWindow::handleMantidDeleteWorkspace),
   m_s2d_detlabels(), m_loq_detlabels(), m_allowed_batchtags(), m_lastreducetype(-1),
   m_have_reducemodule(false), m_dirty_batch_grid(false), m_tmp_batchfile("")
 {
+  ConfigService::Instance().addObserver(m_newInDir);
 }
 
 ///Destructor
 SANSRunWindow::~SANSRunWindow()
 {
-  if( isInitialized() )
+  try
   {
-    // Seems to crash on destruction of if I don't do this 
-    AnalysisDataService::Instance().notificationCenter.removeObserver(m_delete_observer);
-    saveSettings();
-    delete m_addFilesTab;
+    ConfigService::Instance().removeObserver(m_newInDir);
+    if( isInitialized() )
+    {
+      // Seems to crash on destruction of if I don't do this 
+      AnalysisDataService::Instance().notificationCenter.removeObserver(m_delete_observer);
+      saveSettings();
+      delete m_addFilesTab;
+    }
+  }
+  catch(...)
+  {
+    //we've cleaned up the best we can, move on
   }
 }
 
@@ -163,7 +173,7 @@ void SANSRunWindow::initLayout()
     m_addFilesTab = new SANSAddFiles(this, &m_uiForm);
   }
   //Listen for Workspace delete signals
-  AnalysisDataService::Instance().notificationCenter.addObserver(m_delete_observer);
+  AnalysisDataService::Instance().notificationCenter.addObserver(m_delete_observer);
 
   readSettings();
 }
@@ -388,7 +398,6 @@ void SANSRunWindow::readSettings()
   g_log.debug("Reading settings.");
   QSettings value_store;
   value_store.beginGroup("CustomInterfaces/SANSRunWindow");
-  m_uiForm.datadir_edit->setText(value_store.value("data_dir").toString());
   m_uiForm.userfile_edit->setText(value_store.value("user_file").toString());
   m_last_dir = value_store.value("last_dir", "").toString();
 
@@ -405,7 +414,9 @@ void SANSRunWindow::readSettings()
   }
 
   //The instrument definition directory
-  m_ins_defdir = QString::fromStdString(ConfigService::Instance().getString("instrumentDefinition.directory"));
+  m_ins_defdir = QString::fromStdString(
+    ConfigService::Instance().getString("instrumentDefinition.directory"));
+  upDateDataDir();
 
   // Set allowed extensions
   m_uiForm.file_opt->clear();
@@ -422,8 +433,8 @@ void SANSRunWindow::readSettings()
   value_store.endGroup();
   readSaveSettings(value_store);
 
-  g_log.debug() << "Found previous data directory " << m_uiForm.datadir_edit->text().toStdString()
-    << "\nFound previous user mask file " << m_uiForm.userfile_edit->text().toStdString()
+  g_log.debug() << "Found previous data directory " << "\nFound previous user mask file "
+    << m_uiForm.userfile_edit->text().toStdString()
     << "\nFound instrument definition directory " << m_ins_defdir.toStdString() << std::endl;
 
 }
@@ -1598,18 +1609,11 @@ void SANSRunWindow::markError(QLabel* label)
 /**
  * Select the base directory for the data
  */
-void SANSRunWindow::selectDataDir()
-{
-  QString data_dir = QFileDialog::getExistingDirectory(this, tr("Choose a directory"), m_last_dir);
-  if( !data_dir.isEmpty() && QDir(data_dir).exists() ) 
-  {
-    m_last_dir = data_dir;
-    m_data_dir = data_dir;
-    m_uiForm.datadir_edit->setText(data_dir);
-  }
+void SANSRunWindow::selectDataDir()
+{
+  MantidQt::API::ManageUserDirectories::openUserDirsDialog(this);
 }
 
-
 /**
  * Select and load the user file
  */
@@ -1741,14 +1745,12 @@ bool SANSRunWindow::browseForFile(const QString & box_title, QLineEdit* file_fie
 bool SANSRunWindow::oldLoadButtonClick()
 {
   QString origin_dir = QDir::currentPath();
-  QString work_dir = QDir(m_uiForm.datadir_edit->text()).absolutePath();
-  if( work_dir.isEmpty() || !QDir(work_dir).exists() )
+  if( m_data_dir.isEmpty() || !QDir(m_data_dir).exists() )
   {
-    showInformationBox("The specified data directory " + m_uiForm.datadir_edit->text() + " does not exist.");
+    showInformationBox("The data directory " + m_data_dir + " does not exist.");
     return false;
   }
-  if( !work_dir.endsWith('/') ) work_dir += "/";
-  m_data_dir = work_dir;
+  if( !m_data_dir.endsWith('/') ) m_data_dir += "/";
   runReduceScriptFunction("import SANSReduction\nSANSReduction.INSTRUMENT = i.ISIS_global().instrument\nSANSReduction.DataPath('" + m_data_dir + "')");
 
   runReduceScriptFunction("SANSReduction.UserPath('" + QFileInfo(m_uiForm.userfile_edit->text()).path() + "')");
@@ -1878,7 +1880,7 @@ bool SANSRunWindow::oldLoadButtonClick()
  */
 bool SANSRunWindow::handleLoadButtonClick()
 {
-  if ( ! setDataDir() )
+  if ( ! exportDataDir() )
   {
     return false;
   }
@@ -2075,7 +2077,7 @@ QString SANSRunWindow::createAnalysisDetailsScript(const QString & type)
   QString exec_reduce = "i.ISIS_global().instrument.setDetector('" +
                             m_uiForm.detbank_sel->currentText() + "')\n";
 
-  setDataDir();
+  exportDataDir();
 
   exec_reduce += "i.ISIS_global().to_Q.output_type='"+type+"'\n";
   //Analysis details
@@ -2163,7 +2165,7 @@ QString SANSRunWindow::createOldAnalysisDetailsScript(const QString & type)
   QString exec_reduce = "SANSReduction.Detector('" + m_uiForm.detbank_sel->currentText() + "')\n";
 
   //Add the path in the single mode data box if it is not empty
-  QString data_path = m_uiForm.datadir_edit->text();
+  QString data_path = m_data_dir;
   if( !data_path.isEmpty() )
   {
     exec_reduce += "SANSReduction.DataPath('" + data_path + "')\n";
@@ -3428,22 +3430,56 @@ void SANSRunWindow::checkLogFlags()
   }
   m_log_warnings = false;
 }
-/** Update Python variables with the user selected directory in datadir_edit
-  */
-bool SANSRunWindow::setDataDir()
+/** Display the first data search and the number of data directorys to users and
+*  update our input directory in m_data_dir
+*/
+void SANSRunWindow::upDateDataDir()
+{
+  const std::vector<std::string> &dirs
+    = ConfigService::Instance().getDataSearchDirs();
+  if ( ! dirs.empty() )
+  {// use the first directory in the list
+    m_data_dir = QString::fromStdString(dirs.front());
+    m_uiForm.saveDir_lb->setText(m_data_dir);
+
+    m_uiForm.plusDirs_lb->setText(
+      QString("+ ") + QString::number(dirs.size()-1) + QString(" others"));
+  }
+  else
+  {
+    m_data_dir = "";
+    m_uiForm.saveDir_lb->setText("No input search directories defined");
+    m_uiForm.plusDirs_lb->setText("");
+  }
+
+}
+/** Set the Python data directory to that displayed on this GUI, which is the first data
+*  serach directory
+*  @return false if the there were Python errors, otherwise true
+*/
+bool SANSRunWindow::exportDataDir()
 {
-  QString work_dir = QDir(m_uiForm.datadir_edit->text()).absolutePath();
-  if( work_dir.isEmpty() || !QDir(work_dir).exists() )
+  if( m_data_dir.isEmpty() || !QDir(m_data_dir).exists() )
   {
-    showInformationBox("The specified data directory " + m_uiForm.datadir_edit->text() + " does not exist.");
+    showInformationBox("The specified data directory \"" + m_data_dir + "\" does not exist. Use the \"Manage Directories\" button to change this");
     return false;
   }
-  if( !work_dir.endsWith('/') ) work_dir += "/";
-  m_data_dir = work_dir;
+  if( !m_data_dir.endsWith('/') ) m_data_dir += "/";
   const QString worked =
     runReduceScriptFunction("i.ISIS_global().set_data_path('" + m_data_dir + "')");
 
   return worked != "Error";
+}
+/** Update the input directory labels if the Mantid system input
+*  directories have changed
+*  @param pDirInfo a pointer to an object with the output directory name in it
+*/
+void SANSRunWindow::handleInputDirChange(Mantid::Kernel::ConfigValChangeNotification_ptr pDirInfo)
+{
+  if ( pDirInfo->key() == "datasearch.directories" )
+  {
+    upDateDataDir();
+  }
 }
 
 } //namespace CustomInterfaces
diff --git a/Code/Mantid/Scripts/SANS/ISISCommandInterface.py b/Code/Mantid/Scripts/SANS/ISISCommandInterface.py
index 65cf0d786ef3b3f826713e4bbbe85d774d3e835e..32b4a0ffc8c1982397e32ac1a0cbead679d08a69 100644
--- a/Code/Mantid/Scripts/SANS/ISISCommandInterface.py
+++ b/Code/Mantid/Scripts/SANS/ISISCommandInterface.py
@@ -173,7 +173,7 @@ def AssignSample(sample_run, reload = True, period = -1):
 
     sample_wksp, logs = ISIS_global().data_loader.execute(
                                             ISIS_global(), None)
-    ISIS_global().set_run_number(sample_run, sample_wksp)
+    ISIS_global().set_run_number(sample_wksp)
     return sample_wksp, logs
 
 def SetCentre(XVAL, YVAL):
diff --git a/Code/Mantid/Scripts/SANS/isis_instrument.py b/Code/Mantid/Scripts/SANS/isis_instrument.py
index 1671e1b4024465077c31d613c57f457159253fb2..f81266ed89c7784e3f189f1a9b2ab9fa2644c30a 100644
--- a/Code/Mantid/Scripts/SANS/isis_instrument.py
+++ b/Code/Mantid/Scripts/SANS/isis_instrument.py
@@ -431,18 +431,25 @@ class LOQ(ISISInstrument):
 
 
 class SANS2D(ISISInstrument): 
-
+    """
+        The SANS2D instrument has movable detectors whose locations have to
+        be read in from the workspace logs (Run object)
+    """ 
+    _NAME = 'SANS2D'
     # Number of digits in standard file name
     run_number_width = 8
     WAV_RANGE_MIN = 2.0
     WAV_RANGE_MAX = 14.0
 
     def __init__(self, wrksp_name=None):
-        self._NAME = 'SANS2D'
         super(SANS2D, self).__init__(wrksp_name)
         
         self._marked_dets = []
-    
+        # set to true once the detector positions have been moved to the locations given in the sample logs
+        self.corrections_applied = False
+        # a warning is issued if the can logs are not the same as the sample 
+        self._can_logs = {}
+
     def set_up_for_run(self, base_runno):
         """
             Handles changes required when a sample is loaded, both generic
@@ -506,12 +513,47 @@ class SANS2D(ISISInstrument):
             #does this reflect the detector being immovable?
             return [0.0,0.0], [xshift, yshift]
         
-    # Load the detector logs
-    def load_detector_logs(self,log_name,file_path):
-    # Adding runs produces a 1000nnnn or 2000nnnn. For less copying, of log files doctor the filename
+    def get_detector_log(self, logs, period=-1):
+        """
+            Reads information about the state of the instrument on the current run
+            from the log files
+            @param logs: a workspace pointer for NeXus files or a .log file for raw files
+        """
         self._marked_dets = []
-        log_name = log_name[0:6] + '0' + log_name[7:]
-        filename = os.path.join(file_path, log_name + '.log')
+
+        try:
+            logvalues = self._get_sample_logs(logs, period)
+        except AttributeError:
+            #this happens if we were passed a filename, as raw files have .log files
+            logvalues = self._get_dot_log_file(logs)
+        
+        return logvalues
+
+    def _get_sample_logs(self, p_wksp, period):
+        """
+            Reads information about the state of the instrument on the information
+            stored in the sample
+            @param logs: a workspace pointer
+            @return the values that were read as a dictionary
+        """
+        samp = p_wksp.getSampleDetails()
+
+        logvalues = {}
+        logvalues['Front_Det_Z'] = self._get_log(samp, 'Front_Det_Z', period) 
+        logvalues['Front_Det_X'] = self._get_log(samp, 'Front_Det_X', period)
+        logvalues['Front_Det_Rot'] = self._get_log(samp, 'Front_Det_Rot', period)
+        logvalues['Rear_Det_Z'] = self._get_log(samp, 'Rear_Det_Z', period)
+        logvalues['Rear_Det_X'] = self._get_log(samp, 'Rear_Det_X', period)
+
+        return logvalues
+
+    def _get_log(self, log_data, log_name, period):
+        if period == -1:
+            return float(log_data.getLogData(log_name).value)
+        else:
+            return float(log_data.getLogData(log_name).value[period])
+        
+    def _get_dot_log_file(self, log_file):
 
         # Build a dictionary of log data 
         logvalues = {}
@@ -521,28 +563,77 @@ class SANS2D(ISISInstrument):
         logvalues['Front_Det_Z'] = '0.0'
         logvalues['Front_Det_Rot'] = '0.0'
         try:
-            file_handle = open(filename, 'r')
+            file_handle = open(log_file, 'r')
         except IOError:
-            mantid.sendLogMessage("::SANS::load_detector_logs: Log file \"" + filename + "\" could not be loaded.")
+            mantid.sendLogMessage("::SANS::load_detector_logs: Log file \"" + log_file + "\" could not be loaded.")
             return None
         
         for line in file_handle:
             parts = line.split()
             if len(parts) != 3:
-                mantid.sendLogMessage('::SANS::load_detector_logs: Incorrect structure detected in logfile "' + filename + '" for line \n"' + line + '"\nEntry skipped')
+                mantid.sendLogMessage('::SANS::load_detector_logs: Incorrect structure detected in logfile "' + log_file + '" for line \n"' + line + '"\nEntry skipped')
             component = parts[1]
             if component in logvalues.keys():
                 logvalues[component] = parts[2]
 
         file_handle.close()
-        
+
+        return logvalues
+    
+    def apply_detector_logs(self, logvalues):
+        #apply the corrections that came from the logs
         self.FRONT_DET_Z = float(logvalues['Front_Det_Z'])
         self.FRONT_DET_X = float(logvalues['Front_Det_X'])
         self.FRONT_DET_ROT = float(logvalues['Front_Det_Rot'])
         self.REAR_DET_Z = float(logvalues['Rear_Det_Z'])
         self.REAR_DET_X = float(logvalues['Rear_Det_X'])
+        self.corrections_applied = True
+        if len(self._can_logs) > 0:
+            self.check_can_logs(self._can_logs)
+
+    def check_can_logs(self, new_logs):
+        """
+            Tests if applying the corrections from the passed logvalues
+            would give the same result as the corrections that were
+            already made
+            @param new_logs: the new values to check are equivalent
+            @return: True if the are the same False if not
+        """
+        if not self.corrections_applied:
+            #the check needs to wait until there's something to compare against
+            self._can_logs = new_logs
+
+        if len(new_logs) == 0:
+            return False
+
+        existing_values = []
+        existing_values.append(self.FRONT_DET_Z)
+        existing_values.append(self.FRONT_DET_X)
+        existing_values.append(self.FRONT_DET_ROT)
+        existing_values.append(self.REAR_DET_Z)
+        existing_values.append(self.REAR_DET_X)
+
+        new_values = []
+        new_values.append(float(new_logs['Front_Det_Z']))
+        new_values.append(float(new_logs['Front_Det_X']))
+        new_values.append(float(new_logs['Front_Det_Rot']))
+        new_values.append(float(new_logs['Rear_Det_Z']))
+        new_values.append(float(new_logs['Rear_Det_X']))
+        
+        errors = 0
+        corr_names = ['Front_Det_Z', 'Front_Det_X','Front_Det_Rot', 'Rear_Det_Z', 'Rear_Det_X']
+        for i in range(0, len(existing_values)):
+            if math.fabs(existing_values[i] - new_values[i]) > 5e-04:
+                mantid.sendLogMessage('::SANS::Warning: values differ between sample and can runs: Sample ' + corr_names[i] + ' = ' + str(existing_values[i]) + \
+                    ', can value is ' + str(new_values[i]))
+                errors += 1
+
+                self.append_marked(corr_names[i])
+        
+        #the check has been done clear up
+        self._can_logs = {}
 
-        return logvalues
+        return errors == 0
     
     def append_marked(self, detNames):
         self._marked_dets.append(detNames)
diff --git a/Code/Mantid/Scripts/SANS/isis_reducer.py b/Code/Mantid/Scripts/SANS/isis_reducer.py
index 8885ed681529a07c1aa4ed8906ed2fd0641a2c27..24b6529c4e9da32bae14843334d19c5c3396bd21 100644
--- a/Code/Mantid/Scripts/SANS/isis_reducer.py
+++ b/Code/Mantid/Scripts/SANS/isis_reducer.py
@@ -131,11 +131,10 @@ class ISISReducer(SANSReducer):
     
     user_file_path = property(get_user_path, set_user_path, None, None)
 
-    def set_run_number(self, data_file, workspace):
+    def set_run_number(self, workspace):
         """
             The run number is a number followed by a . and then
             the extension of the run file to load
-            @param data_file: name of the file to be processed
             @param workspace: optional name of the workspace for this data,
                 default will be the name of the file 
         """
diff --git a/Code/Mantid/Scripts/SANS/isis_reduction_steps.py b/Code/Mantid/Scripts/SANS/isis_reduction_steps.py
index 1b13bc9311b639f0f0500a01e5a536e1a434fd20..bf6c4cd05eb96fa573ee7d015e33531937da740d 100644
--- a/Code/Mantid/Scripts/SANS/isis_reduction_steps.py
+++ b/Code/Mantid/Scripts/SANS/isis_reduction_steps.py
@@ -58,7 +58,13 @@ class LoadRun(ReductionStep):
         self.ext = ''
         self.shortrun_no = -1
         
-    def load(self):
+    def _load(self, inst = None, is_can=False):
+        """
+            Load a workspace and read the logs into the passed instrument reference
+            @param inst: a reference to the current instrument
+            @param iscan: set this to True for can runs 
+            @return: name of the workspace, log values, number of periods in the workspace
+        """
         workspace = self._get_workspace_name()
 
         
@@ -70,15 +76,20 @@ class LoadRun(ReductionStep):
             if self._period != self.UNSET_PERIOD:
                 workspace = self._leaveSinglePeriod(workspace)
 
+            log_file = alg.getPropertyValue("Filename")
+
+            SANS2D_log_file = log_file.rpartition('.')[0]+'.log'
         else:
             #this is the generic situation
             if not self._period == self.UNSET_PERIOD:
-                alg = Load(self._data_file, workspace,
+                Load(self._data_file, workspace,
                   SpectrumMin=self._spec_min, SpectrumMax=self._spec_max, EntryNumber=self._period)
             else:
                 #no specific period was requested
-                alg = Load(self._data_file, workspace,
+                Load(self._data_file, workspace,
                   SpectrumMin=self._spec_min, SpectrumMax=self._spec_max)
+
+            SANS2D_log_file = mtd[workspace]
        
         numPeriods  = self._find_workspace_num_periods(workspace)
         #deal with the difficult situation of not reporting the period of single period files
@@ -88,10 +99,20 @@ class LoadRun(ReductionStep):
             RenameWorkspace(workspace, period_definitely_inc)
             workspace = period_definitely_inc 
         
-        # Return the file path actually used to load the data
-        fullpath = alg.getPropertyValue("Filename")
+        log = None
+        if (not inst is None) and inst.name() == 'SANS2D':
+            #this instrument has logs to be loaded 
+            try:
+                if numPeriods > 1:
+                    log = inst.get_detector_log(SANS2D_log_file, self._period)
+                else:
+                    log = inst.get_detector_log(SANS2D_log_file)
+            except:
+                #transmission files, don't have logs 
+                if not self._is_trans:
+                    raise
 
-        return [ os.path.dirname(fullpath), workspace, numPeriods]        
+        return workspace, numPeriods, log        
 
     def _get_workspace_name(self, optional_entry_no=True):
         """
@@ -113,7 +134,7 @@ class LoadRun(ReductionStep):
     # Helper function
     def _assignHelper(self, reducer):
         if self._data_file == '' or self._data_file.startswith('.'):
-            return SANSUtility.WorkspaceDetails('', -1),True,'','', -1
+            return '', '', -1
 
         try:
             run_no, logname, data_file = self._extract_run_details(
@@ -123,15 +144,15 @@ class LoadRun(ReductionStep):
             raise AttributeError('No instrument has been assign, run SANS2D or LOQ first')
 
         if run_no == '':
-            return SANSUtility.WorkspaceDetails('', -1),True,'','', -1
+            return '', '', -1
 
         workspace = self._get_workspace_name()
         #this always contains the period number
         period_definitely_inc = self._get_workspace_name(False)        
         if self._reload == False and mantid.workspaceExists(workspace):
-            return SANSUtility.WorkspaceDetails(workspace, run_no),False,'','', -1
+            return workspace, '', -1
         if self._reload == False and mantid.workspaceExists(period_definitely_inc):
-            return SANSUtility.WorkspaceDetails(period_definitely_inc, run_no),False,'','', -1
+            return period_definitely_inc, '', -1
 
         self._data_file = os.path.join(reducer._data_path, data_file)
         # Workaround so that the FileProperty does the correct searching of data paths if this file doesn't exist
@@ -148,20 +169,18 @@ class LoadRun(ReductionStep):
                 else:
                     self._spec_min = None
                     self._spec_max = 8
-                [filepath, wkspname, nPeriods] = self.load()
+                wkspname, nPeriods, logs = self._load(reducer.instrument)
             except RuntimeError, err:
                 mantid.sendLogMessage("::SANS::Warning: "+str(err))
-                return SANSUtility.WorkspaceDetails('', -1),True,'','', -1
+                return '', '', -1
         else:
             try:
-                [filepath, wkspname, nPeriods] = self.load()
+                wkspname, nPeriods, logs = self._load(reducer.instrument)
             except RuntimeError, details:
                 mantid.sendLogMessage("::SANS::Warning: "+str(details))
-                return SANSUtility.WorkspaceDetails('', -1),True,'','', -1
-
-        inWS = SANSUtility.WorkspaceDetails(wkspname, run_no)
+                return '', '', -1
         
-        return inWS,True, reducer.instrument.name() + logname, filepath, nPeriods
+        return wkspname, nPeriods, logs
 
     def _leaveSinglePeriod(self, workspace):
         groupW = mantid[workspace]
@@ -196,8 +215,6 @@ class LoadRun(ReductionStep):
     
     def _clearPrevious(self, inWS, others = []):
         if inWS != None:
-            if type(inWS) == SANSUtility.WorkspaceDetails:
-                inWS = inWS.getName()
             if mantid.workspaceExists(inWS) and (not inWS in others):
                 mantid.deleteWorkspace(inWS)
                 
@@ -279,16 +296,14 @@ class LoadTransmissions(sans_reduction_steps.BaseTransmission):
 
     def execute(self, reducer, workspace):
         if self._trans_name not in [None, '']:
-            loader = LoadRun(self._trans_name, trans=True, reload=self._reload, entry=self._period_t)
-            trans_ws, dummy1, dummy2, dummy3, self.TRANS_SAMPLE_N_PERIODS = \
-                loader._assignHelper(reducer)
-            self.trans_name = trans_ws.getName()
+            load = LoadRun(self._trans_name, trans=True, reload=self._reload, entry=self._period_t)
+            self.trans_name, self.TRANS_SAMPLE_N_PERIODS, dummy = \
+                                        load._assignHelper(reducer)
         
         if self._direct_name not in [None, '']:
-            loader = LoadRun(self._direct_name, trans=True, reload=self._reload, entry=self._period_d)
-            direct_sample_ws, dummy1, dummy2, dummy3, self.DIRECT_SAMPLE_N_PERIODS = \
-                loader._assignHelper(reducer)
-            self.direct_name = direct_sample_ws.getName()
+            load = LoadRun(self._direct_name, trans=True, reload=self._reload, entry=self._period_d)
+            self.direct_name, self.DIRECT_SAMPLE_N_PERIODS, dummy = \
+                                        load._assignHelper(reducer)
 
         return self.trans_name, self.direct_name
 
@@ -309,7 +324,7 @@ class CanSubtraction(LoadRun):
             @param fit_method: FitMethod parameter for CalculateTransmission (Linear or Log)
         """
         super(CanSubtraction, self).__init__(can_run, reload=reload, entry=period)
-        self.SCATTER_CAN = None
+        self._scatter_can = None
 
     def assign_can(self, reducer, reload = True):
         #TODO: get rid of any reference to the instrument object as much as possible
@@ -323,58 +338,24 @@ class CanSubtraction(LoadRun):
 
             return '', '()'
     
-        self.SCATTER_CAN ,reset, logname,filepath, self._CAN_N_PERIODS = \
-            self._assignHelper(reducer)
-        if self.SCATTER_CAN.getName() == '':
-            mantid.sendLogMessage('::SANS::Warning: Unable to load sans can run, cannot continue.')
+        self._scatter_can, self._CAN_N_PERIODS, logs = self._assignHelper(
+                                                                 reducer)
+        if self._scatter_can == '':
+            mantid.sendLogMessage('::SANS::Warning: Unable to load SANS can run, cannot continue.')
             return '','()'
-        if reset == True:
-            self._CAN_SETUP  = None
-
 
-        try:
-            logvalues = reducer.instrument.load_detector_logs(logname,filepath)
-            if logvalues == None:
-                _issueWarning("Can logs could not be loaded, using sample values.")
-                return self.SCATTER_CAN.getName(), "()"
-        except AttributeError:
-            if not reducer.instrument.name() == 'LOQ' : raise
-    
         self.PERIOD_NOS["SCATTER_CAN"] = self._period
     
-        if (reducer.instrument.name() == 'LOQ'):
-            return self.SCATTER_CAN.getName(), ""
-        
-        smp_values = []
-        front_det = reducer.instrument.getDetector('front')
-        smp_values.append(reducer.instrument.FRONT_DET_Z + front_det.z_corr)
-        smp_values.append(reducer.instrument.FRONT_DET_X + front_det.x_corr)
-        smp_values.append(reducer.instrument.FRONT_DET_ROT + front_det.rot_corr)
-        rear_det = reducer.instrument.getDetector('rear')
-        smp_values.append(reducer.instrument.REAR_DET_Z + rear_det.z_corr)
-        smp_values.append(reducer.instrument.REAR_DET_X + rear_det.x_corr)
-    
-        # Check against sample values and warn if they are not the same but still continue reduction
-        if len(logvalues) == 0:
-            return  self.SCATTER_CAN.getName(), logvalues
-        
-        can_values = []
-        can_values.append(float(logvalues['Front_Det_Z']) + front_det.z_corr)
-        can_values.append(float(logvalues['Front_Det_X']) + front_det.x_corr)
-        can_values.append(float(logvalues['Front_Det_Rot']) + front_det.rot_corr)
-        can_values.append(float(logvalues['Rear_Det_Z']) + rear_det.z_corr)
-        can_values.append(float(logvalues['Rear_Det_X']) + rear_det.x_corr)
-    
-    
-        det_names = ['Front_Det_Z', 'Front_Det_X','Front_Det_Rot', 'Rear_Det_Z', 'Rear_Det_X']
-        for i in range(0, 5):
-            if math.fabs(smp_values[i] - can_values[i]) > 5e-04:
-                mantid.sendLogMessage("::SANS::Warning: values differ between sample and can runs. Sample = " + str(smp_values[i]) + \
-                                  ' , Can = ' + str(can_values[i]))
-                reducer.instrument.append_marked(det_names[i])
-        # End of AssignCan code
+        if reducer.instrument.name() == 'LOQ':
+            return self._scatter_can, ""
+
+        if reducer.instrument.name() == 'SANS2D':
+            if logs is None:
+                _issueWarning("Can logs could not be loaded, using sample values.")
+                return self._scatter_can, "()"
+            reducer.instrument.check_can_logs(logs)           
         
-        return self.SCATTER_CAN.getName(), logvalues
+        return self._scatter_can, logs
 
     def execute(self, reducer, workspace):
         """
@@ -386,9 +367,8 @@ class CanSubtraction(LoadRun):
         beamcoords = reducer._beam_finder.get_beam_center()
 
         # Put the components in the correct positions
-        currentDet = reducer.instrument.cur_detector().name() 
         reducer.instrument.set_component_positions(
-                self.SCATTER_CAN.getName(), beamcoords[0], beamcoords[1])
+                self._scatter_can, beamcoords[0], beamcoords[1])
         mantid.sendLogMessage('::SANS:: Initialized can workspace to [' + str(beamcoords[0]) + ',' + str(beamcoords[1]) + ']' )
 
         # Create a run details object
@@ -404,8 +384,7 @@ class CanSubtraction(LoadRun):
         
         tmp_smp = workspace+"_sam_tmp"
         RenameWorkspace(workspace, tmp_smp)
-        # Run correction function
-        # was  Correct(SCATTER_CAN, can_setup[0], can_setup[1], wav_start, wav_end, can_setup[2], can_setup[3], finding_centre)
+
         tmp_can = workspace+"_can_tmp"
 
         # Can correction
@@ -421,11 +400,11 @@ class CanSubtraction(LoadRun):
 
         norm_step_ind = reduce_can.step_num(reduce_can.norm_mon)
         reduce_can.norm_mon = NormalizeToMonitor(
-                                        raw_ws = self.SCATTER_CAN.getName())
+                                        raw_ws = self._scatter_can)
         reduce_can._reduction_steps[norm_step_ind] = reduce_can.norm_mon
            
         #set the workspace that we've been setting up as the one to be processed 
-        reduce_can.set_process_single_workspace(self.SCATTER_CAN.getName())
+        reduce_can.set_process_single_workspace(self._scatter_can)
 
         #this will be the first command that is run in the new chain
         start = reduce_can.step_num(reduce_can.flood_file)
@@ -776,8 +755,7 @@ class LoadSample(LoadRun):
 
     def __init__(self, sample=None, reload=True, entry=-1):
         super(LoadSample, self).__init__(sample, reload=reload, entry=entry)
-        self.SCATTER_SAMPLE = None
-        self._SAMPLE_SETUP = None
+        self._scatter_sample = None
         self._SAMPLE_RUN = None
         self._SAMPLE_N_PERIODS = -1
         
@@ -791,22 +769,21 @@ class LoadSample(LoadRun):
         if self._data_file is None:
             self._data_file = reducer.get_sample()
         # Code from AssignSample
-        self._clearPrevious(self.SCATTER_SAMPLE)
+        self._clearPrevious(self._scatter_sample)
         self._SAMPLE_N_PERIODS = -1
         
         if( self._data_file.startswith('.') or self._data_file == '' or self._data_file == None):
-            self._SAMPLE_SETUP = None
             self._SAMPLE_RUN = ''
-            self.SCATTER_SAMPLE = None
+            self._scatter_sample = None
             raise RuntimeError('Sample needs to be assigned as run_number.file_type')
 
-        self.SCATTER_SAMPLE, reset, logname, filepath, self._SAMPLE_N_PERIODS = self._assignHelper(reducer)
-        if self.SCATTER_SAMPLE.getName() == '':
+        self._scatter_sample, self._SAMPLE_N_PERIODS, logs =\
+            self._assignHelper(reducer)
+
+        if self._scatter_sample == '':
             raise RuntimeError('Unable to load SANS sample run, cannot continue.')
-        if reset == True:
-            self._SAMPLE_SETUP = None
 
-        self.uncropped  = self.SCATTER_SAMPLE.getName()
+        self.uncropped  = self._scatter_sample
         p_run_ws = mantid[self.uncropped]
         
         if p_run_ws.isGroup():
@@ -820,20 +797,17 @@ class LoadSample(LoadRun):
         
         reducer.instrument.set_up_for_run(run_num)
 
-        logvalues = None
-        try:
-            logvalues = reducer.instrument.load_detector_logs(logname,filepath)
-            if logvalues == None:
-                mantid.deleteWorkspace(self.SCATTER_SAMPLE.getName())
+        if reducer.instrument.name() == 'SANS2D':
+            if logs == None:
+                mantid.deleteWorkspace(self._scatter_sample)
                 raise RuntimeError('Sample logs cannot be loaded, cannot continue')
-        except AttributeError:
-            if not reducer.instrument.name() == 'LOQ': raise
+            reducer.instrument.apply_detector_logs(logs)           
         
         self.PERIOD_NOS["SCATTER_SAMPLE"] = self._period
 
         reducer.wksp_name = self.uncropped
         
-        return reducer.wksp_name, logvalues
+        return reducer.wksp_name, logs
 
 class MoveComponents(ReductionStep):
     """