diff --git a/Code/Mantid/MantidQt/API/src/PythonRunner.cpp b/Code/Mantid/MantidQt/API/src/PythonRunner.cpp
index cfb37b61341b11c5ff0e22fa9221d025d6086c9d..95b142679beb6d1b4fccbcbda62827a5718d8d84 100644
--- a/Code/Mantid/MantidQt/API/src/PythonRunner.cpp
+++ b/Code/Mantid/MantidQt/API/src/PythonRunner.cpp
@@ -59,7 +59,7 @@ QString PythonRunner::runPythonCode(const QString & code, bool no_output)
     tmpstring.append(stream.readLine().trimmed() + "\n");
   }
   //FIXME: Ticket-9217 - Commented out for the moment to try and get working with clang
-  //if(g_log.is(Logger::Priority::PRIO_DEBUG)) g_log.debug() << "Raw output from execution:\n" << tmpstring.toAscii().data() << "\n";
+  if(g_log.is(Logger::Priority::PRIO_DEBUG)) g_log.debug() << "Raw output from execution:\n" << tmpstring.toAscii().data() << "\n";
   return tmpstring;
 }
 /** This Python helper function converts a list of strings into one
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ApplyCorr.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ApplyCorr.h
index 9ac002ed6ab6235bccc1432da5eda3a900568412..8549dfa10175e87149c98d7ea1051f841b37e51c 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ApplyCorr.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ApplyCorr.h
@@ -10,7 +10,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class ApplyCorr : public IDATab
+  class DLLExport ApplyCorr : public IDATab
   {
     Q_OBJECT
 
@@ -18,21 +18,24 @@ namespace IDA
     ApplyCorr(QWidget * parent = 0);
 
   private slots:
+    /// Handles the geometry being changed
     void handleGeometryChange(int index);
+    /// Handles a new sample being loaded
     void newData(const QString &dataName);
+    /// Updates the preview mini plot
+    void plotPreview(int specIndex);
 
   private:
     virtual void setup();
     virtual void run();
-    virtual QString validate();
+    virtual bool validate();
     virtual void loadSettings(const QSettings & settings);
     virtual QString helpURL() {return "AbsCor";}
-
-    QDoubleValidator *m_valPosDbl; ///< validator for positive double inputs.
-
     bool validateScaleInput(); ///< validate input for Scale option.
     /// ask the user if they wish to rebin the can
     bool requireCanRebin();
+    /// Pointer to the result workspace (for plotting)
+    Mantid::API::MatrixWorkspace_sptr outputWs;
 
   private slots:
     void scaleMultiplierCheck(bool state); ///< handle checking/unchecking of "Scale: Multiply Container by"
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/CalcCorr.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/CalcCorr.h
index 36a80dc030443c435ac7db9b8badc146a3a37699..1c56fd8fefcca653c62a6c6dc067363ad4a8c2d2 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/CalcCorr.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/CalcCorr.h
@@ -9,7 +9,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class CalcCorr : public IDATab
+  class DLLExport CalcCorr : public IDATab
   {
     Q_OBJECT
 
@@ -19,7 +19,7 @@ namespace IDA
   private:
     virtual void setup();
     virtual void run();
-    virtual QString validate();
+    virtual bool validate();
     virtual void loadSettings(const QSettings & settings);
     virtual QString helpURL() {return "AbsF2P";}
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ConvFit.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ConvFit.h
index d349967ab549f4ceb895d62d1e0a54cc69df5d95..7d16c64314d679eb1e7926c510921a701dcfd70d 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ConvFit.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/ConvFit.h
@@ -13,7 +13,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class ConvFit : public IDATab
+  class DLLExport ConvFit : public IDATab
   {
     Q_OBJECT
 
@@ -23,7 +23,7 @@ namespace IDA
   private:
     virtual void setup();
     virtual void run();
-    virtual QString validate();
+    virtual bool validate();
     virtual void loadSettings(const QSettings & settings);
     virtual QString helpURL() {return "ConvFit";}
 
@@ -54,20 +54,9 @@ namespace IDA
     QString fitTypeString() const;
     QString backgroundString() const;
 
-    QIntValidator * m_intVal;
     QtStringPropertyManager* m_stringManager;
     QtTreePropertyBrowser* m_cfTree;
-    QwtPlot* m_cfPlot;
-    QMap<QString, QtProperty*> m_cfProp;
     QMap<QtProperty*, QtProperty*> m_fixedProps;
-    MantidWidgets::RangeSelector* m_cfRangeS;
-    MantidWidgets::RangeSelector* m_cfBackgS;
-    MantidWidgets::RangeSelector* m_cfHwhmRange;
-    QtGroupPropertyManager* m_cfGrpMng;
-    QtDoublePropertyManager* m_cfDblMng;
-    QtBoolPropertyManager* m_cfBlnMng;
-    QwtPlotCurve* m_cfDataCurve;
-    QwtPlotCurve* m_cfCalcCurve;
     boost::shared_ptr<const Mantid::API::MatrixWorkspace> m_cfInputWS;
     QString m_cfInputWSName;
     bool m_confitResFileType;
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Elwin.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Elwin.h
index 216602d9243de66db07121e3c7e0b40251d91b67..f7478f49aaf170455ef00a168be95ce3dc74736f 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Elwin.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Elwin.h
@@ -10,7 +10,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class Elwin : public IDATab
+  class DLLExport Elwin : public IDATab
   {
     Q_OBJECT
 
@@ -20,7 +20,7 @@ namespace IDA
   private:
     virtual void setup();
     virtual void run();
-    virtual QString validate();
+    virtual bool validate();
     virtual void loadSettings(const QSettings & settings);
     virtual QString helpURL() {return "Elwin";}
     void setDefaultResolution(Mantid::API::MatrixWorkspace_const_sptr ws);
@@ -34,15 +34,8 @@ namespace IDA
     void updateRS(QtProperty * prop, double val);
 
   private:
-    QwtPlot* m_elwPlot;
-    MantidWidgets::RangeSelector* m_elwR1;
-    MantidWidgets::RangeSelector* m_elwR2;
-    QwtPlotCurve* m_elwDataCurve;
     QtTreePropertyBrowser* m_elwTree;
-    QMap<QString, QtProperty*> m_elwProp;
-    QtDoublePropertyManager* m_elwDblMng;
-    QtBoolPropertyManager* m_elwBlnMng;
-    QtGroupPropertyManager* m_elwGrpMng;
+
   };
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Fury.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Fury.h
index b20759f607fe96ac7856c830efc47b96a0062b57..eb63d5f6066366bb3b9bd4433c26a91ae22399b1 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Fury.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/Fury.h
@@ -9,7 +9,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class Fury : public IDATab
+  class DLLExport Fury : public IDATab
   {
     Q_OBJECT
 
@@ -19,7 +19,7 @@ namespace IDA
   private:
     virtual void setup();
     virtual void run();
-    virtual QString validate();
+    virtual bool validate();
     virtual void loadSettings(const QSettings & settings);
     virtual QString helpURL() {return "Fury";}
 
@@ -31,12 +31,7 @@ namespace IDA
     void calculateBinning();
       
   private:
-    QwtPlot* m_furPlot;
-    MantidWidgets::RangeSelector* m_furRange;
-    QwtPlotCurve* m_furCurve;
     QtTreePropertyBrowser* m_furTree;
-    QMap<QString, QtProperty*> m_furProp;
-    QtDoublePropertyManager* m_furDblMng;
     bool m_furyResFileType;
 
   };
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/FuryFit.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/FuryFit.h
index a5764a12e4c6881f888c26c42fd28b2b3532f695..a85db056ce08d736b42d30b86b38a319bb45ff0b 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/FuryFit.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/FuryFit.h
@@ -5,7 +5,6 @@
 #include "MantidAPI/CompositeFunction.h"
 #include "MantidAPI/MatrixWorkspace.h"
 
-
 #include "boost/shared_ptr.hpp"
 
 namespace Mantid
@@ -23,7 +22,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class FuryFit : public IDATab
+  class DLLExport FuryFit : public IDATab
   {
     Q_OBJECT
 
@@ -33,7 +32,7 @@ namespace IDA
   private:
     virtual void setup();
     virtual void run();
-    virtual QString validate();
+    virtual bool validate();
     virtual void loadSettings(const QSettings & settings);
     virtual QString helpURL() {return "FuryFit";}
 
@@ -58,25 +57,16 @@ namespace IDA
     void setDefaultParameters(const QString& name);
     QString fitTypeString() const;
     void constrainIntensities(Mantid::API::CompositeFunction_sptr func);
-
     
-    QIntValidator * m_intVal;
     QtStringPropertyManager* m_stringManager;
     QtTreePropertyBrowser* m_ffTree; ///< FuryFit Property Browser
-    QtGroupPropertyManager* m_groupManager;
-    QtDoublePropertyManager* m_ffDblMng;
     QtDoublePropertyManager* m_ffRangeManager; ///< StartX and EndX for FuryFit
-    QMap<QString, QtProperty*> m_ffProp;
     QMap<QtProperty*, QtProperty*> m_fixedProps;
-    QwtPlot* m_ffPlot;
-    QwtPlotCurve* m_ffDataCurve;
-    QwtPlotCurve* m_ffFitCurve;
-    MantidQt::MantidWidgets::RangeSelector* m_ffRangeS;
-    MantidQt::MantidWidgets::RangeSelector* m_ffBackRangeS;
     boost::shared_ptr<const Mantid::API::MatrixWorkspace> m_ffInputWS;
     boost::shared_ptr<const Mantid::API::MatrixWorkspace> m_ffOutputWS;
     QString m_ffInputWSName;
     QString m_ties;
+
   };
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IDATab.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IDATab.h
index 35ed290acdafe6d931f3e5f62e56347973256286..0370f251f7177fa6a375decd6f92fde5dc6d36e7 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IDATab.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IDATab.h
@@ -4,6 +4,7 @@
 #include "MantidAPI/AlgorithmManager.h"
 #include "MantidAPI/MatrixWorkspace.h"
 #include "MantidQtCustomInterfaces/IndirectDataAnalysis.h"
+#include "MantidQtCustomInterfaces/IndirectTab.h"
 
 class QwtPlotCurve;
 class QwtPlot;
@@ -44,7 +45,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class IDATab : public QWidget
+  class DLLExport IDATab : public IndirectTab
   {
     Q_OBJECT
 
@@ -52,43 +53,27 @@ namespace IDA
     /// Constructor
     IDATab(QWidget * parent = 0);
 
-    /// Sets up the tab.
-    void setupTab();
-    /// Runs the tab.
-    void runTab();
     /// Loads the tab's settings.
     void loadTabSettings(const QSettings & settings);
     /// Returns the URL of the Mantid Wiki webpage for the tab.
     QString tabHelpURL();
 
+  signals:
+		/// Send signal to parent window to show a message box to user
+		void showMessageBox(const QString& message);
+
   protected:
-    /// Displays the given message in a dialog box.
-    void showInformationBox(const QString & message);
-    /// Run a piece of python code and return any output that was written to stdout
-    QString runPythonCode(const QString & code, bool no_output = false);
-    /// Run load nexus and return the workspace.
-    Mantid::API::MatrixWorkspace_const_sptr runLoadNexus(const QString & filename, const QString & wsname);
-
-    /// Creates and returns a "mini plot" looking up the workspace from the ADS
-    QwtPlotCurve* plotMiniplot(QwtPlot* plot, QwtPlotCurve* curve, const QString & workspace, size_t index);
-    /// Creates and returns a "mini plot".
-    QwtPlotCurve* plotMiniplot(QwtPlot* plot, QwtPlotCurve* curve, const  Mantid::API::MatrixWorkspace_const_sptr & workspace, size_t index);
-
-    /// Returns the range of the given curve data.
-    std::pair<double,double> getCurveRange(QwtPlotCurve* curve);
+    /// Function to run a string as python code
+    void runPythonScript(const QString& pyInput);
     /// Check the binning between two workspaces match
     bool checkWorkspaceBinningMatches(Mantid::API::MatrixWorkspace_const_sptr left, 
                                       Mantid::API::MatrixWorkspace_const_sptr right);
 
-    /// Function to run an algorithm on a seperate thread
-    void runAlgorithm(const Mantid::API::IAlgorithm_sptr algorithm);
-
-    /// Algorithm runner object to execute algorithms on a seperate thread from the gui
-    MantidQt::API::AlgorithmRunner* m_algRunner;
     /// Returns a handle to the UI form object stored in the IndirectDataAnalysis class.
     Ui::IndirectDataAnalysis & uiForm();
     /// Returns a const handle to the UI form object stored in the IndirectDataAnalysis class.
     const Ui::IndirectDataAnalysis & uiForm() const;
+
     /// Returns a handle to the DoubleEditorFactory object stored in the IndirectDataAnalysis class.
     DoubleEditorFactory * doubleEditorFactory();
     /// Returns a handle to the QtCheckBoxFactory object stored in the IndirectDataAnalysis class.
@@ -104,7 +89,8 @@ namespace IDA
     /// Overidden by child class.
     virtual void run() = 0;
     /// Overidden by child class.
-    virtual QString validate() = 0;
+    virtual bool validate() = 0;
+
     /// Overidden by child class.
     virtual void loadSettings(const QSettings & settings) = 0;
     /// Overidden by child class.
@@ -112,6 +98,7 @@ namespace IDA
 
     /// A pointer to the parent (friend) IndirectDataAnalysis object.
     IndirectDataAnalysis * m_parent;
+
   };
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectBayesTab.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectBayesTab.h
index 64417fcb83bd664b21b01a3adf0de5dd0260e4de..e00183e5242bba94625d9ca49e02f0a970bdc1d2 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectBayesTab.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectBayesTab.h
@@ -89,8 +89,6 @@ namespace MantidQt
 			virtual void loadSettings(const QSettings& settings) = 0;
 
 		signals:
-			/// Send signal to parent window to execute python script
-			void executePythonScript(const QString& pyInput, bool output);
 			/// Send signal to parent window to show a message box to user
 			void showMessageBox(const QString& message);
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.h
index 97c5222b81121b266dc2a4785b771d0e9c47fd47..3d523b43c3118cfc9e801dd94b6f1adaf9b85c61 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.h
@@ -6,6 +6,7 @@
 //----------------------
 #include "ui_IndirectDataAnalysis.h"
 #include "MantidQtAPI/UserSubWindow.h"
+#include "MantidQtCustomInterfaces/IndirectTab.h"
 
 #include <Poco/NObserver.h>
 #include "MantidKernel/ConfigService.h"
@@ -80,6 +81,8 @@ namespace IDA
     void openDirectoryDialog();
     /// Opens the Mantid Wiki web page of the current tab.
     void help();
+    /// Slot showing a message box to the user
+    void showMessageBox(const QString& message);
 
   private:
     /// UI form containing all Qt elements.
@@ -99,6 +102,7 @@ namespace IDA
 
     /// Map of unsigned int (TabChoice enum values) to tabs.
     std::map<unsigned int, IDATab*> m_tabs;
+
   };
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.ui b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.ui
index 1c545a6f47cf72d2e3bd455362c24fa293fa2a49..4f695252715dca29cd6f7ac26b6c29928107d896 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.ui
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectDataAnalysis.ui
@@ -2422,6 +2422,13 @@
        <string>Apply Corrections</string>
       </attribute>
       <layout class="QVBoxLayout" name="verticalLayout_2">
+       <item>
+        <widget class="QGroupBox" name="abscor_gbInput">
+         <property name="title">
+          <string>Input</string>
+         </property>
+         <layout class="QVBoxLayout" name="abscor_loInput">
+
        <item>
         <widget class="MantidQt::MantidWidgets::DataSelector" name="abscor_dsSample" native="true">
          <property name="sizePolicy">
@@ -2450,6 +2457,17 @@
          </property>
         </widget>
        </item>
+
+     </layout>
+    </widget>
+   </item>
+
+       <item>
+        <widget class="QGroupBox" name="abscor_gbOptions">
+         <property name="title">
+          <string>Options</string>
+         </property>
+         <layout class="QHBoxLayout" name="abscor_loOptions">
        <item>
         <layout class="QGridLayout" name="gridLayout_4">
          <item row="0" column="0">
@@ -2492,7 +2510,7 @@
             </sizepolicy>
            </property>
            <property name="autoLoad" stdset="0">
-            <bool>false</bool>
+            <bool>true</bool>
            </property>
            <property name="workspaceSuffixes" stdset="0">
             <stringlist>
@@ -2574,65 +2592,83 @@
          </item>
         </layout>
        </item>
-       <item>
-        <spacer name="abscor_verticalSpacer">
-         <property name="orientation">
-          <enum>Qt::Vertical</enum>
-         </property>
-         <property name="sizeHint" stdset="0">
-          <size>
-           <width>20</width>
-           <height>40</height>
-          </size>
-         </property>
-        </spacer>
+        </layout>
+        </widget>
        </item>
+
+
+        <item>
+         <widget class="QGroupBox" name="abscor_gbPreview">
+          <property name="title">
+           <string>Preview</string>
+          </property>
+          <layout class="QHBoxLayout" name="horizontalLayout_11">
+           <item>
+            <layout class="QVBoxLayout" name="abscor_plotPreview"/>
+           </item>
+           <item>
+            <layout class="QVBoxLayout" name="abscor_plotLegend">
+             <item>
+              <widget class="QLabel" name="abscor_plotLSample">
+               <property name="text">
+                <string>Sample</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QLabel" name="abscor_plotLCan">
+               <property name="styleSheet">
+                <string notr="true">color: rgb(255, 0, 0);</string>
+               </property>
+               <property name="text">
+                <string>Can</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QLabel" name="abscor_plotLCorr">
+               <property name="styleSheet">
+                <string notr="true">color: rgb(0, 255, 0);</string>
+               </property>
+               <property name="text">
+                <string>Corrected</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <spacer name="verticalSpacer">
+               <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>
+              <widget class="QLabel" name="abscor_lbPreviewSPec">
+               <property name="text">
+                <string>Spectrum:</string>
+               </property>
+              </widget>
+             </item>
+             <item>
+              <widget class="QSpinBox" name="abscor_spPreviewSpec"/>
+             </item>
+            </layout>
+           </item>
+          </layout>
+         </widget>
+        </item>
        <item>
         <widget class="QGroupBox" name="groupBox">
          <property name="title">
           <string>Output Options</string>
          </property>
          <layout class="QVBoxLayout" name="verticalLayout_3">
-          <item>
-           <layout class="QHBoxLayout" name="horizontalLayout_33">
-            <item>
-             <spacer name="horizontalSpacer_9">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-            <item>
-             <widget class="QCheckBox" name="abscor_ckPlotContrib">
-              <property name="enabled">
-               <bool>false</bool>
-              </property>
-              <property name="text">
-               <string>Plot Contributions</string>
-              </property>
-             </widget>
-            </item>
-            <item>
-             <spacer name="horizontalSpacer_25">
-              <property name="orientation">
-               <enum>Qt::Horizontal</enum>
-              </property>
-              <property name="sizeHint" stdset="0">
-               <size>
-                <width>40</width>
-                <height>20</height>
-               </size>
-              </property>
-             </spacer>
-            </item>
-           </layout>
-          </item>
           <item>
            <layout class="QHBoxLayout" name="abscor_layoutPlotOutput">
             <item>
@@ -2880,7 +2916,6 @@
   <tabstop>abscor_ckScaleMultiplier</tabstop>
   <tabstop>abscor_leScaleMultiplier</tabstop>
   <tabstop>abscor_ckUseCorrections</tabstop>
-  <tabstop>abscor_ckPlotContrib</tabstop>
   <tabstop>abscor_ckVerbose</tabstop>
   <tabstop>abscor_ckSave</tabstop>
  </tabstops>
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectTab.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectTab.h
index dd32eeed6506e877b9417a04922af0df0cab065f..327bcfbb210597be65e769355db000afaf2c1a07 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectTab.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/IndirectTab.h
@@ -92,6 +92,8 @@ namespace CustomInterfaces
     void plotMiniPlot(const Mantid::API::MatrixWorkspace_const_sptr & workspace, size_t wsIndex, const QString& plotID, const QString& curveID = "");
     /// Function to replot a miniplot
     void replot(const QString& plotID);
+    /// Function to remove a curve from a plot
+    void removeCurve(const QString& curveID);
 
     /// Function to get the range of the curve displayed on the mini plot
     std::pair<double, double> getCurveRange(const QString& plotID);
@@ -108,6 +110,8 @@ namespace CustomInterfaces
     /// Function to run an algorithm on a seperate thread
     void runAlgorithm(const Mantid::API::IAlgorithm_sptr algorithm);
 
+    QString runPythonCode(QString vode, bool no_output = false);
+
     /// Parent QWidget (if applicable)
     QWidget *m_parentWidget;
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MSDFit.h b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MSDFit.h
index bb9602f2dd1e80a04847ef94f17f8e4872d7fa5d..00d4dbefd21d1af1203ccd4dc360ddad907d61f9 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MSDFit.h
+++ b/Code/Mantid/MantidQt/CustomInterfaces/inc/MantidQtCustomInterfaces/MSDFit.h
@@ -9,7 +9,7 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  class MSDFit : public IDATab
+  class DLLExport MSDFit : public IDATab
   {
     Q_OBJECT
 
@@ -19,7 +19,7 @@ namespace IDA
   private:
     virtual void setup();
     virtual void run();
-    virtual QString validate();
+    virtual bool validate();
     virtual void loadSettings(const QSettings & settings);
     virtual QString helpURL() {return "MSDFit";}
 
@@ -33,14 +33,8 @@ namespace IDA
     
   private:
     QString currentWsName;
-    QIntValidator * m_intVal;
-    QwtPlot* m_msdPlot;
-    MantidWidgets::RangeSelector* m_msdRange;
-    QwtPlotCurve* m_msdDataCurve;
-    QwtPlotCurve* m_msdFitCurve;
     QtTreePropertyBrowser* m_msdTree;
-    QMap<QString, QtProperty*> m_msdProp;
-    QtDoublePropertyManager* m_msdDblMng;
+
   };
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ApplyCorr.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ApplyCorr.cpp
index b3ea0d159d27610c84c0a4edade57b572a40e009..3586c5c5acfe7630554bbe2e350cc08a48d8814e 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/ApplyCorr.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ApplyCorr.cpp
@@ -1,5 +1,6 @@
 #include "MantidQtCustomInterfaces/ApplyCorr.h"
 #include "MantidAPI/AnalysisDataService.h"
+#include "MantidAPI/TextAxis.h"
 
 #include <QStringList>
 
@@ -29,16 +30,25 @@ namespace IDA
     connect(uiForm().abscor_ckUseCorrections, SIGNAL(toggled(bool)), uiForm().abscor_dsCorrections, SLOT(setEnabled(bool)));
     connect(uiForm().abscor_ckScaleMultiplier, SIGNAL(toggled(bool)), this, SLOT(scaleMultiplierCheck(bool)));
     connect(uiForm().abscor_cbGeometry, SIGNAL(currentIndexChanged(int)), this, SLOT(handleGeometryChange(int)));
-    connect(uiForm().abscor_ckUseCan, SIGNAL(toggled(bool)), uiForm().abscor_ckPlotContrib, SLOT(setEnabled(bool)));
     connect(uiForm().abscor_dsSample, SIGNAL(dataReady(const QString&)), this, SLOT(newData(const QString&)));
+    connect(uiForm().abscor_spPreviewSpec, SIGNAL(valueChanged(int)), this, SLOT(plotPreview(int)));
 
     // Create a validator for input box of the Scale option.
-    m_valPosDbl = new QDoubleValidator(this);
     const double tolerance = 0.00001; // Tolerance chosen arbitrarily.
     m_valPosDbl->setBottom(tolerance);
 
     // Apply the validator to the input box for the Scale option.
     uiForm().abscor_leScaleMultiplier->setValidator(m_valPosDbl);
+
+    // Create the plot
+    m_plots["ApplyCorrPlot"] = new QwtPlot(m_parentWidget);
+    m_plots["ApplyCorrPlot"]->setCanvasBackground(Qt::white);
+    m_plots["ApplyCorrPlot"]->setAxisFont(QwtPlot::xBottom, m_parentWidget->font());
+    m_plots["ApplyCorrPlot"]->setAxisFont(QwtPlot::yLeft, m_parentWidget->font());
+	  uiForm().abscor_plotPreview->addWidget(m_plots["ApplyCorrPlot"]);
+
+    uiForm().abscor_spPreviewSpec->setMinimum(0);
+    uiForm().abscor_spPreviewSpec->setMaximum(0);
   }
 
   /**
@@ -77,6 +87,15 @@ namespace IDA
     }
 
     uiForm().abscor_ckUseCorrections->setEnabled(!isSqw);
+
+    removeCurve("CalcCurve");
+    removeCurve("CanCurve");
+    // removeCurve would usually need a replot() but this is done in plotMiniPlot()
+
+    plotMiniPlot(dataName, 0, "ApplyCorrPlot", "ApplyCorrSampleCurve");
+
+    MatrixWorkspace_const_sptr sampleWs =  AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(dataName.toStdString());
+    uiForm().abscor_spPreviewSpec->setMaximum(static_cast<int>(sampleWs->getNumberHistograms()) - 1);
   }
 
   bool ApplyCorr::validateScaleInput()
@@ -116,32 +135,17 @@ namespace IDA
     QString pyInput = "from IndirectDataAnalysis import abscorFeeder, loadNexus\n";
 
     QString sample = uiForm().abscor_dsSample->getCurrentDataName();
-    MatrixWorkspace_const_sptr sampleWs;
-    if (!Mantid::API::AnalysisDataService::Instance().doesExist(sample.toStdString()) )
-    {
-      sampleWs = runLoadNexus(uiForm().abscor_dsSample->getFullFilePath(), sample);
-    }
-    else
-    {
-      sampleWs =  AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(sample.toStdString());
-    }
+    MatrixWorkspace_const_sptr sampleWs =  AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(sample.toStdString());
 
     pyInput += "sample = '"+sample+"'\n";
     pyInput += "rebin_can = False\n";
     bool noContainer = false;
 
-    if ( uiForm().abscor_ckUseCan->isChecked() )
+    bool useCan = uiForm().abscor_ckUseCan->isChecked();
+    if(useCan)
     {
       QString container = uiForm().abscor_dsContainer->getCurrentDataName();
-      MatrixWorkspace_const_sptr canWs;
-      if ( !Mantid::API::AnalysisDataService::Instance().doesExist(container.toStdString()) )
-      {
-        canWs = runLoadNexus(uiForm().abscor_dsContainer->getFullFilePath(), container);
-      }
-      else
-      {
-        canWs =  AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(container.toStdString());
-      }
+      MatrixWorkspace_const_sptr canWs =  AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(container.toStdString());
 
       if (!checkWorkspaceBinningMatches(sampleWs, canWs))
       {
@@ -189,7 +193,7 @@ namespace IDA
       // if we have no container and no corrections then abort
       if(noContainer)
       {
-        showInformationBox("Apply Corrections requires either a can file or a corrections file.");
+        showMessageBox("Apply Corrections requires either a can file or a corrections file.");
         return;
       }
     }
@@ -230,13 +234,12 @@ namespace IDA
     }
     
     pyInput += "plotResult = '" + plotResult + "'\n";
-        
-    if ( uiForm().abscor_ckPlotContrib->isChecked() ) pyInput += "plotContrib = True\n";
-    else pyInput += "plotContrib = False\n";
-
-    pyInput += "abscorFeeder(sample, container, geom, useCor, corrections, Verbose=verbose, RebinCan=rebin_can, ScaleOrNotToScale=scale, factor=scaleFactor, Save=save, PlotResult=plotResult, PlotContrib=plotContrib)\n";
+    pyInput += "print abscorFeeder(sample, container, geom, useCor, corrections, Verbose=verbose, RebinCan=rebin_can, ScaleOrNotToScale=scale, factor=scaleFactor, Save=save, PlotResult=plotResult)\n";
 
     QString pyOutput = runPythonCode(pyInput).trimmed();
+
+    outputWs = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(pyOutput.toStdString());
+    plotPreview(uiForm().abscor_spPreviewSpec->value());
   }
 
   /**
@@ -247,14 +250,14 @@ namespace IDA
   {
     QString message = "The sample and can energy ranges do not match, this is not recommended."
         "\n\n Click OK to rebin the can to match the sample and continue or Cancel to abort applying corrections.";
-    QMessageBox::StandardButton reply = QMessageBox::warning(this, "Energy Ranges Do Not Match", 
+    QMessageBox::StandardButton reply = QMessageBox::warning(m_parentWidget, "Energy Ranges Do Not Match", 
                                                              message, QMessageBox::Ok|QMessageBox::Cancel);
     return (reply == QMessageBox::Ok);
   }
 
-  QString ApplyCorr::validate()
+  bool ApplyCorr::validate()
   {
-    return "";
+    return true;
   }
 
   void ApplyCorr::loadSettings(const QSettings & settings)
@@ -288,6 +291,45 @@ namespace IDA
         break;
     }
   }
+  
+  /**
+   * Replots the preview plot.
+   *
+   * @param specIndex Spectrum index to plot
+   */
+  void ApplyCorr::plotPreview(int specIndex)
+  {
+    bool useCan = uiForm().abscor_ckUseCan->isChecked();
+
+    // Plot sample
+    QString sample = uiForm().abscor_dsSample->getCurrentDataName();
+    if(AnalysisDataService::Instance().doesExist(sample.toStdString()))
+    {
+      MatrixWorkspace_const_sptr sampleWs =  AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(sample.toStdString());
+      plotMiniPlot(sampleWs, specIndex, "ApplyCorrPlot", "ApplyCorrSampleCurve");
+    }
+
+    // Plot result
+    if(outputWs)
+    {
+      plotMiniPlot(outputWs, specIndex, "ApplyCorrPlot", "CalcCurve");
+      m_curves["CalcCurve"]->setPen(QColor(Qt::green));
+    }
+
+    // Plot can
+    if(useCan)
+    {
+      QString container = uiForm().abscor_dsContainer->getCurrentDataName();
+      MatrixWorkspace_const_sptr canWs =  AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(container.toStdString());
+      plotMiniPlot(canWs, specIndex, "ApplyCorrPlot", "CanCurve");
+      m_curves["CanCurve"]->setPen(QColor(Qt::red));
+    }
+    else
+      removeCurve("CanCurve");
+
+    replot("ApplyCorrPlot");
+  }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/CalcCorr.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/CalcCorr.cpp
index 8ae5b3c6e9c024302d23505e9db37f7f4a1fb5f1..5f2b6bf88bf29e7cbe140f0e9d38409f0d73cdc5 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/CalcCorr.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/CalcCorr.cpp
@@ -148,18 +148,10 @@ namespace IDA
     allFields = positiveDoubleFields;
     allFields += uiForm().absp_leavar;
 
-    // Connect up all fields to inputChanged method of IDATab (calls validate).
-    foreach(QLineEdit * field, allFields)
-    {
-      connect(field, SIGNAL(textEdited(const QString &)), this, SLOT(inputChanged()));
-    }
-
     QRegExp regex("[A-Za-z0-9\\-\\(\\)]*");
     QValidator *formulaValidator = new QRegExpValidator(regex, this);
     uiForm().absp_leSampleFormula->setValidator(formulaValidator);
     uiForm().absp_leCanFormula->setValidator(formulaValidator);
-    connect(uiForm().absp_leSampleFormula, SIGNAL(textEdited(const QString &)), this, SLOT(inputChanged()));
-    connect(uiForm().absp_leCanFormula, SIGNAL(textEdited(const QString &)), this, SLOT(inputChanged()));
 
     // "Nudge" color of title of QGroupBox to change.
     useCanChecked(uiForm().absp_ckUseCan->isChecked());
@@ -288,10 +280,11 @@ namespace IDA
       "canFormula = " + canFormula + "\n"
       "IndirectAbsCor.AbsRunFeeder(inputws, canws, geom, ncan, size, avar, density, beam, sampleFormula, canFormula, sigs, siga, plot_opt=plotOpt, save=save, verbose=verbose)\n";
 
-    QString pyOutput = runPythonCode(pyInput).trimmed();
+    QString pyOutput = runPythonCode(pyInput);
+    UNUSED_ARG(pyOutput);
   }
 
-  QString CalcCorr::validate()
+  bool CalcCorr::validate()
   {
     UserInputValidator uiv;
     bool useCan = uiForm().absp_ckUseCan->isChecked();
@@ -390,7 +383,10 @@ namespace IDA
       }
     }
 
-    return uiv.generateErrorMessage();
+    QString error = uiv.generateErrorMessage();
+    showMessageBox(error);
+
+    return error.isEmpty();
   }
 
   void CalcCorr::loadSettings(const QSettings & settings)
@@ -478,7 +474,7 @@ namespace IDA
     
     if (!ws)
     {
-      showInformationBox("Failed to find workspace " + wsname);
+      showMessageBox("Failed to find workspace " + wsname);
       return; 
     }
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/ConvFit.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/ConvFit.cpp
index 33aa8d97ffd7feb6838526617cc6a833d2da3333..743f2139559049165826511a68050e13bf3e2dc1 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/ConvFit.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/ConvFit.cpp
@@ -26,21 +26,17 @@ namespace CustomInterfaces
 namespace IDA
 {
   ConvFit::ConvFit(QWidget * parent) : 
-    IDATab(parent), m_intVal(NULL), m_stringManager(NULL), m_cfTree(NULL), 
-      m_cfPlot(NULL), m_cfProp(), m_fixedProps(), m_cfRangeS(NULL), m_cfBackgS(NULL), 
-      m_cfHwhmRange(NULL), m_cfGrpMng(NULL), m_cfDblMng(NULL), m_cfBlnMng(NULL), m_cfDataCurve(NULL), 
-      m_cfCalcCurve(NULL), m_cfInputWS(), m_cfInputWSName(), m_confitResFileType()
+    IDATab(parent),
+    m_stringManager(NULL), m_cfTree(NULL), 
+    m_fixedProps(),
+    m_cfInputWS(), m_cfInputWSName(),
+    m_confitResFileType()
   {
   }
   
   void ConvFit::setup()
   {
-    m_intVal = new QIntValidator(this);
-    
     // Create Property Managers
-    m_cfGrpMng = new QtGroupPropertyManager();
-    m_cfBlnMng = new QtBoolPropertyManager();
-    m_cfDblMng = new QtDoublePropertyManager();
     m_stringManager = new QtStringPropertyManager();
 
     // Create TreeProperty Widget
@@ -48,79 +44,77 @@ namespace IDA
     uiForm().confit_properties->addWidget(m_cfTree);
 
     // add factories to managers
-    m_cfTree->setFactoryForManager(m_cfBlnMng, qtCheckBoxFactory());
-    m_cfTree->setFactoryForManager(m_cfDblMng, doubleEditorFactory());
+    m_cfTree->setFactoryForManager(m_blnManager, qtCheckBoxFactory());
+    m_cfTree->setFactoryForManager(m_dblManager, doubleEditorFactory());
 
     // Create Plot Widget
-    m_cfPlot = new QwtPlot(this);
-    m_cfPlot->setAxisFont(QwtPlot::xBottom, this->font());
-    m_cfPlot->setAxisFont(QwtPlot::yLeft, this->font());
-    m_cfPlot->setCanvasBackground(Qt::white);
-    uiForm().confit_plot->addWidget(m_cfPlot);
+    m_plots["ConvFitPlot"] = new QwtPlot(m_parentWidget);
+    m_plots["ConvFitPlot"]->setAxisFont(QwtPlot::xBottom, m_parentWidget->font());
+    m_plots["ConvFitPlot"]->setAxisFont(QwtPlot::yLeft, m_parentWidget->font());
+    m_plots["ConvFitPlot"]->setCanvasBackground(Qt::white);
+    uiForm().confit_plot->addWidget(m_plots["ConvFitPlot"]);
 
     // Create Range Selectors
-    m_cfRangeS = new MantidQt::MantidWidgets::RangeSelector(m_cfPlot);
-    m_cfBackgS = new MantidQt::MantidWidgets::RangeSelector(m_cfPlot, 
+    m_rangeSelectors["ConvFitRange"] = new MantidQt::MantidWidgets::RangeSelector(m_plots["ConvFitPlot"]);
+    m_rangeSelectors["ConvFitBackRange"] = new MantidQt::MantidWidgets::RangeSelector(m_plots["ConvFitPlot"], 
       MantidQt::MantidWidgets::RangeSelector::YSINGLE);
-    m_cfBackgS->setColour(Qt::darkGreen);
-    m_cfBackgS->setRange(0.0, 1.0);
-    m_cfHwhmRange = new MantidQt::MantidWidgets::RangeSelector(m_cfPlot);
-    m_cfHwhmRange->setColour(Qt::red);
+    m_rangeSelectors["ConvFitBackRange"]->setColour(Qt::darkGreen);
+    m_rangeSelectors["ConvFitBackRange"]->setRange(0.0, 1.0);
+    m_rangeSelectors["ConvFitHWHM"] = new MantidQt::MantidWidgets::RangeSelector(m_plots["ConvFitPlot"]);
+    m_rangeSelectors["ConvFitHWHM"]->setColour(Qt::red);
 
     // Populate Property Widget
 
     // Option to convolve members
-    m_cfProp["Convolve"] = m_cfBlnMng->addProperty("Convolve");
-    m_cfTree->addProperty(m_cfProp["Convolve"]);
-    m_cfBlnMng->setValue(m_cfProp["Convolve"], true);
-
-    // Fit Range
-    m_cfProp["FitRange"] = m_cfGrpMng->addProperty("Fitting Range");
-    m_cfProp["StartX"] = m_cfDblMng->addProperty("StartX");
-    m_cfDblMng->setDecimals(m_cfProp["StartX"], NUM_DECIMALS);
-    m_cfProp["EndX"] = m_cfDblMng->addProperty("EndX");
-    m_cfDblMng->setDecimals(m_cfProp["EndX"], NUM_DECIMALS);
-    m_cfProp["FitRange"]->addSubProperty(m_cfProp["StartX"]);
-    m_cfProp["FitRange"]->addSubProperty(m_cfProp["EndX"]);
-    m_cfTree->addProperty(m_cfProp["FitRange"]);
-
-    // Background Range
-    m_cfProp["LinearBackground"] = m_cfGrpMng->addProperty("Background");
-    m_cfProp["BGA0"] = m_cfDblMng->addProperty("A0");
-    m_cfDblMng->setDecimals(m_cfProp["BGA0"], NUM_DECIMALS);
-    m_cfProp["BGA1"] = m_cfDblMng->addProperty("A1");
-    m_cfDblMng->setDecimals(m_cfProp["BGA1"], NUM_DECIMALS);
-    m_cfProp["LinearBackground"]->addSubProperty(m_cfProp["BGA0"]);
-    m_cfProp["LinearBackground"]->addSubProperty(m_cfProp["BGA1"]);
-    m_cfTree->addProperty(m_cfProp["LinearBackground"]);
+    m_properties["Convolve"] = m_blnManager->addProperty("Convolve");
+    m_cfTree->addProperty(m_properties["Convolve"]);
+    m_blnManager->setValue(m_properties["Convolve"], true);
+
+    m_properties["FitRange"] = m_grpManager->addProperty("Fitting Range");
+    m_properties["StartX"] = m_dblManager->addProperty("StartX");
+    m_dblManager->setDecimals(m_properties["StartX"], NUM_DECIMALS);
+    m_properties["EndX"] = m_dblManager->addProperty("EndX");
+    m_dblManager->setDecimals(m_properties["EndX"], NUM_DECIMALS);
+    m_properties["FitRange"]->addSubProperty(m_properties["StartX"]);
+    m_properties["FitRange"]->addSubProperty(m_properties["EndX"]);
+    m_cfTree->addProperty(m_properties["FitRange"]);
+
+    m_properties["LinearBackground"] = m_grpManager->addProperty("Background");
+    m_properties["BGA0"] = m_dblManager->addProperty("A0");
+    m_dblManager->setDecimals(m_properties["BGA0"], NUM_DECIMALS);
+    m_properties["BGA1"] = m_dblManager->addProperty("A1");
+    m_dblManager->setDecimals(m_properties["BGA1"], NUM_DECIMALS);
+    m_properties["LinearBackground"]->addSubProperty(m_properties["BGA0"]);
+    m_properties["LinearBackground"]->addSubProperty(m_properties["BGA1"]);
+    m_cfTree->addProperty(m_properties["LinearBackground"]);
 
     // Delta Function
-    m_cfProp["DeltaFunction"] = m_cfGrpMng->addProperty("Delta Function");
-    m_cfProp["UseDeltaFunc"] = m_cfBlnMng->addProperty("Use");
-    m_cfProp["DeltaHeight"] = m_cfDblMng->addProperty("Height");
-    m_cfDblMng->setDecimals(m_cfProp["DeltaHeight"], NUM_DECIMALS);
-    m_cfProp["DeltaFunction"]->addSubProperty(m_cfProp["UseDeltaFunc"]);
-    m_cfTree->addProperty(m_cfProp["DeltaFunction"]);
+    m_properties["DeltaFunction"] = m_grpManager->addProperty("Delta Function");
+    m_properties["UseDeltaFunc"] = m_blnManager->addProperty("Use");
+    m_properties["DeltaHeight"] = m_dblManager->addProperty("Height");
+    m_dblManager->setDecimals(m_properties["DeltaHeight"], NUM_DECIMALS);
+    m_properties["DeltaFunction"]->addSubProperty(m_properties["UseDeltaFunc"]);
+    m_cfTree->addProperty(m_properties["DeltaFunction"]);
 
-    m_cfProp["Lorentzian1"] = createLorentzian("Lorentzian 1");
-    m_cfProp["Lorentzian2"] = createLorentzian("Lorentzian 2");
+    m_properties["Lorentzian1"] = createLorentzian("Lorentzian 1");
+    m_properties["Lorentzian2"] = createLorentzian("Lorentzian 2");
 
-    uiForm().confit_leTempCorrection->setValidator(new QDoubleValidator(this));
+    uiForm().confit_leTempCorrection->setValidator(new QDoubleValidator(m_parentWidget));
 
     // Connections
-    connect(m_cfRangeS, SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
-    connect(m_cfRangeS, SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
-    connect(m_cfBackgS, SIGNAL(minValueChanged(double)), this, SLOT(backgLevel(double)));
-    connect(m_cfHwhmRange, SIGNAL(minValueChanged(double)), this, SLOT(hwhmChanged(double)));
-    connect(m_cfHwhmRange, SIGNAL(maxValueChanged(double)), this, SLOT(hwhmChanged(double)));
-    connect(m_cfDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
-    connect(m_cfBlnMng, SIGNAL(valueChanged(QtProperty*, bool)), this, SLOT(checkBoxUpdate(QtProperty*, bool)));
-    connect(m_cfDblMng, SIGNAL(propertyChanged(QtProperty*)), this, SLOT(plotGuess(QtProperty*)));
+    connect(m_rangeSelectors["ConvFitRange"], SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
+    connect(m_rangeSelectors["ConvFitRange"], SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
+    connect(m_rangeSelectors["ConvFitBackRange"], SIGNAL(minValueChanged(double)), this, SLOT(backgLevel(double)));
+    connect(m_rangeSelectors["ConvFitHWHM"], SIGNAL(minValueChanged(double)), this, SLOT(hwhmChanged(double)));
+    connect(m_rangeSelectors["ConvFitHWHM"], SIGNAL(maxValueChanged(double)), this, SLOT(hwhmChanged(double)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
+    connect(m_blnManager, SIGNAL(valueChanged(QtProperty*, bool)), this, SLOT(checkBoxUpdate(QtProperty*, bool)));
+    connect(m_dblManager, SIGNAL(propertyChanged(QtProperty*)), this, SLOT(plotGuess(QtProperty*)));
     connect(uiForm().confit_ckTempCorrection, SIGNAL(toggled(bool)), uiForm().confit_leTempCorrection, SLOT(setEnabled(bool)));
 
     // Have FWHM Range linked to Fit Start/End Range
-    connect(m_cfRangeS, SIGNAL(rangeChanged(double, double)), m_cfHwhmRange, SLOT(setRange(double, double)));
-    m_cfHwhmRange->setRange(-1.0,1.0);
+    connect(m_rangeSelectors["ConvFitRange"], SIGNAL(rangeChanged(double, double)), m_rangeSelectors["ConvFitHWHM"], SLOT(setRange(double, double)));
+    m_rangeSelectors["ConvFitHWHM"]->setRange(-1.0,1.0);
     hwhmUpdateRS(0.02);
 
     typeSelection(uiForm().confit_cbFitType->currentIndex());
@@ -134,9 +128,9 @@ namespace IDA
     connect(uiForm().confit_cbBackground, SIGNAL(currentIndexChanged(int)), this, SLOT(bgTypeSelection(int)));
     connect(uiForm().confit_pbSingle, SIGNAL(clicked()), this, SLOT(singleFit()));
 
-    uiForm().confit_lePlotSpectrum->setValidator(m_intVal);
-    uiForm().confit_leSpectraMin->setValidator(m_intVal);
-    uiForm().confit_leSpectraMax->setValidator(m_intVal);
+    uiForm().confit_lePlotSpectrum->setValidator(m_valInt);
+    uiForm().confit_leSpectraMin->setValidator(m_valInt);
+    uiForm().confit_leSpectraMax->setValidator(m_valInt);
 
     // Context menu
     m_cfTree->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -149,13 +143,6 @@ namespace IDA
 
   void ConvFit::run()
   {
-    const QString error = validate();
-    if( ! error.isEmpty() )
-    {
-      showInformationBox(error);
-      return;
-    }
-
     if ( m_cfInputWS == NULL )
     {
       return;
@@ -174,8 +161,8 @@ namespace IDA
 
     Mantid::API::CompositeFunction_sptr func = createFunction(useTies);
     std::string function = std::string(func->asString());
-    QString stX = m_cfProp["StartX"]->valueText();
-    QString enX = m_cfProp["EndX"]->valueText();
+    QString stX = m_properties["StartX"]->valueText();
+    QString enX = m_properties["EndX"]->valueText();
 
     QString pyInput =
       "from IndirectDataAnalysis import confitSeq\n"
@@ -195,7 +182,7 @@ namespace IDA
 
     pyInput += uiForm().confit_ckSaveSeq->isChecked() ? "True\n" : "False\n";
 
-    if ( m_cfBlnMng->value(m_cfProp["Convolve"]) ) pyInput += "convolve = True\n";
+    if ( m_blnManager->value(m_properties["Convolve"]) ) pyInput += "convolve = True\n";
     else pyInput += "convolve = False\n";
 
     if ( uiForm().confit_ckVerbose->isChecked() ) pyInput += "verbose = True\n";
@@ -222,10 +209,8 @@ namespace IDA
 
   /**
    * Validates the user's inputs in the ConvFit tab.
-   *
-   * @returns an string containing an error message if invalid input detected, else an empty string.
    */
-  QString ConvFit::validate()
+  bool ConvFit::validate()
   {
     using Mantid::API::AnalysisDataService;
     
@@ -234,15 +219,18 @@ namespace IDA
     uiv.checkDataSelectorIsValid("Sample", uiForm().confit_dsSampleInput);
     uiv.checkDataSelectorIsValid("Resolution", uiForm().confit_dsResInput);
 
-    auto range = std::make_pair(m_cfDblMng->value(m_cfProp["StartX"]), m_cfDblMng->value(m_cfProp["EndX"]));
+    auto range = std::make_pair(m_dblManager->value(m_properties["StartX"]), m_dblManager->value(m_properties["EndX"]));
     uiv.checkValidRange("Fitting Range", range);
 
     // Enforce the rule that at least one fit is needed; either a delta function, one or two lorentzian functions,
     // or both.  (The resolution function must be convolved with a model.)
-    if ( uiForm().confit_cbFitType->currentIndex() == 0 && ! m_cfBlnMng->value(m_cfProp["UseDeltaFunc"]) )
+    if ( uiForm().confit_cbFitType->currentIndex() == 0 && ! m_blnManager->value(m_properties["UseDeltaFunc"]) )
       uiv.addErrorMessage("No fit function has been selected.");
 
-    return uiv.generateErrorMessage();
+    QString error = uiv.generateErrorMessage();
+    showMessageBox(error);
+
+    return error.isEmpty();
   }
 
   void ConvFit::loadSettings(const QSettings & settings)
@@ -333,13 +321,13 @@ namespace IDA
 
     const int bgType = uiForm().confit_cbBackground->currentIndex(); // 0 = Fixed Flat, 1 = Fit Flat, 2 = Fit all
   
-    if ( bgType == 0 || ! m_cfProp["BGA0"]->subProperties().isEmpty() )
+    if ( bgType == 0 || ! m_properties["BGA0"]->subProperties().isEmpty() )
     {
-      comp->tie("f0.A0", m_cfProp["BGA0"]->valueText().toStdString() );
+      comp->tie("f0.A0", m_properties["BGA0"]->valueText().toStdString() );
     }
     else
     {
-      func->setParameter("A0", m_cfProp["BGA0"]->valueText().toDouble());
+      func->setParameter("A0", m_properties["BGA0"]->valueText().toDouble());
     }
 
     if ( bgType != 2 )
@@ -348,11 +336,11 @@ namespace IDA
     }
     else
     {
-      if ( ! m_cfProp["BGA1"]->subProperties().isEmpty() )
+      if ( ! m_properties["BGA1"]->subProperties().isEmpty() )
       {
-        comp->tie("f0.A1", m_cfProp["BGA1"]->valueText().toStdString() );
+        comp->tie("f0.A1", m_properties["BGA1"]->valueText().toStdString() );
       }
-      else { func->setParameter("A1", m_cfProp["BGA1"]->valueText().toDouble()); }
+      else { func->setParameter("A1", m_properties["BGA1"]->valueText().toDouble()); }
     }
 
     // --------------------------------------------
@@ -380,7 +368,7 @@ namespace IDA
     // --------------------------------------------------------
     Mantid::API::CompositeFunction_sptr model( new Mantid::API::CompositeFunction );
 
-    bool useDeltaFunc = m_cfBlnMng->value(m_cfProp["UseDeltaFunc"]);
+    bool useDeltaFunc = m_blnManager->value(m_properties["UseDeltaFunc"]);
 
     size_t subIndex = 0;
 
@@ -389,7 +377,7 @@ namespace IDA
       func = Mantid::API::FunctionFactory::Instance().createFunction("DeltaFunction");
 			index = model->addFunction(func);
 			std::string parName = createParName(index);
-			populateFunction(func, model, m_cfProp["DeltaFunction"], parName, false);
+			populateFunction(func, model, m_properties["DeltaFunction"], parName, false);
     }
 
     // ------------------------------------------------------------
@@ -426,7 +414,7 @@ namespace IDA
       index = model->addFunction(product);
       prefix1 = createParName(index, subIndex);
 
-      populateFunction(func, model, m_cfProp["Lorentzian1"], prefix1, false);
+      populateFunction(func, model, m_properties["Lorentzian1"], prefix1, false);
     }
 
     // Add 2nd Lorentzian
@@ -446,7 +434,7 @@ namespace IDA
       index = model->addFunction(product);
       prefix2 = createParName(index, subIndex);
       
-      populateFunction(func, model, m_cfProp["Lorentzian2"], prefix2, false);
+      populateFunction(func, model, m_properties["Lorentzian2"], prefix2, false);
     }
 
     conv->addFunction(model);
@@ -523,18 +511,18 @@ namespace IDA
 
   QtProperty* ConvFit::createLorentzian(const QString & name)
   {
-    QtProperty* lorentzGroup = m_cfGrpMng->addProperty(name);
-    m_cfProp[name+".Amplitude"] = m_cfDblMng->addProperty("Amplitude");
-    // m_cfDblMng->setRange(m_cfProp[name+".Amplitude"], 0.0, 1.0); // 0 < Amplitude < 1
-    m_cfProp[name+".PeakCentre"] = m_cfDblMng->addProperty("PeakCentre");
-    m_cfProp[name+".FWHM"] = m_cfDblMng->addProperty("FWHM");
-    m_cfDblMng->setDecimals(m_cfProp[name+".Amplitude"], NUM_DECIMALS);
-    m_cfDblMng->setDecimals(m_cfProp[name+".PeakCentre"], NUM_DECIMALS);
-    m_cfDblMng->setDecimals(m_cfProp[name+".FWHM"], NUM_DECIMALS);
-    m_cfDblMng->setValue(m_cfProp[name+".FWHM"], 0.02);
-    lorentzGroup->addSubProperty(m_cfProp[name+".Amplitude"]);
-    lorentzGroup->addSubProperty(m_cfProp[name+".PeakCentre"]);
-    lorentzGroup->addSubProperty(m_cfProp[name+".FWHM"]);
+    QtProperty* lorentzGroup = m_grpManager->addProperty(name);
+    m_properties[name+".Amplitude"] = m_dblManager->addProperty("Amplitude");
+    // m_dblManager->setRange(m_properties[name+".Amplitude"], 0.0, 1.0); // 0 < Amplitude < 1
+    m_properties[name+".PeakCentre"] = m_dblManager->addProperty("PeakCentre");
+    m_properties[name+".FWHM"] = m_dblManager->addProperty("FWHM");
+    m_dblManager->setDecimals(m_properties[name+".Amplitude"], NUM_DECIMALS);
+    m_dblManager->setDecimals(m_properties[name+".PeakCentre"], NUM_DECIMALS);
+    m_dblManager->setDecimals(m_properties[name+".FWHM"], NUM_DECIMALS);
+    m_dblManager->setValue(m_properties[name+".FWHM"], 0.02);
+    lorentzGroup->addSubProperty(m_properties[name+".Amplitude"]);
+    lorentzGroup->addSubProperty(m_properties[name+".PeakCentre"]);
+    lorentzGroup->addSubProperty(m_properties[name+".FWHM"]);
     return lorentzGroup;
   }
 
@@ -576,7 +564,7 @@ namespace IDA
   {
     QString fitType("");
 
-    if( m_cfBlnMng->value(m_cfProp["UseDeltaFunc"]) )
+    if( m_blnManager->value(m_properties["UseDeltaFunc"]) )
       fitType += "Delta";
 
     switch ( uiForm().confit_cbFitType->currentIndex() )
@@ -618,22 +606,22 @@ namespace IDA
 
   void ConvFit::typeSelection(int index)
   {
-    m_cfTree->removeProperty(m_cfProp["Lorentzian1"]);
-    m_cfTree->removeProperty(m_cfProp["Lorentzian2"]);
+    m_cfTree->removeProperty(m_properties["Lorentzian1"]);
+    m_cfTree->removeProperty(m_properties["Lorentzian2"]);
   
     switch ( index )
     {
     case 0:
-      m_cfHwhmRange->setVisible(false);
+      m_rangeSelectors["ConvFitHWHM"]->setVisible(false);
       break;
     case 1:
-      m_cfTree->addProperty(m_cfProp["Lorentzian1"]);
-      m_cfHwhmRange->setVisible(true);
+      m_cfTree->addProperty(m_properties["Lorentzian1"]);
+      m_rangeSelectors["ConvFitHWHM"]->setVisible(true);
       break;
     case 2:
-      m_cfTree->addProperty(m_cfProp["Lorentzian1"]);
-      m_cfTree->addProperty(m_cfProp["Lorentzian2"]);
-      m_cfHwhmRange->setVisible(true);
+      m_cfTree->addProperty(m_properties["Lorentzian1"]);
+      m_cfTree->addProperty(m_properties["Lorentzian2"]);
+      m_rangeSelectors["ConvFitHWHM"]->setVisible(true);
       break;
     }    
   }
@@ -642,11 +630,11 @@ namespace IDA
   {
     if ( index == 2 )
     {
-      m_cfProp["LinearBackground"]->addSubProperty(m_cfProp["BGA1"]);
+      m_properties["LinearBackground"]->addSubProperty(m_properties["BGA1"]);
     }
     else
     {
-      m_cfProp["LinearBackground"]->removeSubProperty(m_cfProp["BGA1"]);
+      m_properties["LinearBackground"]->removeSubProperty(m_properties["BGA1"]);
     }
   }
 
@@ -666,7 +654,7 @@ namespace IDA
       
       if(!m_cfInputWS)
       {
-        showInformationBox("Could not find the workspace in ADS. See log for details.");
+        showMessageBox("Could not find the workspace in ADS. See log for details.");
       }
     }
 
@@ -675,7 +663,7 @@ namespace IDA
     int specMin = 0;
     int specMax = static_cast<int>(m_cfInputWS->getNumberHistograms()) - 1;
 
-    m_intVal->setRange(specMin, specMax);
+    m_valInt->setRange(specMin, specMax);
     uiForm().confit_leSpectraMin->setText(QString::number(specMin));
     uiForm().confit_leSpectraMax->setText(QString::number(specMax));
 
@@ -691,30 +679,30 @@ namespace IDA
       uiForm().confit_leSpectraMax->setText(QString::number(specMax));
     }
 
-    m_cfDataCurve = plotMiniplot(m_cfPlot, m_cfDataCurve, m_cfInputWS, specNo);
+    plotMiniPlot(m_cfInputWS, specNo, "ConvFitPlot", "CFDataCurve");
     try
     {
-      const std::pair<double, double> range = getCurveRange(m_cfDataCurve);
-      m_cfRangeS->setRange(range.first, range.second);
+      const std::pair<double, double> range = getCurveRange("CFDataCurve");
+      m_rangeSelectors["ConvFitRange"]->setRange(range.first, range.second);
       uiForm().confit_ckPlotGuess->setChecked(plotGuess);
     }
     catch(std::invalid_argument & exc)
     {
-      showInformationBox(exc.what());
+      showMessageBox(exc.what());
     }
 
     // Default FWHM to resolution of instrument
     double resolution = getInstrumentResolution(m_cfInputWSName.toStdString());
     if(resolution > 0)
     {
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 1.FWHM"], resolution);
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 2.FWHM"], resolution);
+      m_dblManager->setValue(m_properties["Lorentzian 1.FWHM"], resolution);
+      m_dblManager->setValue(m_properties["Lorentzian 2.FWHM"], resolution);
     }
   }
 
   void ConvFit::plotGuess(QtProperty*)
   {
-    if ( ! uiForm().confit_ckPlotGuess->isChecked() || m_cfDataCurve == NULL )
+    if ( ! uiForm().confit_ckPlotGuess->isChecked() || m_curves["CFDataCurve"] == NULL )
     {
       return;
     }
@@ -727,8 +715,8 @@ namespace IDA
       plotInput();
     }
 
-    const size_t binIndexLow = m_cfInputWS->binIndexOf(m_cfDblMng->value(m_cfProp["StartX"]));
-    const size_t binIndexHigh = m_cfInputWS->binIndexOf(m_cfDblMng->value(m_cfProp["EndX"]));
+    const size_t binIndexLow = m_cfInputWS->binIndexOf(m_dblManager->value(m_properties["StartX"]));
+    const size_t binIndexHigh = m_cfInputWS->binIndexOf(m_dblManager->value(m_properties["EndX"]));
     const size_t nData = binIndexHigh - binIndexLow;
 
     std::vector<double> inputXData(nData);
@@ -759,35 +747,22 @@ namespace IDA
       dataY.append(outputData.getCalculated(i));
     }
 
-    if ( m_cfCalcCurve != NULL )
-    {
-      m_cfCalcCurve->attach(0);
-      delete m_cfCalcCurve;
-      m_cfCalcCurve = 0;
-    }
-
-    m_cfCalcCurve = new QwtPlotCurve();
-    m_cfCalcCurve->setData(dataX, dataY);
+    removeCurve("CFCalcCurve");
+    m_curves["CFCalcCurve"] = new QwtPlotCurve();
+    m_curves["CFCalcCurve"]->setData(dataX, dataY);
     QPen fitPen(Qt::red, Qt::SolidLine);
-    m_cfCalcCurve->setPen(fitPen);
-    m_cfCalcCurve->attach(m_cfPlot);
-    m_cfPlot->replot();
+    m_curves["CFCalcCurve"]->setPen(fitPen);
+    m_curves["CFCalcCurve"]->attach(m_plots["ConvFitPlot"]);
+    m_plots["ConvFitPlot"]->replot();
   }
 
   void ConvFit::singleFit()
   {
-    const QString error = validate();
-    if( ! error.isEmpty() )
-    {
-      showInformationBox(error);
-      return;
-    }
-
     plotInput();
 
-    if ( m_cfDataCurve == NULL )
+    if ( m_curves["CFDataCurve"] == NULL )
     {
-      showInformationBox("There was an error reading the data file.");
+      showMessageBox("There was an error reading the data file.");
       return;
     }
 
@@ -813,8 +788,8 @@ namespace IDA
     alg->setPropertyValue("Function", function->asString());
     alg->setPropertyValue("InputWorkspace", m_cfInputWSName.toStdString());
     alg->setProperty<int>("WorkspaceIndex", uiForm().confit_lePlotSpectrum->text().toInt());
-    alg->setProperty<double>("StartX", m_cfDblMng->value(m_cfProp["StartX"]));
-    alg->setProperty<double>("EndX", m_cfDblMng->value(m_cfProp["EndX"]));
+    alg->setProperty<double>("StartX", m_dblManager->value(m_properties["StartX"]));
+    alg->setProperty<double>("EndX", m_dblManager->value(m_properties["EndX"]));
     alg->setProperty("Output", output);
     alg->setProperty("CreateOutput", true);
     alg->setProperty("OutputCompositeMembers", true);
@@ -823,15 +798,15 @@ namespace IDA
    
     if ( ! alg->isExecuted() )
     {
-      showInformationBox("Fit algorithm failed.");
+      showMessageBox("Fit algorithm failed.");
       return;
     }
 
     // Plot the line on the mini plot
-    m_cfCalcCurve = plotMiniplot(m_cfPlot, m_cfCalcCurve, outputNm+"_Workspace", 1);
+    plotMiniPlot(outputNm+"_Workspace", 1, "ConvFitPlot", "CFCalcCurve");
     QPen fitPen(Qt::red, Qt::SolidLine);
-    m_cfCalcCurve->setPen(fitPen);
-    m_cfPlot->replot();
+    m_curves["CFCalcCurve"]->setPen(fitPen);
+    replot("ConvFitPlot");
 
     Mantid::API::IFunction_sptr outputFunc = alg->getProperty("Function");
 
@@ -848,8 +823,8 @@ namespace IDA
 
     // Populate Tree widget with values
     // Background should always be f0
-    m_cfDblMng->setValue(m_cfProp["BGA0"], parameters["f0.A0"]);
-    m_cfDblMng->setValue(m_cfProp["BGA1"], parameters["f0.A1"]);
+    m_dblManager->setValue(m_properties["BGA0"], parameters["f0.A0"]);
+    m_dblManager->setValue(m_properties["BGA1"], parameters["f0.A1"]);
 
     int noLorentz = uiForm().confit_cbFitType->currentIndex();
 
@@ -863,7 +838,7 @@ namespace IDA
 				subIndex++;
 		}
 
-		bool usingDeltaFunc = m_cfBlnMng->value(m_cfProp["UseDeltaFunc"]);
+		bool usingDeltaFunc = m_blnManager->value(m_properties["UseDeltaFunc"]);
 		bool usingCompositeFunc = ((usingDeltaFunc && noLorentz > 0) || noLorentz > 1);
     QString prefBase = "f1.f1.";
 
@@ -877,7 +852,7 @@ namespace IDA
 			
 			key += "Height";
 
-      m_cfDblMng->setValue(m_cfProp["DeltaHeight"], parameters[key]);
+      m_dblManager->setValue(m_properties["DeltaHeight"], parameters[key]);
       funcIndex++;
     }
 
@@ -895,9 +870,9 @@ namespace IDA
 				pref += "f" + QString::number(subIndex) + ".";
 			}
 
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 1.Amplitude"], parameters[pref+"Amplitude"]);
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 1.PeakCentre"], parameters[pref+"PeakCentre"]);
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 1.FWHM"], parameters[pref+"FWHM"]);
+      m_dblManager->setValue(m_properties["Lorentzian 1.Amplitude"], parameters[pref+"Amplitude"]);
+      m_dblManager->setValue(m_properties["Lorentzian 1.PeakCentre"], parameters[pref+"PeakCentre"]);
+      m_dblManager->setValue(m_properties["Lorentzian 1.FWHM"], parameters[pref+"FWHM"]);
       funcIndex++;
     }
 
@@ -915,71 +890,71 @@ namespace IDA
 				pref += "f" + QString::number(subIndex) + ".";
 			}
 
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 2.Amplitude"], parameters[pref+"Amplitude"]);
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 2.PeakCentre"], parameters[pref+"PeakCentre"]);
-      m_cfDblMng->setValue(m_cfProp["Lorentzian 2.FWHM"], parameters[pref+"FWHM"]);
+      m_dblManager->setValue(m_properties["Lorentzian 2.Amplitude"], parameters[pref+"Amplitude"]);
+      m_dblManager->setValue(m_properties["Lorentzian 2.PeakCentre"], parameters[pref+"PeakCentre"]);
+      m_dblManager->setValue(m_properties["Lorentzian 2.FWHM"], parameters[pref+"FWHM"]);
     }
   }
 
   void ConvFit::minChanged(double val)
   {
-    m_cfDblMng->setValue(m_cfProp["StartX"], val);
+    m_dblManager->setValue(m_properties["StartX"], val);
   }
 
   void ConvFit::maxChanged(double val)
   {
-    m_cfDblMng->setValue(m_cfProp["EndX"], val);
+    m_dblManager->setValue(m_properties["EndX"], val);
   }
 
   void ConvFit::hwhmChanged(double val)
   {
-    const double peakCentre = m_cfDblMng->value(m_cfProp["Lorentzian 1.PeakCentre"]);
+    const double peakCentre = m_dblManager->value(m_properties["Lorentzian 1.PeakCentre"]);
     // Always want FWHM to display as positive.
     const double hwhm = std::fabs(val-peakCentre);
     // Update the property
-    m_cfHwhmRange->blockSignals(true);
-    m_cfDblMng->setValue(m_cfProp["Lorentzian 1.FWHM"], hwhm*2);
-    m_cfHwhmRange->blockSignals(false);
+    m_rangeSelectors["ConvFitHWHM"]->blockSignals(true);
+    m_dblManager->setValue(m_properties["Lorentzian 1.FWHM"], hwhm*2);
+    m_rangeSelectors["ConvFitHWHM"]->blockSignals(false);
   }
 
   void ConvFit::backgLevel(double val)
   {
-    m_cfDblMng->setValue(m_cfProp["BGA0"], val);
+    m_dblManager->setValue(m_properties["BGA0"], val);
   }
 
   void ConvFit::updateRS(QtProperty* prop, double val)
   {
-    if ( prop == m_cfProp["StartX"] ) { m_cfRangeS->setMinimum(val); }
-    else if ( prop == m_cfProp["EndX"] ) { m_cfRangeS->setMaximum(val); }
-    else if ( prop == m_cfProp["BGA0"] ) { m_cfBackgS->setMinimum(val); }
-    else if ( prop == m_cfProp["Lorentzian 1.FWHM"] ) { hwhmUpdateRS(val); }
-    else if ( prop == m_cfProp["Lorentzian 1.PeakCentre"] )
+    if ( prop == m_properties["StartX"] ) { m_rangeSelectors["ConvFitRange"]->setMinimum(val); }
+    else if ( prop == m_properties["EndX"] ) { m_rangeSelectors["ConvFitRange"]->setMaximum(val); }
+    else if ( prop == m_properties["BGA0"] ) { m_rangeSelectors["ConvFitBackRange"]->setMinimum(val); }
+    else if ( prop == m_properties["Lorentzian 1.FWHM"] ) { hwhmUpdateRS(val); }
+    else if ( prop == m_properties["Lorentzian 1.PeakCentre"] )
     {
-        hwhmUpdateRS(m_cfDblMng->value(m_cfProp["Lorentzian 1.FWHM"]));
+        hwhmUpdateRS(m_dblManager->value(m_properties["Lorentzian 1.FWHM"]));
     }
   }
 
   void ConvFit::hwhmUpdateRS(double val)
   {
-    const double peakCentre = m_cfDblMng->value(m_cfProp["Lorentzian 1.PeakCentre"]);
-    m_cfHwhmRange->setMinimum(peakCentre-val/2);
-    m_cfHwhmRange->setMaximum(peakCentre+val/2);
+    const double peakCentre = m_dblManager->value(m_properties["Lorentzian 1.PeakCentre"]);
+    m_rangeSelectors["ConvFitHWHM"]->setMinimum(peakCentre-val/2);
+    m_rangeSelectors["ConvFitHWHM"]->setMaximum(peakCentre+val/2);
   }
 
   void ConvFit::checkBoxUpdate(QtProperty* prop, bool checked)
   {
     // Add/remove some properties to display only relevant options
-    if ( prop == m_cfProp["UseDeltaFunc"] )
+    if ( prop == m_properties["UseDeltaFunc"] )
     {
       if ( checked ) 
       { 
-        m_cfProp["DeltaFunction"]->addSubProperty(m_cfProp["DeltaHeight"]);
+        m_properties["DeltaFunction"]->addSubProperty(m_properties["DeltaHeight"]);
         uiForm().confit_cbPlotOutput->addItem("Height");
         uiForm().confit_cbPlotOutput->addItem("EISF");
       }
       else 
       { 
-        m_cfProp["DeltaFunction"]->removeSubProperty(m_cfProp["DeltaHeight"]);
+        m_properties["DeltaFunction"]->removeSubProperty(m_properties["DeltaHeight"]);
         uiForm().confit_cbPlotOutput->removeItem(uiForm().confit_cbPlotOutput->count()-1);
         uiForm().confit_cbPlotOutput->removeItem(uiForm().confit_cbPlotOutput->count()-1);
       }
@@ -998,11 +973,11 @@ namespace IDA
     // is it a fit property ?
     QtProperty* prop = item->property();
 
-    if ( prop == m_cfProp["StartX"] || prop == m_cfProp["EndX"] )
+    if ( prop == m_properties["StartX"] || prop == m_properties["EndX"] )
       return;
 
     // is it already fixed?
-    bool fixed = prop->propertyManager() != m_cfDblMng;
+    bool fixed = prop->propertyManager() != m_dblManager;
 
     if ( fixed && prop->propertyManager() != m_stringManager ) 
       return;
@@ -1013,12 +988,12 @@ namespace IDA
 
     if ( ! fixed )
     {
-      action = new QAction("Fix", this);
+      action = new QAction("Fix", m_parentWidget);
       connect(action, SIGNAL(triggered()), this, SLOT(fixItem()));
     }
     else
     {
-      action = new QAction("Remove Fix", this);
+      action = new QAction("Remove Fix", m_parentWidget);
       connect(action, SIGNAL(triggered()), this, SLOT(unFixItem()));
     }
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/Elwin.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/Elwin.cpp
index a1aa517705431517d794743164849bba312846dc..8d7ce675d019387f1e4a1439841a13e62fe530c2 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/Elwin.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/Elwin.cpp
@@ -13,83 +13,78 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  Elwin::Elwin(QWidget * parent) : IDATab(parent), m_elwPlot(NULL), m_elwR1(NULL), 
-    m_elwR2(NULL), m_elwDataCurve(NULL), m_elwTree(NULL), m_elwProp(), 
-    m_elwDblMng(NULL), m_elwBlnMng(NULL), m_elwGrpMng(NULL)
-  {}
-  
+  Elwin::Elwin(QWidget * parent) : IDATab(parent),
+    m_elwTree(NULL)
+  {
+  }
+
   void Elwin::setup()
   {
     // Create QtTreePropertyBrowser object
     m_elwTree = new QtTreePropertyBrowser();
     uiForm().elwin_properties->addWidget(m_elwTree);
 
-    // Create Manager Objects
-    m_elwDblMng = new QtDoublePropertyManager();
-    m_elwBlnMng = new QtBoolPropertyManager();
-    m_elwGrpMng = new QtGroupPropertyManager();
-
     // Editor Factories
-    m_elwTree->setFactoryForManager(m_elwDblMng, doubleEditorFactory());
-    m_elwTree->setFactoryForManager(m_elwBlnMng, qtCheckBoxFactory());
+    m_elwTree->setFactoryForManager(m_dblManager, doubleEditorFactory());
+    m_elwTree->setFactoryForManager(m_blnManager, qtCheckBoxFactory());
 
     // Create Properties
-    m_elwProp["R1S"] = m_elwDblMng->addProperty("Start");
-    m_elwDblMng->setDecimals(m_elwProp["R1S"], NUM_DECIMALS);
-    m_elwProp["R1E"] = m_elwDblMng->addProperty("End");
-    m_elwDblMng->setDecimals(m_elwProp["R1E"], NUM_DECIMALS);  
-    m_elwProp["R2S"] = m_elwDblMng->addProperty("Start");
-    m_elwDblMng->setDecimals(m_elwProp["R2S"], NUM_DECIMALS);
-    m_elwProp["R2E"] = m_elwDblMng->addProperty("End");
-    m_elwDblMng->setDecimals(m_elwProp["R2E"], NUM_DECIMALS);
-
-    m_elwProp["UseTwoRanges"] = m_elwBlnMng->addProperty("Use Two Ranges");
-
-    m_elwProp["Range1"] = m_elwGrpMng->addProperty("Range One");
-    m_elwProp["Range1"]->addSubProperty(m_elwProp["R1S"]);
-    m_elwProp["Range1"]->addSubProperty(m_elwProp["R1E"]);
-    m_elwProp["Range2"] = m_elwGrpMng->addProperty("Range Two");
-    m_elwProp["Range2"]->addSubProperty(m_elwProp["R2S"]);
-    m_elwProp["Range2"]->addSubProperty(m_elwProp["R2E"]);
-
-    m_elwTree->addProperty(m_elwProp["Range1"]);
-    m_elwTree->addProperty(m_elwProp["UseTwoRanges"]);
-    m_elwTree->addProperty(m_elwProp["Range2"]);
+    m_properties["R1S"] = m_dblManager->addProperty("Start");
+    m_dblManager->setDecimals(m_properties["R1S"], NUM_DECIMALS);
+    m_properties["R1E"] = m_dblManager->addProperty("End");
+    m_dblManager->setDecimals(m_properties["R1E"], NUM_DECIMALS);  
+    m_properties["R2S"] = m_dblManager->addProperty("Start");
+    m_dblManager->setDecimals(m_properties["R2S"], NUM_DECIMALS);
+    m_properties["R2E"] = m_dblManager->addProperty("End");
+    m_dblManager->setDecimals(m_properties["R2E"], NUM_DECIMALS);
+
+    m_properties["UseTwoRanges"] = m_blnManager->addProperty("Use Two Ranges");
+
+    m_properties["Range1"] = m_grpManager->addProperty("Range One");
+    m_properties["Range1"]->addSubProperty(m_properties["R1S"]);
+    m_properties["Range1"]->addSubProperty(m_properties["R1E"]);
+    m_properties["Range2"] = m_grpManager->addProperty("Range Two");
+    m_properties["Range2"]->addSubProperty(m_properties["R2S"]);
+    m_properties["Range2"]->addSubProperty(m_properties["R2E"]);
+
+    m_elwTree->addProperty(m_properties["Range1"]);
+    m_elwTree->addProperty(m_properties["UseTwoRanges"]);
+    m_elwTree->addProperty(m_properties["Range2"]);
 
     // Create Slice Plot Widget for Range Selection
-    m_elwPlot = new QwtPlot(this);
-    m_elwPlot->setAxisFont(QwtPlot::xBottom, this->font());
-    m_elwPlot->setAxisFont(QwtPlot::yLeft, this->font());
-    uiForm().elwin_plot->addWidget(m_elwPlot);
-    m_elwPlot->setCanvasBackground(Qt::white);
+    m_plots["ElwinPlot"] = new QwtPlot(m_parentWidget);
+    m_plots["ElwinPlot"]->setAxisFont(QwtPlot::xBottom, m_parentWidget->font());
+    m_plots["ElwinPlot"]->setAxisFont(QwtPlot::yLeft, m_parentWidget->font());
+    uiForm().elwin_plot->addWidget(m_plots["ElwinPlot"]);
+    m_plots["ElwinPlot"]->setCanvasBackground(Qt::white);
     // We always want one range selector... the second one can be controlled from
     // within the elwinTwoRanges(bool state) function
-    m_elwR1 = new MantidWidgets::RangeSelector(m_elwPlot);
-    connect(m_elwR1, SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
-    connect(m_elwR1, SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
+    m_rangeSelectors["ElwinRange1"] = new MantidWidgets::RangeSelector(m_plots["ElwinPlot"]);
+    connect(m_rangeSelectors["ElwinRange1"], SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
+    connect(m_rangeSelectors["ElwinRange1"], SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
     // create the second range
-    m_elwR2 = new MantidWidgets::RangeSelector(m_elwPlot);
-    m_elwR2->setColour(Qt::darkGreen); // dark green for background
-    connect(m_elwR1, SIGNAL(rangeChanged(double, double)), m_elwR2, SLOT(setRange(double, double)));
-    connect(m_elwR2, SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
-    connect(m_elwR2, SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
-    m_elwR2->setRange(m_elwR1->getRange());
+    m_rangeSelectors["ElwinRange2"] = new MantidWidgets::RangeSelector(m_plots["ElwinPlot"]);
+    m_rangeSelectors["ElwinRange2"]->setColour(Qt::darkGreen); // dark green for background
+    connect(m_rangeSelectors["ElwinRange1"], SIGNAL(rangeChanged(double, double)), m_rangeSelectors["ElwinRange2"], SLOT(setRange(double, double)));
+    connect(m_rangeSelectors["ElwinRange2"], SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
+    connect(m_rangeSelectors["ElwinRange2"], SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
+    m_rangeSelectors["ElwinRange2"]->setRange(m_rangeSelectors["ElwinRange1"]->getRange());
     // Refresh the plot window
-    m_elwPlot->replot();
+    replot("ElwinPlot");
   
-    connect(m_elwDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
-    connect(m_elwBlnMng, SIGNAL(valueChanged(QtProperty*, bool)), this, SLOT(twoRanges(QtProperty*, bool)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
+    connect(m_blnManager, SIGNAL(valueChanged(QtProperty*, bool)), this, SLOT(twoRanges(QtProperty*, bool)));
     twoRanges(0, false);
 
     connect(uiForm().elwin_pbPlotInput, SIGNAL(clicked()), this, SLOT(plotInput()));
     connect(uiForm().elwin_inputFile, SIGNAL(filesFound()), this, SLOT(plotInput()));
 
     // Set any default values
-    m_elwDblMng->setValue(m_elwProp["R1S"], -0.02);
-    m_elwDblMng->setValue(m_elwProp["R1E"], 0.02);
+    m_dblManager->setValue(m_properties["R1S"], -0.02);
+    m_dblManager->setValue(m_properties["R1E"], 0.02);
 
-    m_elwDblMng->setValue(m_elwProp["R2S"], -0.24);
-    m_elwDblMng->setValue(m_elwProp["R2E"], -0.22);
+    m_dblManager->setValue(m_properties["R2S"], -0.24);
+    m_dblManager->setValue(m_properties["R2E"], -0.22);
   }
 
   void Elwin::run()
@@ -97,11 +92,11 @@ namespace IDA
     QString pyInput =
       "from IndirectDataAnalysis import elwin\n"
       "input = [r'" + uiForm().elwin_inputFile->getFilenames().join("', r'") + "']\n"
-      "eRange = [ " + QString::number(m_elwDblMng->value(m_elwProp["R1S"])) +","+ QString::number(m_elwDblMng->value(m_elwProp["R1E"]));
+      "eRange = [ " + QString::number(m_dblManager->value(m_properties["R1S"])) +","+ QString::number(m_dblManager->value(m_properties["R1E"]));
 
-    if ( m_elwBlnMng->value(m_elwProp["UseTwoRanges"]) )
+    if ( m_blnManager->value(m_properties["UseTwoRanges"]) )
     {
-      pyInput += ", " + QString::number(m_elwDblMng->value(m_elwProp["R2S"])) + ", " + QString::number(m_elwDblMng->value(m_elwProp["R2E"]));
+      pyInput += ", " + QString::number(m_dblManager->value(m_properties["R2S"])) + ", " + QString::number(m_dblManager->value(m_properties["R2E"]));
     }
 
     pyInput+= "]\n";
@@ -124,28 +119,31 @@ namespace IDA
     pyInput +=
       "eq1_ws, eq2_ws = elwin(input, eRange, log_type=logType, Normalise=normalise, Save=save, Verbose=verbose, Plot=plot)\n";
 
-    QString pyOutput = runPythonCode(pyInput).trimmed();
-
+    QString pyOutput = runPythonCode(pyInput);
+    UNUSED_ARG(pyOutput);
   }
 
-  QString Elwin::validate()
+  bool Elwin::validate()
   {
     UserInputValidator uiv;
     
     uiv.checkMWRunFilesIsValid("Input", uiForm().elwin_inputFile);
 
-    auto rangeOne = std::make_pair(m_elwDblMng->value(m_elwProp["R1S"]), m_elwDblMng->value(m_elwProp["R1E"]));
+    auto rangeOne = std::make_pair(m_dblManager->value(m_properties["R1S"]), m_dblManager->value(m_properties["R1E"]));
     uiv.checkValidRange("Range One", rangeOne);
 
-    bool useTwoRanges = m_elwBlnMng->value(m_elwProp["UseTwoRanges"]);
+    bool useTwoRanges = m_blnManager->value(m_properties["UseTwoRanges"]);
     if( useTwoRanges )
     {
-      auto rangeTwo = std::make_pair(m_elwDblMng->value(m_elwProp["R2S"]), m_elwDblMng->value(m_elwProp["R2E"]));
+      auto rangeTwo = std::make_pair(m_dblManager->value(m_properties["R2S"]), m_dblManager->value(m_properties["R2E"]));
       uiv.checkValidRange("Range Two", rangeTwo);
       uiv.checkRangesDontOverlap(rangeOne, rangeTwo);
     }
 
-    return uiv.generateErrorMessage();
+    QString error = uiv.generateErrorMessage();
+    showMessageBox(error);
+
+    return error.isEmpty();
   }
 
   void Elwin::loadSettings(const QSettings & settings)
@@ -167,11 +165,11 @@ namespace IDA
       if(params.size() > 0)
       {
         double res = params[0];
-        m_elwDblMng->setValue(m_elwProp["R1S"], -res);
-        m_elwDblMng->setValue(m_elwProp["R1E"], res);
+        m_dblManager->setValue(m_properties["R1S"], -res);
+        m_dblManager->setValue(m_properties["R1E"], res);
 
-        m_elwDblMng->setValue(m_elwProp["R2S"], -10*res);
-        m_elwDblMng->setValue(m_elwProp["R2E"], -9*res);
+        m_dblManager->setValue(m_properties["R2S"], -10*res);
+        m_dblManager->setValue(m_properties["R2E"], -9*res);
       }
 
     }
@@ -194,13 +192,16 @@ namespace IDA
 
   void Elwin::plotInput()
   {
+    using namespace Mantid::API;
+
     if ( uiForm().elwin_inputFile->isValid() )
     {
       QString filename = uiForm().elwin_inputFile->getFirstFilename();
       QFileInfo fi(filename);
       QString wsname = fi.baseName();
 
-      auto ws = runLoadNexus(filename, wsname);
+      loadFile(filename, wsname);
+      auto ws = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(wsname.toStdString());
 
       if(!ws)
       {
@@ -210,63 +211,63 @@ namespace IDA
       setDefaultResolution(ws);
       setDefaultSampleLog(ws);
 
-      m_elwDataCurve = plotMiniplot(m_elwPlot, m_elwDataCurve, ws, 0);
+      plotMiniPlot(ws, 0, "ElwinPlot", "ElwinDataCurve");
       try
       {
-        const std::pair<double, double> range = getCurveRange(m_elwDataCurve);
-        m_elwR1->setRange(range.first, range.second);
+        const std::pair<double, double> range = getCurveRange("ElwinDataCurve");
+        m_rangeSelectors["ElwinRange1"]->setRange(range.first, range.second);
         // Replot
-        m_elwPlot->replot();
+        replot("ElwinPlot");
       }
       catch(std::invalid_argument & exc)
       {
-        showInformationBox(exc.what());
+        showMessageBox(exc.what());
       }
 
     }
     else
     {
-      showInformationBox("Selected input files are invalid.");
+      showMessageBox("Selected input files are invalid.");
     }
   }
 
   void Elwin::twoRanges(QtProperty*, bool val)
   {
-    m_elwR2->setVisible(val);
+    m_rangeSelectors["ElwinRange2"]->setVisible(val);
   }
 
   void Elwin::minChanged(double val)
   {
     MantidWidgets::RangeSelector* from = qobject_cast<MantidWidgets::RangeSelector*>(sender());
-    if ( from == m_elwR1 )
+    if ( from == m_rangeSelectors["ElwinRange1"] )
     {
-      m_elwDblMng->setValue(m_elwProp["R1S"], val);
+      m_dblManager->setValue(m_properties["R1S"], val);
     }
-    else if ( from == m_elwR2 )
+    else if ( from == m_rangeSelectors["ElwinRange2"] )
     {
-      m_elwDblMng->setValue(m_elwProp["R2S"], val);
+      m_dblManager->setValue(m_properties["R2S"], val);
     }
   }
 
   void Elwin::maxChanged(double val)
   {
     MantidWidgets::RangeSelector* from = qobject_cast<MantidWidgets::RangeSelector*>(sender());
-    if ( from == m_elwR1 )
+    if ( from == m_rangeSelectors["ElwinRange1"] )
     {
-      m_elwDblMng->setValue(m_elwProp["R1E"], val);
+      m_dblManager->setValue(m_properties["R1E"], val);
     }
-    else if ( from == m_elwR2 )
+    else if ( from == m_rangeSelectors["ElwinRange2"] )
     {
-      m_elwDblMng->setValue(m_elwProp["R2E"], val);
+      m_dblManager->setValue(m_properties["R2E"], val);
     }
   }
 
   void Elwin::updateRS(QtProperty* prop, double val)
   {
-    if ( prop == m_elwProp["R1S"] ) m_elwR1->setMinimum(val);
-    else if ( prop == m_elwProp["R1E"] ) m_elwR1->setMaximum(val);
-    else if ( prop == m_elwProp["R2S"] ) m_elwR2->setMinimum(val);
-    else if ( prop == m_elwProp["R2E"] ) m_elwR2->setMaximum(val);
+    if ( prop == m_properties["R1S"] ) m_rangeSelectors["ElwinRange1"]->setMinimum(val);
+    else if ( prop == m_properties["R1E"] ) m_rangeSelectors["ElwinRange1"]->setMaximum(val);
+    else if ( prop == m_properties["R2S"] ) m_rangeSelectors["ElwinRange2"]->setMinimum(val);
+    else if ( prop == m_properties["R2E"] ) m_rangeSelectors["ElwinRange2"]->setMaximum(val);
   }
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/Fury.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/Fury.cpp
index b18a67f68cbba3677c04a6d0a40edad9418b0450..cb2d47b1ce71e4ae66142d975e896a2ebeb1926f 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/Fury.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/Fury.cpp
@@ -25,8 +25,8 @@ namespace CustomInterfaces
 namespace IDA
 {
   Fury::Fury(QWidget * parent) : IDATab(parent),
-    m_furPlot(NULL), m_furRange(NULL), m_furCurve(NULL), m_furTree(NULL),
-    m_furProp(), m_furDblMng(NULL), m_furyResFileType()
+    m_furTree(NULL),
+    m_furyResFileType()
   {
   }
 
@@ -35,53 +35,51 @@ namespace IDA
     m_furTree = new QtTreePropertyBrowser();
     uiForm().fury_TreeSpace->addWidget(m_furTree);
 
-    m_furDblMng = new QtDoublePropertyManager();
-
-    m_furPlot = new QwtPlot(this);
-    uiForm().fury_PlotSpace->addWidget(m_furPlot);
-    m_furPlot->setCanvasBackground(Qt::white);
-    m_furPlot->setAxisFont(QwtPlot::xBottom, this->font());
-    m_furPlot->setAxisFont(QwtPlot::yLeft, this->font());
+    m_plots["FuryPlot"] = new QwtPlot(m_parentWidget);
+    uiForm().fury_PlotSpace->addWidget(m_plots["FuryPlot"]);
+    m_plots["FuryPlot"]->setCanvasBackground(Qt::white);
+    m_plots["FuryPlot"]->setAxisFont(QwtPlot::xBottom, m_parentWidget->font());
+    m_plots["FuryPlot"]->setAxisFont(QwtPlot::yLeft, m_parentWidget->font());
 
     // Create and configure properties
-    m_furProp["ELow"] = m_furDblMng->addProperty("ELow");
-    m_furDblMng->setDecimals(m_furProp["ELow"], NUM_DECIMALS);
+    m_properties["ELow"] = m_dblManager->addProperty("ELow");
+    m_dblManager->setDecimals(m_properties["ELow"], NUM_DECIMALS);
 
-    m_furProp["EWidth"] = m_furDblMng->addProperty("EWidth");
-    m_furDblMng->setDecimals(m_furProp["EWidth"], NUM_DECIMALS);
-    m_furProp["EWidth"]->setEnabled(false);
+    m_properties["EWidth"] = m_dblManager->addProperty("EWidth");
+    m_dblManager->setDecimals(m_properties["EWidth"], NUM_DECIMALS);
+    m_properties["EWidth"]->setEnabled(false);
 
-    m_furProp["EHigh"] = m_furDblMng->addProperty("EHigh");
-    m_furDblMng->setDecimals(m_furProp["EHigh"], NUM_DECIMALS);
+    m_properties["EHigh"] = m_dblManager->addProperty("EHigh");
+    m_dblManager->setDecimals(m_properties["EHigh"], NUM_DECIMALS);
 
-    m_furProp["SampleBinning"] = m_furDblMng->addProperty("SampleBinning");
-    m_furDblMng->setDecimals(m_furProp["SampleBinning"], 0);
+    m_properties["SampleBinning"] = m_dblManager->addProperty("SampleBinning");
+    m_dblManager->setDecimals(m_properties["SampleBinning"], 0);
 
-    m_furProp["SampleBins"] = m_furDblMng->addProperty("SampleBins");
-    m_furDblMng->setDecimals(m_furProp["SampleBins"], 0);
-    m_furProp["SampleBins"]->setEnabled(false);
+    m_properties["SampleBins"] = m_dblManager->addProperty("SampleBins");
+    m_dblManager->setDecimals(m_properties["SampleBins"], 0);
+    m_properties["SampleBins"]->setEnabled(false);
 
-    m_furProp["ResolutionBins"] = m_furDblMng->addProperty("ResolutionBins");
-    m_furDblMng->setDecimals(m_furProp["ResolutionBins"], 0);
-    m_furProp["ResolutionBins"]->setEnabled(false);
+    m_properties["ResolutionBins"] = m_dblManager->addProperty("ResolutionBins");
+    m_dblManager->setDecimals(m_properties["ResolutionBins"], 0);
+    m_properties["ResolutionBins"]->setEnabled(false);
 
-    m_furTree->addProperty(m_furProp["ELow"]);
-    m_furTree->addProperty(m_furProp["EWidth"]);
-    m_furTree->addProperty(m_furProp["EHigh"]);
-    m_furTree->addProperty(m_furProp["SampleBinning"]);
-    m_furTree->addProperty(m_furProp["SampleBins"]);
-    m_furTree->addProperty(m_furProp["ResolutionBins"]);
+    m_furTree->addProperty(m_properties["ELow"]);
+    m_furTree->addProperty(m_properties["EWidth"]);
+    m_furTree->addProperty(m_properties["EHigh"]);
+    m_furTree->addProperty(m_properties["SampleBinning"]);
+    m_furTree->addProperty(m_properties["SampleBins"]);
+    m_furTree->addProperty(m_properties["ResolutionBins"]);
 
-    m_furDblMng->setValue(m_furProp["SampleBinning"], 10);
+    m_dblManager->setValue(m_properties["SampleBinning"], 10);
 
-    m_furTree->setFactoryForManager(m_furDblMng, doubleEditorFactory());
+    m_furTree->setFactoryForManager(m_dblManager, doubleEditorFactory());
 
-    m_furRange = new MantidQt::MantidWidgets::RangeSelector(m_furPlot);
+    m_rangeSelectors["FuryRange"] = new MantidQt::MantidWidgets::RangeSelector(m_plots["FuryPlot"]);
 
     // signals / slots & validators
-    connect(m_furRange, SIGNAL(selectionChangedLazy(double, double)), this, SLOT(rsRangeChangedLazy(double, double)));
-    connect(m_furDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
-    connect(m_furDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
+    connect(m_rangeSelectors["FuryRange"], SIGNAL(selectionChangedLazy(double, double)), this, SLOT(rsRangeChangedLazy(double, double)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
     connect(uiForm().fury_dsInput, SIGNAL(dataReady(const QString&)), this, SLOT(plotInput(const QString&)));
     connect(uiForm().fury_dsResInput, SIGNAL(dataReady(const QString&)), this, SLOT(calculateBinning()));
   }
@@ -95,9 +93,9 @@ namespace IDA
     QString wsName = uiForm().fury_dsInput->getCurrentDataName();
     QString resName = uiForm().fury_dsResInput->getCurrentDataName();
 
-    double energyMin = m_furDblMng->value(m_furProp["ELow"]);
-    double energyMax = m_furDblMng->value(m_furProp["EHigh"]);
-    long numBins = static_cast<long>(m_furDblMng->value(m_furProp["SampleBinning"]));
+    double energyMin = m_dblManager->value(m_properties["ELow"]);
+    double energyMax = m_dblManager->value(m_properties["EHigh"]);
+    long numBins = static_cast<long>(m_dblManager->value(m_properties["SampleBinning"]));
 
     bool plot = uiForm().fury_ckPlot->isChecked();
     bool verbose = uiForm().fury_ckVerbose->isChecked();
@@ -127,7 +125,7 @@ namespace IDA
    * The underlying Fourier transform of Fury
    * also means we must enforce several rules on the parameters.
    */
-  QString Fury::validate()
+  bool Fury::validate()
   {
     UserInputValidator uiv;
 
@@ -135,8 +133,9 @@ namespace IDA
     uiv.checkDataSelectorIsValid("Resolution", uiForm().fury_dsResInput);
 
     QString message = uiv.generateErrorMessage();
+    showMessageBox(message);
 
-    return message;
+    return message.isEmpty();
   }
 
   /**
@@ -147,32 +146,32 @@ namespace IDA
    */
   void Fury::updatePropertyValues(QtProperty *prop, double val)
   {
-    disconnect(m_furDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
+    disconnect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
 
-    if(prop == m_furProp["EHigh"])
+    if(prop == m_properties["EHigh"])
     {
       // If the user enters a negative value for EHigh assume they did not mean to add a -
       if(val < 0)
       {
         val = -val;
-        m_furDblMng->setValue(m_furProp["EHigh"], val);
+        m_dblManager->setValue(m_properties["EHigh"], val);
       }
 
-      m_furDblMng->setValue(m_furProp["ELow"], -val);
+      m_dblManager->setValue(m_properties["ELow"], -val);
     }
-    else if(prop == m_furProp["ELow"])
+    else if(prop == m_properties["ELow"])
     {
       // If the user enters a positive value for ELow, assume they ment to add a
       if(val > 0)
       {
         val = -val;
-        m_furDblMng->setValue(m_furProp["ELow"], val);
+        m_dblManager->setValue(m_properties["ELow"], val);
       }
 
-      m_furDblMng->setValue(m_furProp["EHigh"], -val);
+      m_dblManager->setValue(m_properties["EHigh"], -val);
     }
 
-    connect(m_furDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
 
     calculateBinning();
   }
@@ -184,14 +183,14 @@ namespace IDA
   {
     using namespace Mantid::API;
 
-    disconnect(m_furDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
+    disconnect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
 
     QString wsName = uiForm().fury_dsInput->getCurrentDataName();
     QString resName = uiForm().fury_dsResInput->getCurrentDataName();
 
-    double energyMin = m_furDblMng->value(m_furProp["ELow"]);
-    double energyMax = m_furDblMng->value(m_furProp["EHigh"]);
-    long numBins = static_cast<long>(m_furDblMng->value(m_furProp["SampleBinning"]));
+    double energyMin = m_dblManager->value(m_properties["ELow"]);
+    double energyMax = m_dblManager->value(m_properties["EHigh"]);
+    long numBins = static_cast<long>(m_dblManager->value(m_properties["SampleBinning"]));
 
     if(wsName.isEmpty() || resName.isEmpty() || numBins == 0)
       return;
@@ -225,16 +224,16 @@ namespace IDA
     int resolutionBins = propsTable->getColumn("ResolutionBins")->cell<int>(0);
 
     // Update data in property editor
-    m_furDblMng->setValue(m_furProp["EWidth"], energyWidth);
-    m_furDblMng->setValue(m_furProp["ResolutionBins"], resolutionBins);
-    m_furDblMng->setValue(m_furProp["SampleBins"], sampleBins);
+    m_dblManager->setValue(m_properties["EWidth"], energyWidth);
+    m_dblManager->setValue(m_properties["ResolutionBins"], resolutionBins);
+    m_dblManager->setValue(m_properties["SampleBins"], sampleBins);
 
-    connect(m_furDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updatePropertyValues(QtProperty*, double)));
 
     // Warn for low number of resolution bins
-    int numResolutionBins = static_cast<int>(m_furDblMng->value(m_furProp["ResolutionBins"]));
+    int numResolutionBins = static_cast<int>(m_dblManager->value(m_properties["ResolutionBins"]));
     if(numResolutionBins < 5)
-      showInformationBox("Number of resolution bins is less than 5.\nResults may be inaccurate.");
+      showMessageBox("Number of resolution bins is less than 5.\nResults may be inaccurate.");
   }
 
   void Fury::loadSettings(const QSettings & settings)
@@ -252,14 +251,14 @@ namespace IDA
     }
     catch(Mantid::Kernel::Exception::NotFoundError&)
     {
-      showInformationBox(QString("Unable to retrieve workspace: " + wsname));
+      showMessageBox(QString("Unable to retrieve workspace: " + wsname));
       return;
     }
 
-    m_furCurve = plotMiniplot(m_furPlot, m_furCurve, workspace, 0);
+    plotMiniPlot(workspace, 0, "FuryPlot", "FuryCurve");
     try
     {
-      const std::pair<double, double> range = getCurveRange(m_furCurve);
+      const std::pair<double, double> range = getCurveRange("FuryCurve");
       double rounded_min = floor(range.first * 10 + 0.5) / 10.0;
       double rounded_max = floor(range.second * 10 + 0.5) / 10.0;
 
@@ -277,23 +276,23 @@ namespace IDA
       //check incase we have a really small range
       if (fabs(rounded_min) > 0 && fabs(rounded_max) > 0)
       {
-        m_furRange->setRange(rounded_min, rounded_max);
-        m_furDblMng->setValue(m_furProp["ELow"], rounded_min);
-        m_furDblMng->setValue(m_furProp["EHigh"], rounded_max);
+        m_rangeSelectors["FuryRange"]->setRange(rounded_min, rounded_max);
+        m_dblManager->setValue(m_properties["ELow"], rounded_min);
+        m_dblManager->setValue(m_properties["EHigh"], rounded_max);
       }
       else
       {
-        m_furRange->setRange(range.first, range.second);
-        m_furDblMng->setValue(m_furProp["ELow"], range.first);
-        m_furDblMng->setValue(m_furProp["EHigh"], range.second);
+        m_rangeSelectors["FuryRange"]->setRange(range.first, range.second);
+        m_dblManager->setValue(m_properties["ELow"], range.first);
+        m_dblManager->setValue(m_properties["EHigh"], range.second);
       }
       //set default value for width
-      m_furDblMng->setValue(m_furProp["EWidth"], 0.005);
-      m_furPlot->replot();
+      m_dblManager->setValue(m_properties["EWidth"], 0.005);
+      replot("FuryPlot");
     }
     catch(std::invalid_argument & exc)
     {
-      showInformationBox(exc.what());
+      showMessageBox(exc.what());
     }
 
     calculateBinning();
@@ -307,22 +306,22 @@ namespace IDA
    */
   void Fury::rsRangeChangedLazy(double min, double max)
   {
-    double oldMin = m_furDblMng->value(m_furProp["ELow"]);
-    double oldMax = m_furDblMng->value(m_furProp["EHigh"]);
+    double oldMin = m_dblManager->value(m_properties["ELow"]);
+    double oldMax = m_dblManager->value(m_properties["EHigh"]);
 
     if(fabs(oldMin - min) > 0.0000001)
-      m_furDblMng->setValue(m_furProp["ELow"], min);
+      m_dblManager->setValue(m_properties["ELow"], min);
 
     if(fabs(oldMax - max) > 0.0000001)
-      m_furDblMng->setValue(m_furProp["EHigh"], max);
+      m_dblManager->setValue(m_properties["EHigh"], max);
   }
 
   void Fury::updateRS(QtProperty* prop, double val)
   {
-    if(prop == m_furProp["ELow"])
-      m_furRange->setMinimum(val);
-    else if(prop == m_furProp["EHigh"])
-      m_furRange->setMaximum(val);
+    if(prop == m_properties["ELow"])
+      m_rangeSelectors["FuryRange"]->setMinimum(val);
+    else if(prop == m_properties["EHigh"])
+      m_rangeSelectors["FuryRange"]->setMaximum(val);
   }
 
 } // namespace IDA
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/FuryFit.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/FuryFit.cpp
index e9d80f7d07b1cbbeec94ef828869f708065894dd..8b2cb3662c511c26c871fd1ea31cfa335f605afb 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/FuryFit.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/FuryFit.cpp
@@ -22,79 +22,80 @@ namespace CustomInterfaces
 namespace IDA
 {
   FuryFit::FuryFit(QWidget * parent) : 
-    IDATab(parent), m_intVal(NULL), m_stringManager(NULL), m_ffTree(NULL), m_groupManager(NULL), m_ffDblMng(NULL),
-    m_ffRangeManager(NULL), m_ffProp(), m_fixedProps(), m_ffPlot(NULL), m_ffDataCurve(NULL), m_ffFitCurve(NULL),
-    m_ffRangeS(NULL), m_ffBackRangeS(NULL), m_ffInputWS(), m_ffOutputWS(), m_ffInputWSName(), m_ties()
-  {}
+    IDATab(parent),
+    m_stringManager(NULL), m_ffTree(NULL),
+    m_ffRangeManager(NULL),
+    m_fixedProps(),
+    m_ffInputWS(), m_ffOutputWS(),
+    m_ffInputWSName(),
+    m_ties()
+  {
+  }
       
   void FuryFit::setup()
   {
-    m_intVal = new QIntValidator(this);
-    
-    m_stringManager = new QtStringPropertyManager(this);
+    m_stringManager = new QtStringPropertyManager(m_parentWidget);
 
-    m_ffTree = new QtTreePropertyBrowser(this);
+    m_ffTree = new QtTreePropertyBrowser(m_parentWidget);
     uiForm().furyfit_properties->addWidget(m_ffTree);
   
     // Setup FuryFit Plot Window
-    m_ffPlot = new QwtPlot(this);
-    m_ffPlot->setAxisFont(QwtPlot::xBottom, this->font());
-    m_ffPlot->setAxisFont(QwtPlot::yLeft, this->font());
-    uiForm().furyfit_vlPlot->addWidget(m_ffPlot);
-    m_ffPlot->setCanvasBackground(QColor(255,255,255));
+    m_plots["FuryFitPlot"] = new QwtPlot(m_parentWidget);
+    m_plots["FuryFitPlot"]->setAxisFont(QwtPlot::xBottom, m_parentWidget->font());
+    m_plots["FuryFitPlot"]->setAxisFont(QwtPlot::yLeft, m_parentWidget->font());
+    uiForm().furyfit_vlPlot->addWidget(m_plots["FuryFitPlot"]);
+    m_plots["FuryFitPlot"]->setCanvasBackground(QColor(255,255,255));
   
-    m_ffRangeS = new MantidQt::MantidWidgets::RangeSelector(m_ffPlot);
-    connect(m_ffRangeS, SIGNAL(minValueChanged(double)), this, SLOT(xMinSelected(double)));
-    connect(m_ffRangeS, SIGNAL(maxValueChanged(double)), this, SLOT(xMaxSelected(double)));
+    m_rangeSelectors["FuryFitRange"] = new MantidQt::MantidWidgets::RangeSelector(m_plots["FuryFitPlot"]);
+    connect(m_rangeSelectors["FuryFitRange"], SIGNAL(minValueChanged(double)), this, SLOT(xMinSelected(double)));
+    connect(m_rangeSelectors["FuryFitRange"], SIGNAL(maxValueChanged(double)), this, SLOT(xMaxSelected(double)));
 
-    m_ffBackRangeS = new MantidQt::MantidWidgets::RangeSelector(m_ffPlot,
+    m_rangeSelectors["FuryFitBackground"] = new MantidQt::MantidWidgets::RangeSelector(m_plots["FuryFitPlot"],
       MantidQt::MantidWidgets::RangeSelector::YSINGLE);
-    m_ffBackRangeS->setRange(0.0,1.0);
-    m_ffBackRangeS->setColour(Qt::darkGreen);
-    connect(m_ffBackRangeS, SIGNAL(minValueChanged(double)), this, SLOT(backgroundSelected(double)));
+    m_rangeSelectors["FuryFitBackground"]->setRange(0.0,1.0);
+    m_rangeSelectors["FuryFitBackground"]->setColour(Qt::darkGreen);
+    connect(m_rangeSelectors["FuryFitBackground"], SIGNAL(minValueChanged(double)), this, SLOT(backgroundSelected(double)));
 
     // setupTreePropertyBrowser
-    m_groupManager = new QtGroupPropertyManager(this);
-    m_ffDblMng = new QtDoublePropertyManager(this);
-    m_ffRangeManager = new QtDoublePropertyManager(this);
+    m_ffRangeManager = new QtDoublePropertyManager(m_parentWidget);
   
-    m_ffTree->setFactoryForManager(m_ffDblMng, doubleEditorFactory());
+    m_ffTree->setFactoryForManager(m_dblManager, doubleEditorFactory());
     m_ffTree->setFactoryForManager(m_ffRangeManager, doubleEditorFactory());
 
-    m_ffProp["StartX"] = m_ffRangeManager->addProperty("StartX");
-    m_ffRangeManager->setDecimals(m_ffProp["StartX"], NUM_DECIMALS);
-    m_ffProp["EndX"] = m_ffRangeManager->addProperty("EndX");
-    m_ffRangeManager->setDecimals(m_ffProp["EndX"], NUM_DECIMALS);
+    m_properties["StartX"] = m_ffRangeManager->addProperty("StartX");
+    m_ffRangeManager->setDecimals(m_properties["StartX"], NUM_DECIMALS);
+    m_properties["EndX"] = m_ffRangeManager->addProperty("EndX");
+    m_ffRangeManager->setDecimals(m_properties["EndX"], NUM_DECIMALS);
 
     connect(m_ffRangeManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(propertyChanged(QtProperty*, double)));
-    connect(m_ffDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(propertyChanged(QtProperty*, double)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(propertyChanged(QtProperty*, double)));
 
-    m_ffProp["LinearBackground"] = m_groupManager->addProperty("LinearBackground");
-    m_ffProp["BackgroundA0"] = m_ffRangeManager->addProperty("A0");
-    m_ffRangeManager->setDecimals(m_ffProp["BackgroundA0"], NUM_DECIMALS);
-    m_ffProp["LinearBackground"]->addSubProperty(m_ffProp["BackgroundA0"]);
+    m_properties["LinearBackground"] = m_grpManager->addProperty("LinearBackground");
+    m_properties["BackgroundA0"] = m_ffRangeManager->addProperty("A0");
+    m_ffRangeManager->setDecimals(m_properties["BackgroundA0"], NUM_DECIMALS);
+    m_properties["LinearBackground"]->addSubProperty(m_properties["BackgroundA0"]);
 
-    m_ffProp["Exponential1"] = createExponential("Exponential1");
-    m_ffProp["Exponential2"] = createExponential("Exponential2");
+    m_properties["Exponential1"] = createExponential("Exponential1");
+    m_properties["Exponential2"] = createExponential("Exponential2");
   
-    m_ffProp["StretchedExp"] = createStretchedExp("StretchedExp");
+    m_properties["StretchedExp"] = createStretchedExp("StretchedExp");
 
-    m_ffRangeManager->setMinimum(m_ffProp["BackgroundA0"], 0);
-    m_ffRangeManager->setMaximum(m_ffProp["BackgroundA0"], 1);
+    m_ffRangeManager->setMinimum(m_properties["BackgroundA0"], 0);
+    m_ffRangeManager->setMaximum(m_properties["BackgroundA0"], 1);
 
-    m_ffDblMng->setMinimum(m_ffProp["Exponential1.Intensity"], 0);
-    m_ffDblMng->setMaximum(m_ffProp["Exponential1.Intensity"], 1);
+    m_dblManager->setMinimum(m_properties["Exponential1.Intensity"], 0);
+    m_dblManager->setMaximum(m_properties["Exponential1.Intensity"], 1);
 
-    m_ffDblMng->setMinimum(m_ffProp["Exponential2.Intensity"], 0);
-    m_ffDblMng->setMaximum(m_ffProp["Exponential2.Intensity"], 1);
+    m_dblManager->setMinimum(m_properties["Exponential2.Intensity"], 0);
+    m_dblManager->setMaximum(m_properties["Exponential2.Intensity"], 1);
 
-    m_ffDblMng->setMinimum(m_ffProp["StretchedExp.Intensity"], 0);
-    m_ffDblMng->setMaximum(m_ffProp["StretchedExp.Intensity"], 1);
+    m_dblManager->setMinimum(m_properties["StretchedExp.Intensity"], 0);
+    m_dblManager->setMaximum(m_properties["StretchedExp.Intensity"], 1);
 
     typeSelection(uiForm().furyfit_cbFitType->currentIndex());
 
     // Connect to PlotGuess checkbox
-    connect(m_ffDblMng, SIGNAL(propertyChanged(QtProperty*)), this, SLOT(plotGuess(QtProperty*)));
+    connect(m_dblManager, SIGNAL(propertyChanged(QtProperty*)), this, SLOT(plotGuess(QtProperty*)));
 
     // Signal/slot ui connections
     connect(uiForm().furyfit_inputFile, SIGNAL(fileEditingFinished()), this, SLOT(plotInput()));
@@ -110,9 +111,9 @@ namespace IDA
     connect(uiForm().furyfit_cbInputType, SIGNAL(currentIndexChanged(int)), this, SLOT(plotInput()));
 
     // apply validators - furyfit
-    uiForm().furyfit_lePlotSpectrum->setValidator(m_intVal);
-    uiForm().furyfit_leSpectraMin->setValidator(m_intVal);
-    uiForm().furyfit_leSpectraMax->setValidator(m_intVal);
+    uiForm().furyfit_lePlotSpectrum->setValidator(m_valInt);
+    uiForm().furyfit_leSpectraMin->setValidator(m_valInt);
+    uiForm().furyfit_leSpectraMax->setValidator(m_valInt);
 
     // Set a custom handler for the QTreePropertyBrowser's ContextMenu event
     m_ffTree->setContextMenuPolicy(Qt::CustomContextMenu);
@@ -121,13 +122,6 @@ namespace IDA
 
   void FuryFit::run()
   {
-    const QString error = validate();
-    if( ! error.isEmpty() )
-    {
-      showInformationBox(error);
-      return;
-    }
-    
     if ( m_ffInputWS == NULL )
     {
       return;
@@ -150,8 +144,8 @@ namespace IDA
       "input = '" + m_ffInputWSName + "'\n"
       "func = r'" + QString::fromStdString(function) + "'\n"
       "ftype = '"   + fitTypeString() + "'\n"
-      "startx = " + m_ffProp["StartX"]->valueText() + "\n"
-      "endx = " + m_ffProp["EndX"]->valueText() + "\n"
+      "startx = " + m_properties["StartX"]->valueText() + "\n"
+      "endx = " + m_properties["EndX"]->valueText() + "\n"
       "plot = '" + uiForm().furyfit_cbPlotOutput->currentText() + "'\n"
       "spec_min = " + uiForm().furyfit_leSpectraMin->text() + "\n"
       "spec_max = None\n";
@@ -180,9 +174,10 @@ namespace IDA
     QString pyOutput = runPythonCode(pyInput);
   }
 
-  QString FuryFit::validate()
+  bool FuryFit::validate()
   {
-    using Mantid::API::AnalysisDataService;
+    using namespace Mantid::API;
+
     UserInputValidator uiv;
 
     switch( uiForm().furyfit_cbInputType->currentIndex() )
@@ -198,8 +193,9 @@ namespace IDA
         QFileInfo fi(filename);
         QString wsname = fi.baseName();
 
-        m_ffInputWS = runLoadNexus(filename, wsname);
+        loadFile(filename, wsname);
         m_ffInputWSName = wsname;
+        m_ffInputWS = AnalysisDataService::Instance().retrieveWS<MatrixWorkspace>(wsname.toStdString());
       }
 
       break;
@@ -207,10 +203,13 @@ namespace IDA
       uiv.checkWorkspaceSelectorIsNotEmpty("Input", uiForm().furyfit_wsIqt); break;
     }
 
-    auto range = std::make_pair(m_ffRangeManager->value(m_ffProp["StartX"]), m_ffRangeManager->value(m_ffProp["EndX"]));
+    auto range = std::make_pair(m_ffRangeManager->value(m_properties["StartX"]), m_ffRangeManager->value(m_properties["EndX"]));
     uiv.checkValidRange("Ranges", range);
 
-    return uiv.generateErrorMessage();
+    QString error = uiv.generateErrorMessage();
+    showMessageBox(error);
+
+    return error.isEmpty();
   }
 
   void FuryFit::loadSettings(const QSettings & settings)
@@ -225,10 +224,10 @@ namespace IDA
     const int fitType = uiForm().furyfit_cbFitType->currentIndex();
 
     Mantid::API::IFunction_sptr func = Mantid::API::FunctionFactory::Instance().createFunction("LinearBackground");
-    func->setParameter("A0", m_ffRangeManager->value(m_ffProp["BackgroundA0"]));
+    func->setParameter("A0", m_ffRangeManager->value(m_properties["BackgroundA0"]));
     result->addFunction(func);
     result->tie("f0.A1", "0");
-    if ( tie ) { result->tie("f0.A0", m_ffProp["BackgroundA0"]->valueText().toStdString()); }
+    if ( tie ) { result->tie("f0.A0", m_properties["BackgroundA0"]->valueText().toStdString()); }
   
     if ( fitType == 2 ) { fname = "StretchedExp"; }
     else { fname = "Exponential1"; }
@@ -258,11 +257,11 @@ namespace IDA
     Mantid::API::IFunction::Attribute att(formula);  
     result->setAttribute("Formula", att);
 
-    QList<QtProperty*> props = m_ffProp[name]->subProperties();
+    QList<QtProperty*> props = m_properties[name]->subProperties();
     for ( int i = 0; i < props.size(); i++ )
     {
       std::string name = props[i]->propertyName().toStdString();
-      result->setParameter(name, m_ffDblMng->value(props[i]));
+      result->setParameter(name, m_dblManager->value(props[i]));
       
       //add tie if parameter is fixed
       if ( tie || ! props[i]->subProperties().isEmpty() )
@@ -278,29 +277,29 @@ namespace IDA
 
   QtProperty* FuryFit::createExponential(const QString & name)
   {
-    QtProperty* expGroup = m_groupManager->addProperty(name);
-    m_ffProp[name+".Intensity"] = m_ffDblMng->addProperty("Intensity");
-    m_ffDblMng->setDecimals(m_ffProp[name+".Intensity"], NUM_DECIMALS);
-    m_ffProp[name+".Tau"] = m_ffDblMng->addProperty("Tau");
-    m_ffDblMng->setDecimals(m_ffProp[name+".Tau"], NUM_DECIMALS);
-    expGroup->addSubProperty(m_ffProp[name+".Intensity"]);
-    expGroup->addSubProperty(m_ffProp[name+".Tau"]);
+    QtProperty* expGroup = m_grpManager->addProperty(name);
+    m_properties[name+".Intensity"] = m_dblManager->addProperty("Intensity");
+    m_dblManager->setDecimals(m_properties[name+".Intensity"], NUM_DECIMALS);
+    m_properties[name+".Tau"] = m_dblManager->addProperty("Tau");
+    m_dblManager->setDecimals(m_properties[name+".Tau"], NUM_DECIMALS);
+    expGroup->addSubProperty(m_properties[name+".Intensity"]);
+    expGroup->addSubProperty(m_properties[name+".Tau"]);
     return expGroup;
   }
 
   QtProperty* FuryFit::createStretchedExp(const QString & name)
   {
-    QtProperty* prop = m_groupManager->addProperty(name);
-    m_ffProp[name+".Intensity"] = m_ffDblMng->addProperty("Intensity");
-    m_ffProp[name+".Tau"] = m_ffDblMng->addProperty("Tau");
-    m_ffProp[name+".Beta"] = m_ffDblMng->addProperty("Beta");
-    m_ffDblMng->setRange(m_ffProp[name+".Beta"], 0, 1);
-    m_ffDblMng->setDecimals(m_ffProp[name+".Intensity"], NUM_DECIMALS);
-    m_ffDblMng->setDecimals(m_ffProp[name+".Tau"], NUM_DECIMALS);
-    m_ffDblMng->setDecimals(m_ffProp[name+".Beta"], NUM_DECIMALS);
-    prop->addSubProperty(m_ffProp[name+".Intensity"]);
-    prop->addSubProperty(m_ffProp[name+".Tau"]);
-    prop->addSubProperty(m_ffProp[name+".Beta"]);
+    QtProperty* prop = m_grpManager->addProperty(name);
+    m_properties[name+".Intensity"] = m_dblManager->addProperty("Intensity");
+    m_properties[name+".Tau"] = m_dblManager->addProperty("Tau");
+    m_properties[name+".Beta"] = m_dblManager->addProperty("Beta");
+    m_dblManager->setRange(m_properties[name+".Beta"], 0, 1);
+    m_dblManager->setDecimals(m_properties[name+".Intensity"], NUM_DECIMALS);
+    m_dblManager->setDecimals(m_properties[name+".Tau"], NUM_DECIMALS);
+    m_dblManager->setDecimals(m_properties[name+".Beta"], NUM_DECIMALS);
+    prop->addSubProperty(m_properties[name+".Intensity"]);
+    prop->addSubProperty(m_properties[name+".Tau"]);
+    prop->addSubProperty(m_properties[name+".Beta"]);
     return prop;
   }
 
@@ -325,9 +324,9 @@ namespace IDA
   {
     m_ffTree->clear();
 
-    m_ffTree->addProperty(m_ffProp["StartX"]);
-    m_ffTree->addProperty(m_ffProp["EndX"]);
-    m_ffTree->addProperty(m_ffProp["LinearBackground"]);
+    m_ffTree->addProperty(m_properties["StartX"]);
+    m_ffTree->addProperty(m_properties["EndX"]);
+    m_ffTree->addProperty(m_properties["LinearBackground"]);
     
     //option should only be available with a single stretched exponential
     uiForm().furyfit_ckConstrainBeta->setEnabled((index == 2));
@@ -339,20 +338,20 @@ namespace IDA
     switch ( index )
     {
     case 0:
-      m_ffTree->addProperty(m_ffProp["Exponential1"]);
+      m_ffTree->addProperty(m_properties["Exponential1"]);
 
       //remove option to plot beta
       uiForm().furyfit_cbPlotOutput->removeItem(4);
       break;
     case 1:
-      m_ffTree->addProperty(m_ffProp["Exponential1"]);
-      m_ffTree->addProperty(m_ffProp["Exponential2"]);
+      m_ffTree->addProperty(m_properties["Exponential1"]);
+      m_ffTree->addProperty(m_properties["Exponential2"]);
 
       //remove option to plot beta
       uiForm().furyfit_cbPlotOutput->removeItem(4);
       break;
     case 2:
-      m_ffTree->addProperty(m_ffProp["StretchedExp"]);
+      m_ffTree->addProperty(m_properties["StretchedExp"]);
 
       //add option to plot beta
       if(uiForm().furyfit_cbPlotOutput->count() == 4)
@@ -362,8 +361,8 @@ namespace IDA
       
       break;
     case 3:
-      m_ffTree->addProperty(m_ffProp["Exponential1"]);
-      m_ffTree->addProperty(m_ffProp["StretchedExp"]);
+      m_ffTree->addProperty(m_properties["Exponential1"]);
+      m_ffTree->addProperty(m_properties["StretchedExp"]);
 
       //add option to plot beta
       if(uiForm().furyfit_cbPlotOutput->count() == 4)
@@ -397,7 +396,8 @@ namespace IDA
             m_ffInputWSName = wsname;
             QString filename = uiForm().furyfit_inputFile->getFirstFilename();
             // get the output workspace
-            m_ffInputWS = runLoadNexus(filename, m_ffInputWSName);
+            loadFile(filename, m_ffInputWSName);
+            m_ffInputWS = AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(m_ffInputWSName.toStdString());
             if(!m_ffInputWS)
             {
               return;
@@ -421,7 +421,7 @@ namespace IDA
         {
           QString msg = "Workspace: '" + m_ffInputWSName + "' could not be "
             "found in the Analysis Data Service.";
-          showInformationBox(msg);
+          showMessageBox(msg);
           return;
         }
       }
@@ -433,7 +433,7 @@ namespace IDA
     int specMin = 0;
     int specMax = nHist - 1;
 
-    m_intVal->setRange(specMin, specMax);
+    m_valInt->setRange(specMin, specMax);
     uiForm().furyfit_leSpectraMin->setText(QString::number(specMin));
     uiForm().furyfit_leSpectraMax->setText(QString::number(specMax));
 
@@ -450,33 +450,33 @@ namespace IDA
       uiForm().furyfit_lePlotSpectrum->setText(QString::number(specNo));
     }
 
-    m_ffDataCurve = plotMiniplot(m_ffPlot, m_ffDataCurve, m_ffInputWS, specNo);
+    plotMiniPlot(m_ffInputWS, specNo, "FuryFitPlot", "FF_DataCurve");
     try
     {
-      const std::pair<double, double> range = getCurveRange(m_ffDataCurve);
-      m_ffRangeS->setRange(range.first, range.second);
-      m_ffRangeManager->setRange(m_ffProp["StartX"], range.first, range.second);
-      m_ffRangeManager->setRange(m_ffProp["EndX"], range.first, range.second);
+      const std::pair<double, double> range = getCurveRange("FF_DataCurve");
+      m_rangeSelectors["FuryFitRange"]->setRange(range.first, range.second);
+      m_ffRangeManager->setRange(m_properties["StartX"], range.first, range.second);
+      m_ffRangeManager->setRange(m_properties["EndX"], range.first, range.second);
       
       setDefaultParameters("Exponential1");
       setDefaultParameters("Exponential2");
       setDefaultParameters("StretchedExp");
 
-      m_ffPlot->setAxisScale(QwtPlot::xBottom, range.first, range.second);
-      m_ffPlot->setAxisScale(QwtPlot::yLeft, 0.0, 1.0);
-      m_ffPlot->replot();
+      m_plots["FuryFitPlot"]->setAxisScale(QwtPlot::xBottom, range.first, range.second);
+      m_plots["FuryFitPlot"]->setAxisScale(QwtPlot::yLeft, 0.0, 1.0);
+      replot("FuryFitPlot");
     }
     catch(std::invalid_argument & exc)
     {
-      showInformationBox(exc.what());
+      showMessageBox(exc.what());
     }
   }
 
   void FuryFit::setDefaultParameters(const QString& name)
   {
-    double background = m_ffDblMng->value(m_ffProp["BackgroundA0"]);
+    double background = m_dblManager->value(m_properties["BackgroundA0"]);
     //intensity is always 1-background
-    m_ffDblMng->setValue(m_ffProp[name+".Intensity"], 1.0-background);
+    m_dblManager->setValue(m_properties[name+".Intensity"], 1.0-background);
     auto x = m_ffInputWS->readX(0);
     auto y = m_ffInputWS->readY(0);
     double tau = 0;
@@ -486,53 +486,53 @@ namespace IDA
       tau = -x[4] / log(y[4]);
     }
 
-    m_ffDblMng->setValue(m_ffProp[name+".Tau"], tau);
-    m_ffDblMng->setValue(m_ffProp[name+".Beta"], 1.0);
+    m_dblManager->setValue(m_properties[name+".Tau"], tau);
+    m_dblManager->setValue(m_properties[name+".Beta"], 1.0);
   }
 
   void FuryFit::xMinSelected(double val)
   {
-    m_ffRangeManager->setValue(m_ffProp["StartX"], val);
+    m_ffRangeManager->setValue(m_properties["StartX"], val);
   }
 
   void FuryFit::xMaxSelected(double val)
   {
-    m_ffRangeManager->setValue(m_ffProp["EndX"], val);
+    m_ffRangeManager->setValue(m_properties["EndX"], val);
   }
 
   void FuryFit::backgroundSelected(double val)
   {
-    m_ffRangeManager->setValue(m_ffProp["BackgroundA0"], val);
-    m_ffDblMng->setValue(m_ffProp["Exponential1.Intensity"], 1.0-val);
-    m_ffDblMng->setValue(m_ffProp["Exponential2.Intensity"], 1.0-val);
-    m_ffDblMng->setValue(m_ffProp["StretchedExp.Intensity"], 1.0-val);
+    m_ffRangeManager->setValue(m_properties["BackgroundA0"], val);
+    m_dblManager->setValue(m_properties["Exponential1.Intensity"], 1.0-val);
+    m_dblManager->setValue(m_properties["Exponential2.Intensity"], 1.0-val);
+    m_dblManager->setValue(m_properties["StretchedExp.Intensity"], 1.0-val);
   }
 
   void FuryFit::propertyChanged(QtProperty* prop, double val)
   {
-    if ( prop == m_ffProp["StartX"] )
+    if ( prop == m_properties["StartX"] )
     {
-      m_ffRangeS->setMinimum(val);
+      m_rangeSelectors["FuryFitRange"]->setMinimum(val);
     }
-    else if ( prop == m_ffProp["EndX"] )
+    else if ( prop == m_properties["EndX"] )
     {
-      m_ffRangeS->setMaximum(val);
+      m_rangeSelectors["FuryFitRange"]->setMaximum(val);
     }
-    else if ( prop == m_ffProp["BackgroundA0"])
+    else if ( prop == m_properties["BackgroundA0"])
     {
-      m_ffBackRangeS->setMinimum(val);
-      m_ffDblMng->setValue(m_ffProp["Exponential1.Intensity"], 1.0-val);
-      m_ffDblMng->setValue(m_ffProp["Exponential2.Intensity"], 1.0-val);
-      m_ffDblMng->setValue(m_ffProp["StretchedExp.Intensity"], 1.0-val);
+      m_rangeSelectors["FuryFitBackground"]->setMinimum(val);
+      m_dblManager->setValue(m_properties["Exponential1.Intensity"], 1.0-val);
+      m_dblManager->setValue(m_properties["Exponential2.Intensity"], 1.0-val);
+      m_dblManager->setValue(m_properties["StretchedExp.Intensity"], 1.0-val);
     }
-    else if( prop == m_ffProp["Exponential1.Intensity"] 
-      || prop == m_ffProp["Exponential2.Intensity"] 
-      || prop == m_ffProp["StretchedExp.Intensity"])
+    else if( prop == m_properties["Exponential1.Intensity"] 
+      || prop == m_properties["Exponential2.Intensity"] 
+      || prop == m_properties["StretchedExp.Intensity"])
     {
-      m_ffBackRangeS->setMinimum(1.0-val);
-      m_ffDblMng->setValue(m_ffProp["Exponential1.Intensity"], val);
-      m_ffDblMng->setValue(m_ffProp["Exponential2.Intensity"], val);
-      m_ffDblMng->setValue(m_ffProp["StretchedExp.Intensity"], val);
+      m_rangeSelectors["FuryFitBackground"]->setMinimum(1.0-val);
+      m_dblManager->setValue(m_properties["Exponential1.Intensity"], val);
+      m_dblManager->setValue(m_properties["Exponential2.Intensity"], val);
+      m_dblManager->setValue(m_properties["StretchedExp.Intensity"], val);
     }
   }
 
@@ -574,13 +574,6 @@ namespace IDA
 
   void FuryFit::singleFit()
   {
-    const QString error = validate();
-    if( ! error.isEmpty() )
-    {
-      showInformationBox(error);
-      return;
-    }
-
     // First create the function
     auto function = createFunction();
 
@@ -621,8 +614,8 @@ namespace IDA
     alg->setPropertyValue("Function", function->asString());
     alg->setPropertyValue("InputWorkspace", m_ffInputWSName.toStdString());
     alg->setProperty("WorkspaceIndex", uiForm().furyfit_lePlotSpectrum->text().toInt());
-    alg->setProperty("StartX", m_ffRangeManager->value(m_ffProp["StartX"]));
-    alg->setProperty("EndX", m_ffRangeManager->value(m_ffProp["EndX"]));
+    alg->setProperty("StartX", m_ffRangeManager->value(m_properties["StartX"]));
+    alg->setProperty("EndX", m_ffRangeManager->value(m_properties["EndX"]));
     alg->setProperty("Ties", m_ties.toStdString());
     alg->setPropertyValue("Output", output);
     alg->execute();
@@ -631,15 +624,15 @@ namespace IDA
     {
       QString msg = "There was an error executing the fitting algorithm. Please see the "
         "Results Log pane for more details.";
-      showInformationBox(msg);
+      showMessageBox(msg);
       return;
     }
 
     // Now show the fitted curve of the mini plot
-    m_ffFitCurve = plotMiniplot(m_ffPlot, m_ffFitCurve, outputNm+"_Workspace", 1);
+    plotMiniPlot(outputNm+"_Workspace", 1, "FuryFitPlot", "FF_FitCurve");
     QPen fitPen(Qt::red, Qt::SolidLine);
-    m_ffFitCurve->setPen(fitPen);
-    m_ffPlot->replot();
+    m_curves["FF_FitCurve"]->setPen(fitPen);
+    replot("FuryFitPlot");
 
     Mantid::API::IFunction_sptr outputFunc = alg->getProperty("Function");
 
@@ -654,19 +647,19 @@ namespace IDA
     for ( size_t i = 0; i < parNames.size(); ++i )
       parameters[QString(parNames[i].c_str())] = parVals[i];
 
-    m_ffRangeManager->setValue(m_ffProp["BackgroundA0"], parameters["f0.A0"]);
+    m_ffRangeManager->setValue(m_properties["BackgroundA0"], parameters["f0.A0"]);
   
     if ( fitType != 2 )
     {
       // Exp 1
-      m_ffDblMng->setValue(m_ffProp["Exponential1.Intensity"], parameters["f1.Intensity"]);
-      m_ffDblMng->setValue(m_ffProp["Exponential1.Tau"], parameters["f1.Tau"]);
+      m_dblManager->setValue(m_properties["Exponential1.Intensity"], parameters["f1.Intensity"]);
+      m_dblManager->setValue(m_properties["Exponential1.Tau"], parameters["f1.Tau"]);
     
       if ( fitType == 1 )
       {
         // Exp 2
-        m_ffDblMng->setValue(m_ffProp["Exponential2.Intensity"], parameters["f2.Intensity"]);
-        m_ffDblMng->setValue(m_ffProp["Exponential2.Tau"], parameters["f2.Tau"]);
+        m_dblManager->setValue(m_properties["Exponential2.Intensity"], parameters["f2.Intensity"]);
+        m_dblManager->setValue(m_properties["Exponential2.Tau"], parameters["f2.Tau"]);
       }
     }
   
@@ -677,15 +670,15 @@ namespace IDA
       if ( fitType == 2 ) { fval = "f1."; }
       else { fval = "f2."; }
     
-      m_ffDblMng->setValue(m_ffProp["StretchedExp.Intensity"], parameters[fval+"Intensity"]);
-      m_ffDblMng->setValue(m_ffProp["StretchedExp.Tau"], parameters[fval+"Tau"]);
-      m_ffDblMng->setValue(m_ffProp["StretchedExp.Beta"], parameters[fval+"Beta"]);
+      m_dblManager->setValue(m_properties["StretchedExp.Intensity"], parameters[fval+"Intensity"]);
+      m_dblManager->setValue(m_properties["StretchedExp.Tau"], parameters[fval+"Tau"]);
+      m_dblManager->setValue(m_properties["StretchedExp.Beta"], parameters[fval+"Beta"]);
     }
   }
 
   void FuryFit::plotGuess(QtProperty*)
   {
-    if ( m_ffDataCurve == NULL )
+    if ( m_curves["FF_DataCurve"] == NULL )
     {
       return;
     }
@@ -693,8 +686,8 @@ namespace IDA
     Mantid::API::CompositeFunction_sptr function = createFunction(true);
 
     // Create the double* array from the input workspace
-    const size_t binIndxLow = m_ffInputWS->binIndexOf(m_ffRangeManager->value(m_ffProp["StartX"]));
-    const size_t binIndxHigh = m_ffInputWS->binIndexOf(m_ffRangeManager->value(m_ffProp["EndX"]));
+    const size_t binIndxLow = m_ffInputWS->binIndexOf(m_ffRangeManager->value(m_properties["StartX"]));
+    const size_t binIndxHigh = m_ffInputWS->binIndexOf(m_ffRangeManager->value(m_properties["EndX"]));
     const size_t nData = binIndxHigh - binIndxLow;
 
     std::vector<double> inputXData(nData);
@@ -725,19 +718,13 @@ namespace IDA
     }
 
     // Create the curve
-    if ( m_ffFitCurve != NULL )
-    {
-      m_ffFitCurve->attach(0);
-      delete m_ffFitCurve;
-      m_ffFitCurve = 0;
-    }
-
-    m_ffFitCurve = new QwtPlotCurve();
-    m_ffFitCurve->setData(dataX, dataY);
-    m_ffFitCurve->attach(m_ffPlot);
+    removeCurve("FF_FitCurve");
+    m_curves["FF_FitCurve"] = new QwtPlotCurve();
+    m_curves["FF_FitCurve"]->setData(dataX, dataY);
+    m_curves["FF_FitCurve"]->attach(m_plots["FuryFitPlot"]);
     QPen fitPen(Qt::red, Qt::SolidLine);
-    m_ffFitCurve->setPen(fitPen);
-    m_ffPlot->replot();
+    m_curves["FF_FitCurve"]->setPen(fitPen);
+    replot("FuryFitPlot");
   }
 
   void FuryFit::fitContextMenu(const QPoint &)
@@ -753,7 +740,7 @@ namespace IDA
     QtProperty* prop = item->property();
 
     // is it already fixed?
-    bool fixed = prop->propertyManager() != m_ffDblMng;
+    bool fixed = prop->propertyManager() != m_dblManager;
 
     if ( fixed && prop->propertyManager() != m_stringManager ) 
       return;
@@ -764,12 +751,12 @@ namespace IDA
 
     if ( ! fixed )
     {
-      action = new QAction("Fix", this);
+      action = new QAction("Fix", m_parentWidget);
       connect(action, SIGNAL(triggered()), this, SLOT(fixItem()));
     }
     else
     {
-      action = new QAction("Remove Fix", this);
+      action = new QAction("Remove Fix", m_parentWidget);
       connect(action, SIGNAL(triggered()), this, SLOT(unFixItem()));
     }
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IDATab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IDATab.cpp
index 8e629fed9f216b5075c2a8c93306dbca3517cd37..587c2921c733ad9c456f09c28d6df40573ee7802 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/IDATab.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IDATab.cpp
@@ -7,50 +7,25 @@
 #include <qwt_plot_curve.h>
 #include <QString>
 
+using namespace Mantid::API;
+  
 namespace MantidQt
 {
 namespace CustomInterfaces
 {
 namespace IDA
 {
-
-  using namespace Mantid::API;
-
   /**
    * Constructor.
    *
    * @param parent :: the parent widget (an IndirectDataAnalysis object).
    */
-  IDATab::IDATab(QWidget * parent) : QWidget(parent), m_algRunner(new MantidQt::API::AlgorithmRunner(parent)), m_parent(NULL)
+  IDATab::IDATab(QWidget * parent) : IndirectTab(parent),
+    m_parent(NULL)
   {
     m_parent = dynamic_cast<IndirectDataAnalysis*>(parent);
   }
 
-  /**
-   * Sets up the tab.  
-   *
-   * Calls overridden version of setup() in child class.
-   */
-  void IDATab::setupTab() 
-  {
-    setup();
-  }
-
-  /**
-   * Runs the tab.  
-   *
-   * Calls overridden version of run() in child class.
-   */
-  void IDATab::runTab()
-  { 
-    const QString error = validate();
-
-    if( ! error.isEmpty() )
-      showInformationBox(error);
-    else
-      run();
-  }
-
   /**
    * Loads the tab's settings.
    *
@@ -83,143 +58,6 @@ namespace IDA
     validate();
   }
 
-  /**
-   * Displays the given message in a dialog box.  Just calls the same method of parent.
-   *
-   * @param message :: message to display.
-   */
-  void IDATab::showInformationBox(const QString & message)
-  {
-    m_parent->showInformationBox(message);
-  }
-
-  /**
-   * Runs the given Python code as a script.  Just calls the same method of parent.
-   *
-   * @param code      :: a QString containing the code to execute
-   * @param no_output :: whether or not to show output of script
-   */
-  QString IDATab::runPythonCode(const QString & code, bool no_output)
-  {
-    return m_parent->runPythonCode(code, no_output);
-  }
-
-  /**
-   * Runs an algorithm async
-   *
-   * @param algorithm :: The algorithm to be run
-   */
-  void IDATab::runAlgorithm(const Mantid::API::IAlgorithm_sptr algorithm)
-  {
-    algorithm->setRethrows(true);
-    m_algRunner->startAlgorithm(algorithm);
-  }
-
-  /**
-   * Run load nexus and return the workspace
-   * @param filename A full path to the filename
-   * @param wsname The workspace name in the ADS
-   * @return A pointer to the workspace or a null pointer if the load failed
-   */
-  MatrixWorkspace_const_sptr IDATab::runLoadNexus(const QString & filename, const QString & wsname)
-  {
-    using Mantid::Kernel::Exception::NotFoundError;
-
-    QString pyInput = "LoadNexus(Filename=r'" + filename + "', OutputWorkspace='" + wsname + "')";
-    runPythonCode(pyInput);
-
-    MatrixWorkspace_const_sptr ws;
-    try
-    {
-      ws = AnalysisDataService::Instance().retrieveWS<const MatrixWorkspace>(wsname.toStdString());
-    }
-    catch(NotFoundError&)
-    {
-      showInformationBox("Failed to load "+filename+".\n Check the log for more details.");
-    }
-    return ws;
-  }
-
-  /**
-   * Creates and returns a "mini plot", from the given QwtPlot and QwtPlotCurve objects, as well as the given workspace
-   * and workspace index.
-   *
-   * @param plot      :: the QwtPlot object
-   * @param curve     :: the QwtPlotCurve object
-   * @param workspace :: A pointer to the workspace to use
-   * @param index   :: the workspace index
-   *
-   * @returns the resulting QwtPlotCurve object
-   */
-  QwtPlotCurve* IDATab::plotMiniplot(QwtPlot* plot, QwtPlotCurve* curve, const QString & workspace, size_t index)
-  {
-    auto ws = Mantid::API::AnalysisDataService::Instance().retrieveWS<const Mantid::API::MatrixWorkspace>(workspace.toStdString());
-    return plotMiniplot(plot, curve, ws, index);
-  }
-
-
-  /**
-   * Creates and returns a "mini plot", from the given QwtPlot and QwtPlotCurve objects, as well as the given workspace
-   * and workspace index.
-   *
-   * @param plot      :: the QwtPlot object
-   * @param curve     :: the QwtPlotCurve object
-   * @param workspace :: A pointer to the workspace to use
-   * @param wsIndex   :: the workspace index
-   *
-   * @returns the resulting QwtPlotCurve object
-   */
-  QwtPlotCurve* IDATab::plotMiniplot(QwtPlot* plot, QwtPlotCurve* curve, const Mantid::API::MatrixWorkspace_const_sptr & workspace, size_t wsIndex)
-  {
-    if ( curve != NULL )
-    {
-      curve->attach(0);
-      delete curve;
-      curve = 0;
-    }
-
-    size_t nhist = workspace->getNumberHistograms();
-    if ( wsIndex >= nhist )
-    {
-      showInformationBox("Error: Workspace index out of range.");
-      return NULL;
-    }
-
-    using Mantid::MantidVec;
-    const MantidVec & dataX = workspace->readX(wsIndex);
-    const MantidVec & dataY = workspace->readY(wsIndex);
-
-    curve = new QwtPlotCurve();
-    curve->setData(&dataX[0], &dataY[0], static_cast<int>(workspace->blocksize()));
-    curve->attach(plot);
-
-    plot->replot();
-
-    return curve;
-  }
-
-  /**
-   * Returns the range of the given curve data.
-   *
-   * @param curve :: A Qwt plot curve
-   *
-   * @returns A pair of doubles indicating the range
-   *
-   * @throws std::invalid_argument If the curve has too few points (<2) or is NULL
-   */
-  std::pair<double,double> IDATab::getCurveRange(QwtPlotCurve* curve)
-  {
-    if( !curve )
-      throw std::invalid_argument("Invalid curve as argument to getCurveRange");
-
-    size_t npts = curve->data().size();
-
-    if( npts < 2 )
-      throw std::invalid_argument("Too few points on data curve to determine range.");
-
-    return std::make_pair(curve->data().x(0), curve->data().x(npts-1));
-  }
-
   /**
   * Check that the binning between two workspaces matches.
   *
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayes.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayes.cpp
index 073f0c610255fadb66f6afe488e643de677acde4..49db0e54f64a0f160019f02d901bd38d916aa1a5 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayes.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayes.cpp
@@ -37,9 +37,8 @@ IndirectBayes::IndirectBayes(QWidget *parent) : UserSubWindow(parent),
 	std::map<unsigned int, IndirectBayesTab*>::iterator iter;
 	for (iter = m_bayesTabs.begin(); iter != m_bayesTabs.end(); ++iter)
 	{
-		connect(iter->second, SIGNAL(executePythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool)));
+		connect(iter->second, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool)));
 		connect(iter->second, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&)));
-		
 	}
 
 	loadSettings();
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayesTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayesTab.cpp
index 0e3a0cbdfe8f7548905863fe70c1b73efc87b07f..6ce219f719e2e279f674ee8fec37ad9db495eb5d 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayesTab.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectBayesTab.cpp
@@ -48,7 +48,7 @@ namespace MantidQt
      */
     void IndirectBayesTab::runPythonScript(const QString& pyInput)
     {
-      emit executePythonScript(pyInput, true);
+      emit runAsPythonScript(pyInput, true);
     }
 
     /**
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataAnalysis.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataAnalysis.cpp
index d880aa990450f91a67b857284e302008a22a6809..a8d6539f0255c592be725fee504d211e0f691ba3 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataAnalysis.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataAnalysis.cpp
@@ -84,10 +84,13 @@ namespace IDA
     m_dblEdFac = new DoubleEditorFactory(this);
     m_blnEdFac = new QtCheckBoxFactory(this);
 
-    // Set up all tabs.
-    auto tab = m_tabs.begin();
-    for( ; tab != m_tabs.end(); ++tab )
+    // Set up all tabs
+    for(auto tab = m_tabs.begin(); tab != m_tabs.end(); ++tab)
+    {
       tab->second->setupTab();
+      connect(tab->second, SIGNAL(runAsPythonScript(const QString&, bool)), this, SIGNAL(runAsPythonScript(const QString&, bool)));
+      connect(tab->second, SIGNAL(showMessageBox(const QString&)), this, SLOT(showMessageBox(const QString&)));
+    }
 
     connect(m_uiForm.pbHelp, SIGNAL(clicked()), this, SLOT(help()));
     connect(m_uiForm.pbRun, SIGNAL(clicked()), this, SLOT(run()));
@@ -152,6 +155,18 @@ namespace IDA
     QString url = m_tabs[currentTab]->tabHelpURL();
     QDesktopServices::openUrl(QUrl(url));
   }
+
+  /**
+   * Slot to wrap the protected showInformationBox method defined
+   * in UserSubWindow and provide access to composed tabs.
+   * 
+   * @param message The message to display in the message box
+   */
+  void IndirectDataAnalysis::showMessageBox(const QString& message)
+  {
+    showInformationBox(message);
+  }
+
 } // namespace IDA
 } // namespace CustomInterfaces
 } // namespace MantidQt
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp
index 2c51d24b32752a1261d84fdcc51fe235450a265e..f94a2a9d6f9c39f4bde430f52c8914c7a592a5de 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectDataReduction.cpp
@@ -78,6 +78,7 @@ IndirectDataReduction::~IndirectDataReduction()
  */
 void IndirectDataReduction::helpClicked()
 {
+
   QString tabName = m_uiForm.tabWidget->tabText(
       m_uiForm.tabWidget->currentIndex());
 
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectTab.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectTab.cpp
index 037feb9d98dfa9fc124eb0443f15c6e15dcd1ec2..52f9b90a6f5e4dbdd879db75ba824aef6a3ac20d 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectTab.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/IndirectTab.cpp
@@ -22,7 +22,8 @@ namespace CustomInterfaces
       m_plots(), m_curves(), m_rangeSelectors(),
       m_properties(),
       m_dblManager(new QtDoublePropertyManager()), m_blnManager(new QtBoolPropertyManager()), m_grpManager(new QtGroupPropertyManager()),
-      m_dblEdFac(new DoubleEditorFactory())
+      m_dblEdFac(new DoubleEditorFactory()),
+      m_pythonRunner()
   {
     m_parentWidget = dynamic_cast<QWidget *>(parent);
 
@@ -162,6 +163,21 @@ namespace CustomInterfaces
     m_plots[plotID]->replot();
   }
 
+  /**
+   * Removes a curve from a mini plot and deletes it.
+   *
+   * @param curveID :: ID of plot in m_plots map
+   */
+  void IndirectTab::removeCurve(const QString& curveID)
+  {
+    if(m_curves[curveID] == NULL)
+      return;
+
+    m_curves[curveID]->attach(0);
+    delete m_curves[curveID];
+    m_curves[curveID] = NULL;
+  }
+
   /**
    * Plot a workspace to the miniplot given a workspace pointer and
    * a specturm index.
@@ -186,12 +202,7 @@ namespace CustomInterfaces
 
     QwtWorkspaceSpectrumData wsData(*workspace, static_cast<int>(wsIndex), false);
 
-    if ( m_curves[cID] != NULL )
-    {
-      m_curves[cID]->attach(0);
-      delete m_curves[cID];
-      m_curves[cID] = NULL;
-    }
+    removeCurve(cID);
 
     size_t nhist = workspace->getNumberHistograms();
     if ( wsIndex >= nhist )
@@ -275,5 +286,17 @@ namespace CustomInterfaces
     }
   }
 
+  /**
+   * Run Python code and return anything printed to stdout.
+   *
+   * @param code Python code the execute
+   * @param no_output Enable to ignore any output
+   * @returns What was printed to stdout
+   */
+  QString IndirectTab::runPythonCode(QString code, bool no_output)
+  {
+    return m_pythonRunner.runPythonCode(code, no_output);
+  }
+
 } // namespace CustomInterfaces
 } // namespace Mantid
diff --git a/Code/Mantid/MantidQt/CustomInterfaces/src/MSDFit.cpp b/Code/Mantid/MantidQt/CustomInterfaces/src/MSDFit.cpp
index 226cd5965c33929c50aacc288da43be06dba1057..e160174493d4b76844d6346c172b2f356171b82a 100644
--- a/Code/Mantid/MantidQt/CustomInterfaces/src/MSDFit.cpp
+++ b/Code/Mantid/MantidQt/CustomInterfaces/src/MSDFit.cpp
@@ -16,41 +16,40 @@ namespace CustomInterfaces
 {
 namespace IDA
 {
-  MSDFit::MSDFit(QWidget * parent) : IDATab(parent), m_msdPlot(NULL), m_msdRange(NULL), m_msdDataCurve(NULL), m_msdFitCurve(NULL), 
-    m_msdTree(NULL), m_msdProp(), m_msdDblMng(NULL)
-  {}
-  
+  MSDFit::MSDFit(QWidget * parent) : IDATab(parent),
+    m_msdTree(NULL)
+  {
+  }
+
   void MSDFit::setup()
   {
     // Tree Browser
     m_msdTree = new QtTreePropertyBrowser();
     uiForm().msd_properties->addWidget(m_msdTree);
-    m_intVal = new QIntValidator(this);
-    m_msdDblMng = new QtDoublePropertyManager();
 
-    m_msdTree->setFactoryForManager(m_msdDblMng, doubleEditorFactory());
+    m_msdTree->setFactoryForManager(m_dblManager, doubleEditorFactory());
 
-    m_msdProp["Start"] = m_msdDblMng->addProperty("StartX");
-    m_msdDblMng->setDecimals(m_msdProp["Start"], NUM_DECIMALS);
-    m_msdProp["End"] = m_msdDblMng->addProperty("EndX");
-    m_msdDblMng->setDecimals(m_msdProp["End"], NUM_DECIMALS);
+    m_properties["Start"] = m_dblManager->addProperty("StartX");
+    m_dblManager->setDecimals(m_properties["Start"], NUM_DECIMALS);
+    m_properties["End"] = m_dblManager->addProperty("EndX");
+    m_dblManager->setDecimals(m_properties["End"], NUM_DECIMALS);
 
-    m_msdTree->addProperty(m_msdProp["Start"]);
-    m_msdTree->addProperty(m_msdProp["End"]);
+    m_msdTree->addProperty(m_properties["Start"]);
+    m_msdTree->addProperty(m_properties["End"]);
 
-    m_msdPlot = new QwtPlot(this);
-    uiForm().msd_plot->addWidget(m_msdPlot);
+    m_plots["MSDPlot"] = new QwtPlot(m_parentWidget);
+    uiForm().msd_plot->addWidget(m_plots["MSDPlot"]);
 
     // Cosmetics
-    m_msdPlot->setAxisFont(QwtPlot::xBottom, this->font());
-    m_msdPlot->setAxisFont(QwtPlot::yLeft, this->font());
-    m_msdPlot->setCanvasBackground(Qt::white);
+    m_plots["MSDPlot"]->setAxisFont(QwtPlot::xBottom, m_parentWidget->font());
+    m_plots["MSDPlot"]->setAxisFont(QwtPlot::yLeft, m_parentWidget->font());
+    m_plots["MSDPlot"]->setCanvasBackground(Qt::white);
 
-    m_msdRange = new MantidWidgets::RangeSelector(m_msdPlot);
+    m_rangeSelectors["MSDRange"] = new MantidWidgets::RangeSelector(m_plots["MSDPlot"]);
 
-    connect(m_msdRange, SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
-    connect(m_msdRange, SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
-    connect(m_msdDblMng, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
+    connect(m_rangeSelectors["MSDRange"], SIGNAL(minValueChanged(double)), this, SLOT(minChanged(double)));
+    connect(m_rangeSelectors["MSDRange"], SIGNAL(maxValueChanged(double)), this, SLOT(maxChanged(double)));
+    connect(m_dblManager, SIGNAL(valueChanged(QtProperty*, double)), this, SLOT(updateRS(QtProperty*, double)));
 
     connect(uiForm().msd_dsSampleInput, SIGNAL(dataReady(const QString&)), this, SLOT(plotInput()));
     connect(uiForm().msd_pbSingle, SIGNAL(clicked()), this, SLOT(singleFit()));
@@ -58,57 +57,42 @@ namespace IDA
     connect(uiForm().msd_leSpectraMin, SIGNAL(editingFinished()), this, SLOT(plotInput()));
     connect(uiForm().msd_leSpectraMax, SIGNAL(editingFinished()), this, SLOT(plotInput()));
     
-    uiForm().msd_leSpectraMin->setValidator(m_intVal);
-    uiForm().msd_leSpectraMax->setValidator(m_intVal);
+    uiForm().msd_leSpectraMin->setValidator(m_valInt);
+    uiForm().msd_leSpectraMax->setValidator(m_valInt);
   }
 
   void MSDFit::run()
   {
-    QString errors = validate();
-
-    if (errors.isEmpty())
-    {
-      QString pyInput =
-      "from IndirectDataAnalysis import msdfit\n"
-      "startX = " + QString::number(m_msdDblMng->value(m_msdProp["Start"])) +"\n"
-      "endX = " + QString::number(m_msdDblMng->value(m_msdProp["End"])) +"\n"
-      "specMin = " + uiForm().msd_leSpectraMin->text() + "\n"
-      "specMax = " + uiForm().msd_leSpectraMax->text() + "\n"
-      "input = '" + uiForm().msd_dsSampleInput->getCurrentDataName() + "'\n";
+    QString pyInput =
+    "from IndirectDataAnalysis import msdfit\n"
+    "startX = " + QString::number(m_dblManager->value(m_properties["Start"])) +"\n"
+    "endX = " + QString::number(m_dblManager->value(m_properties["End"])) +"\n"
+    "specMin = " + uiForm().msd_leSpectraMin->text() + "\n"
+    "specMax = " + uiForm().msd_leSpectraMax->text() + "\n"
+    "input = '" + uiForm().msd_dsSampleInput->getCurrentDataName() + "'\n";
 
-      if ( uiForm().msd_ckVerbose->isChecked() ) pyInput += "verbose = True\n";
-      else pyInput += "verbose = False\n";
+    if ( uiForm().msd_ckVerbose->isChecked() ) pyInput += "verbose = True\n";
+    else pyInput += "verbose = False\n";
 
-      if ( uiForm().msd_ckPlot->isChecked() ) pyInput += "plot = True\n";
-      else pyInput += "plot = False\n";
+    if ( uiForm().msd_ckPlot->isChecked() ) pyInput += "plot = True\n";
+    else pyInput += "plot = False\n";
 
-      if ( uiForm().msd_ckSave->isChecked() ) pyInput += "save = True\n";
-      else pyInput += "save = False\n";
+    if ( uiForm().msd_ckSave->isChecked() ) pyInput += "save = True\n";
+    else pyInput += "save = False\n";
 
-      pyInput +=
-        "msdfit(input, startX, endX, spec_min=specMin, spec_max=specMax, Save=save, Verbose=verbose, Plot=plot)\n";
+    pyInput +=
+      "msdfit(input, startX, endX, spec_min=specMin, spec_max=specMax, Save=save, Verbose=verbose, Plot=plot)\n";
 
-      QString pyOutput = runPythonCode(pyInput).trimmed();
-    }
-    else
-    {
-      showInformationBox(errors);
-    }
+    QString pyOutput = runPythonCode(pyInput);
+    UNUSED_ARG(pyOutput);
   }
 
   void MSDFit::singleFit()
   {
-    const QString error = validate();
-    if( ! error.isEmpty() )
-    {
-      showInformationBox(error);
-      return;
-    }
-
     QString pyInput =
       "from IndirectDataAnalysis import msdfit\n"
-      "startX = " + QString::number(m_msdDblMng->value(m_msdProp["Start"])) +"\n"
-      "endX = " + QString::number(m_msdDblMng->value(m_msdProp["End"])) +"\n"
+      "startX = " + QString::number(m_dblManager->value(m_properties["Start"])) +"\n"
+      "endX = " + QString::number(m_dblManager->value(m_properties["End"])) +"\n"
       "specMin = " + uiForm().msd_lePlotSpectrum->text() + "\n"
       "specMax = " + uiForm().msd_lePlotSpectrum->text() + "\n"
       "input = '" + uiForm().msd_dsSampleInput->getCurrentDataName() + "'\n";
@@ -124,13 +108,13 @@ namespace IDA
     plotFit(pyOutput);
   }
 
-  QString MSDFit::validate()
+  bool MSDFit::validate()
   {
     UserInputValidator uiv;
     
     uiv.checkDataSelectorIsValid("Sample input", uiForm().msd_dsSampleInput);
 
-    auto range = std::make_pair(m_msdDblMng->value(m_msdProp["Start"]), m_msdDblMng->value(m_msdProp["End"]));
+    auto range = std::make_pair(m_dblManager->value(m_properties["Start"]), m_dblManager->value(m_properties["End"]));
     uiv.checkValidRange("a range", range);
 
     QString specMin = uiForm().msd_leSpectraMin->text();
@@ -138,7 +122,10 @@ namespace IDA
     auto specRange = std::make_pair(specMin.toInt(), specMax.toInt()+1);
     uiv.checkValidRange("spectrum range", specRange);
 
-    return uiv.generateErrorMessage();
+    QString errors = uiv.generateErrorMessage();
+    showMessageBox(errors);
+
+    return errors.isEmpty();
   }
 
   void MSDFit::loadSettings(const QSettings & settings)
@@ -153,10 +140,10 @@ namespace IDA
       //read the fit from the workspace
       auto groupWs = Mantid::API::AnalysisDataService::Instance().retrieveWS<const Mantid::API::WorkspaceGroup>(wsName.toStdString());
       auto ws = boost::dynamic_pointer_cast<Mantid::API::MatrixWorkspace>(groupWs->getItem(0));
-      m_msdFitCurve = plotMiniplot(m_msdPlot, m_msdFitCurve, ws, 1);
+      plotMiniPlot(ws, 1, "MSDPlot", "MSDFitCurve");
       QPen fitPen(Qt::red, Qt::SolidLine);
-      m_msdFitCurve->setPen(fitPen);
-      m_msdPlot->replot();
+      m_curves["MSDFitCurve"]->setPen(fitPen);
+      replot("MSDPlot");
     }
   }
 
@@ -203,32 +190,24 @@ namespace IDA
       }
     }
 
-    m_msdDataCurve = plotMiniplot(m_msdPlot, m_msdDataCurve, ws, wsIndex);
+    plotMiniPlot(ws, wsIndex, "MSDPlot", "MSDDataCurve");
     try
     {
-      const std::pair<double, double> range = getCurveRange(m_msdDataCurve);
-      m_msdRange->setRange(range.first, range.second);
+      const std::pair<double, double> range = getCurveRange("MSDDataCurve");
+      m_rangeSelectors["MSDRange"]->setRange(range.first, range.second);
       
       uiForm().msd_leSpectraMin->setText(QString::number(minIndex));
       uiForm().msd_leSpectraMax->setText(QString::number(maxIndex));
       uiForm().msd_lePlotSpectrum->setText(QString::number(wsIndex));
 
-      m_intVal->setRange(0, maxIndex);
-
-      //delete reference to fitting.
-      if (m_msdFitCurve != NULL)
-      {
-        m_msdFitCurve->attach(0);
-        delete m_msdFitCurve;
-        m_msdFitCurve = 0;
-      }
+      m_valInt->setRange(0, maxIndex);
 
       // Replot
-      m_msdPlot->replot();
+      replot("MSDPlot");
     }
     catch(std::invalid_argument & exc)
     {
-      showInformationBox(exc.what());
+      showMessageBox(exc.what());
     }
 
     currentWsName = wsname;
@@ -236,18 +215,18 @@ namespace IDA
 
   void MSDFit::minChanged(double val)
   {
-    m_msdDblMng->setValue(m_msdProp["Start"], val);
+    m_dblManager->setValue(m_properties["Start"], val);
   }
 
   void MSDFit::maxChanged(double val)
   {
-    m_msdDblMng->setValue(m_msdProp["End"], val);
+    m_dblManager->setValue(m_properties["End"], val);
   }
 
   void MSDFit::updateRS(QtProperty* prop, double val)
   {
-    if ( prop == m_msdProp["Start"] ) m_msdRange->setMinimum(val);
-    else if ( prop == m_msdProp["End"] ) m_msdRange->setMaximum(val);
+    if ( prop == m_properties["Start"] ) m_rangeSelectors["MSDRange"]->setMinimum(val);
+    else if ( prop == m_properties["End"] ) m_rangeSelectors["MSDRange"]->setMaximum(val);
   }
 } // namespace IDA
 } // namespace CustomInterfaces
diff --git a/Code/Mantid/scripts/Inelastic/IndirectDataAnalysis.py b/Code/Mantid/scripts/Inelastic/IndirectDataAnalysis.py
index 36ebc9ff0a0fb934026400057dc7fa2f105d91d4..dd3e5fec2d941affa1080669d664acc9b80fb718 100644
--- a/Code/Mantid/scripts/Inelastic/IndirectDataAnalysis.py
+++ b/Code/Mantid/scripts/Inelastic/IndirectDataAnalysis.py
@@ -1008,8 +1008,8 @@ def abscorFeeder(sample, container, geom, useCor, corrections, Verbose=False, Re
         calc_plot = [cor_result + ext, sample]
         res_plot = cor_result+'_rqw'
     else:
-        if ( scaled_container == '' ):
-            sys.exit('ERROR *** Invalid options - nothing to do!')
+        if scaled_container == '':
+            raise RuntimeError('Invalid options - nothing to do!')
         else:
             sub_result = sam_name +'Subtract_'+ can_run
             if Verbose:
@@ -1036,10 +1036,10 @@ def abscorFeeder(sample, container, geom, useCor, corrections, Verbose=False, Re
             else:
                 res_plot = sub_result + '_red'
 
-    if (PlotResult != 'None'):
+    if PlotResult != 'None':
         plotCorrResult(res_plot, PlotResult)
 
-    if ( mtd.doesExist(scaled_container) ):
+    if mtd.doesExist(scaled_container):
         sws = mtd[sample]
         cws = mtd[scaled_container]
         names = 'Sample,Can,Calc'
@@ -1077,7 +1077,9 @@ def abscorFeeder(sample, container, geom, useCor, corrections, Verbose=False, Re
                 logger.notice('Output file created : '+res_path)
 
         DeleteWorkspace(cws)
+
     EndTime('ApplyCorrections')
+    return res_plot
 
 def plotCorrResult(inWS,PlotResult):
     nHist = mtd[inWS].getNumberHistograms()