Index: src/sas/qtgui/AboutBox.py
===================================================================
--- src/sas/qtgui/AboutBox.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/AboutBox.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -1,10 +1,3 @@
-# global
-import sys
-import os
 import functools
-
-from PyQt4 import QtCore
-from PyQt4 import QtGui
-from PyQt4 import QtWebKit
 
 import sas.sasview
@@ -28,8 +21,5 @@
         """
         version = sas.sasview.__version__
-        build = sas.sasview.__build__
 
-        version_text = r'<html><head/><body><p><span style=" font-size:24pt;">'\
-                     + str(version) + r'</span></p></body></html>'
         self.lblVersion.setText(str(version))
         lbl_font = self.font()
@@ -42,5 +32,6 @@
         about_text += '<p>Comments? Bugs? Requests?<br/>'
         about_text += r'<a href=mailto:help@sasview.org>Send us a ticket</a></p><br/>'
-        about_text += r'<a href=https://github.com/SasView/sasview/releases>Get the latest version</a></p><br/>'
+        about_text += r'<a href=' + str(LocalConfig.__download_page__)\
+                   + 'Get the latest version</a></p><br/>'
         self.lblAbout.setText(about_text)
 
@@ -52,11 +43,18 @@
         Add actions to the logo push buttons
         """
-        self.cmdLinkUT.clicked.connect(functools.partial(GuiUtils.openLink, LocalConfig._inst_url))
-        self.cmdLinkUMD.clicked.connect(functools.partial(GuiUtils.openLink, LocalConfig._umd_url))
-        self.cmdLinkNIST.clicked.connect(functools.partial(GuiUtils.openLink, LocalConfig._nist_url))
-        self.cmdLinkSNS.clicked.connect(functools.partial(GuiUtils.openLink, LocalConfig._sns_url))
-        self.cmdLinkISIS.clicked.connect(functools.partial(GuiUtils.openLink, LocalConfig._isis_url))
-        self.cmdLinkESS.clicked.connect(functools.partial(GuiUtils.openLink, LocalConfig._ess_url))
-        self.cmdLinkILL.clicked.connect(functools.partial(GuiUtils.openLink, LocalConfig._ill_url))
+        self.cmdLinkUT.clicked.connect(functools.partial(
+            GuiUtils.openLink, LocalConfig._inst_url))
+        self.cmdLinkUMD.clicked.connect(functools.partial(
+            GuiUtils.openLink, LocalConfig._umd_url))
+        self.cmdLinkNIST.clicked.connect(functools.partial(
+            GuiUtils.openLink, LocalConfig._nist_url))
+        self.cmdLinkSNS.clicked.connect(functools.partial(
+            GuiUtils.openLink, LocalConfig._sns_url))
+        self.cmdLinkISIS.clicked.connect(functools.partial(
+            GuiUtils.openLink, LocalConfig._isis_url))
+        self.cmdLinkESS.clicked.connect(functools.partial(
+            GuiUtils.openLink, LocalConfig._ess_url))
+        self.cmdLinkILL.clicked.connect(functools.partial(
+            GuiUtils.openLink, LocalConfig._ill_url))
 
         self.cmdOK.clicked.connect(self.close)
Index: src/sas/qtgui/DataExplorer.py
===================================================================
--- src/sas/qtgui/DataExplorer.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/DataExplorer.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -7,4 +7,6 @@
 from PyQt4 import QtGui
 from PyQt4 import QtWebKit
+from PyQt4.Qt import QMutex
+
 from twisted.internet import threads
 
@@ -38,4 +40,7 @@
         self.loader = Loader()
         self.manager = DataManager()
+
+        # Be careful with twisted threads.
+        self.mutex = QMutex()
 
         # Connect the buttons
@@ -46,4 +51,9 @@
         self.cmdSendTo.clicked.connect(self.sendData)
         self.cmdNew.clicked.connect(self.newPlot)
+        self.cmdHelp.clicked.connect(self.displayHelp)
+        self.cmdHelp_2.clicked.connect(self.displayHelp)
+
+        # Display HTML content
+        self._helpView = QtWebKit.QWebView()
 
         # Connect the comboboxes
@@ -56,12 +66,22 @@
 
         # Proxy model for showing a subset of Data1D/Data2D content
-        self.proxy = QtGui.QSortFilterProxyModel(self)
-        self.proxy.setSourceModel(self.model)
+        self.data_proxy = QtGui.QSortFilterProxyModel(self)
+        self.data_proxy.setSourceModel(self.model)
+
+        # Don't show "empty" rows with data objects
+        self.data_proxy.setFilterRegExp(r"[^()]")
 
         # The Data viewer is QTreeView showing the proxy model
-        self.treeView.setModel(self.proxy)
+        self.treeView.setModel(self.data_proxy)
+
+        # Proxy model for showing a subset of Theory content
+        self.theory_proxy = QtGui.QSortFilterProxyModel(self)
+        self.theory_proxy.setSourceModel(self.theory_model)
+
+        # Don't show "empty" rows with data objects
+        self.theory_proxy.setFilterRegExp(r"[^()]")
 
         # Theory model view
-        #self.freezeView.setModel(self.theory_model)
+        self.freezeView.setModel(self.theory_proxy)
 
     def closeEvent(self, event):
@@ -70,4 +90,12 @@
         """
         event.ignore()
+
+    def displayHelp(self):
+        """
+        Show the "Loading data" section of help
+        """
+        _TreeLocation = "html/user/sasgui/guiframe/data_explorer_help.html"
+        self._helpView.load(QtCore.QUrl(_TreeLocation))
+        self._helpView.show()
 
     def loadFromURL(self, url):
@@ -81,5 +109,5 @@
         """
         Called when the "Load" button pressed.
-        Opens the Qt "Open File..." dialog 
+        Opens the Qt "Open File..." dialog
         """
         path_str = self.chooseFiles()
@@ -91,18 +119,19 @@
         """
         Called when the "File/Load Folder" menu item chosen.
-        Opens the Qt "Open Folder..." dialog 
-        """
-        dir = QtGui.QFileDialog.getExistingDirectory(self, "Choose a directory", "",
+        Opens the Qt "Open Folder..." dialog
+        """
+        folder = QtGui.QFileDialog.getExistingDirectory(self, "Choose a directory", "",
               QtGui.QFileDialog.ShowDirsOnly | QtGui.QFileDialog.DontUseNativeDialog)
-        if dir is None:
-            return
-
-        dir = str(dir)
-
-        if not os.path.isdir(dir):
+        if folder is None:
+            return
+
+        folder = str(folder)
+
+        if not os.path.isdir(folder):
             return
 
         # get content of dir into a list
-        path_str = [os.path.join(os.path.abspath(dir), filename) for filename in os.listdir(dir)]
+        path_str = [os.path.join(os.path.abspath(folder), filename)
+                        for filename in os.listdir(folder)]
 
         self.loadFromURL(path_str)
@@ -211,8 +240,8 @@
         and copying it to a separate top-level item.
         """
-        import copy
         # Figure out which _inner_ rows are checked
         # Use 'while' so the row count is forced at every iteration
         outer_index = -1
+        theories_copied = 0
         while outer_index < self.model.rowCount():
             outer_index += 1
@@ -220,18 +249,36 @@
             if not outer_item:
                 continue
-            for inner_index in xrange(outer_item.rowCount()):
+            for inner_index in xrange(outer_item.rowCount()): # Should be just two rows: data and Info
                 subitem = outer_item.child(inner_index)
                 if subitem and subitem.isCheckable() and subitem.checkState() == QtCore.Qt.Checked:
-                    # Update the main model
-                    new_item = subitem.takeRow(inner_index)
-                    #new_item = QtGui.QStandardItem(subitem)
-                    #new_item = subitem.clone()
-                    #new_item = QtGui.QStandardItem()
-                    #new_item = copy.deepcopy(subitem)
-                    #super(new_item, self).__init__()   
-                    self.model.insertRow(0, new_item)
-                    outer_index += 1
-
-        self.model.reset()
+                    theories_copied += 1
+                    new_item = self.recursivelyCloneItem(subitem)
+                    self.theory_model.appendRow(new_item)
+            self.theory_model.reset()
+
+        freeze_msg = ""
+        if theories_copied == 0:
+            return
+        elif theories_copied == 1:
+            freeze_msg = "1 theory sent to Theory tab"
+        elif theories_copied > 1:
+            freeze_msg = "%i theories sent to Theory tab" % theories_copied
+        else:
+            freeze_msg = "Unexpected number of theories copied: %i" % theories_copied
+            raise AttributeError, freeze_msg
+        self.communicator.statusBarUpdateSignal.emit(freeze_msg)
+        # Actively switch tabs
+        self.setCurrentIndex(1)
+
+    def recursivelyCloneItem(self, item):
+        """
+        Clone QStandardItem() object
+        """
+        new_item = item.clone()
+        # clone doesn't do deepcopy :(
+        for child_index in xrange(item.rowCount()):
+            child_item = self.recursivelyCloneItem(item.child(child_index))
+            new_item.setChild(child_index, child_item)
+        return new_item
 
     def newPlot(self):
@@ -266,5 +313,6 @@
             return
 
-        if type(paths) == QtCore.QStringList:
+        #if type(paths) == QtCore.QStringList:
+        if isinstance(paths, QtCore.QStringList):
             paths = [str(f) for f in paths]
 
@@ -276,6 +324,6 @@
     def readData(self, path):
         """
-        verbatim copy/paste from
-            sasgui\guiframe\local_perspectives\data_loader\data_loader.py
+        verbatim copy-paste from
+           sasgui.guiframe.local_perspectives.data_loader.data_loader.py
         slightly modified for clarity
         """
@@ -286,7 +334,6 @@
         data_error = False
         error_message = ""
-        
+
         for p_file in path:
-            info = "info"
             basename = os.path.basename(p_file)
             _, extension = os.path.splitext(basename)
@@ -315,12 +362,16 @@
 
                 for item in output_objects:
-                    # cast sascalc.dataloader.data_info.Data1D into sasgui.guiframe.dataFitting.Data1D
+                    # cast sascalc.dataloader.data_info.Data1D into
+                    # sasgui.guiframe.dataFitting.Data1D
                     # TODO : Fix it
                     new_data = self.manager.create_gui_data(item, p_file)
                     output[new_data.id] = new_data
+
+                    # Model update should be protected
+                    self.mutex.lock()
                     self.updateModel(new_data, p_file)
                     self.model.reset()
-
                     QtGui.qApp.processEvents()
+                    self.mutex.unlock()
 
                     if hasattr(item, 'errors'):
@@ -354,7 +405,6 @@
                     error_message += "%s\n" % str(p_file)
                 info = "error"
-        
+
         if any_error or error_message:
-            # self.loadUpdate(output=output, message=error_message, info=info)
             self.communicator.statusBarUpdateSignal.emit(error_message)
 
@@ -362,4 +412,5 @@
             message = "Loading Data Complete! "
         message += log_msg
+
         return output, message
 
@@ -470,10 +521,7 @@
         Post message to status bar and update the data manager
         """
-        # Don't show "empty" rows with data objects
-        self.proxy.setFilterRegExp(r"[^()]")
-
         # Reset the model so the view gets updated.
         self.model.reset()
-        assert type(output)== tuple
+        assert type(output) == tuple
 
         output_data = output[0]
@@ -486,9 +534,10 @@
     def updateModel(self, data, p_file):
         """
+        Add data and Info fields to the model item
         """
         # Structure of the model
         # checkbox + basename
+        #     |-------> Data.D object
         #     |-------> Info
-        #                 |----> Data.D object
         #                 |----> Title:
         #                 |----> Run:
@@ -519,5 +568,5 @@
         # New row in the model
         self.model.appendRow(checkbox_item)
-        
+
     def updateModelFromPerspective(self, model_item):
         """
@@ -537,5 +586,5 @@
         # Pass acting as a debugger anchor
         pass
-       
+
 
 if __name__ == "__main__":
Index: src/sas/qtgui/DroppableDataLoadWidget.py
===================================================================
--- src/sas/qtgui/DroppableDataLoadWidget.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/DroppableDataLoadWidget.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -3,6 +3,5 @@
 
 # UI
-from UI.TabbedFileLoadUI import DataLoadWidget
-# from UI.Test2DataExplorerUI import DataLoadWidget
+from UI.DataExplorerUI import DataLoadWidget
 
 class DroppableDataLoadWidget(DataLoadWidget):
@@ -23,5 +22,5 @@
         """
         # Analyze mime data
-        if event.mimeData().hasUrls():
+        if event.mimeData().hasUrls() and self.currentIndex() == 0:
             return True
         else:
Index: src/sas/qtgui/GuiManager.py
===================================================================
--- src/sas/qtgui/GuiManager.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/GuiManager.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -29,10 +29,10 @@
     Main SasView window functionality
     """
-    HELP_DIRECTORY_LOCATION="html"
+    HELP_DIRECTORY_LOCATION = "html"
 
     def __init__(self, mainWindow=None, reactor=None, parent=None):
         """
-        
-        """
+        """
+
         self._workspace = mainWindow
         self._parent = parent
@@ -52,9 +52,8 @@
 
         # Populate menus with dynamic data
-        # 
+        #
         # Analysis/Perspectives - potentially
         # Window/current windows
         #
-
         # Widgets
         #
@@ -62,5 +61,6 @@
         self.filesWidget = DataExplorerWindow(parent, self)
         #flags = (QtCore.Qt.Window | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinimizeButtonHint)
-        flags = (QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint | QtCore.Qt.WindowMinMaxButtonsHint )
+        flags = (QtCore.Qt.CustomizeWindowHint | QtCore.Qt.WindowTitleHint |
+                 QtCore.Qt.WindowMinMaxButtonsHint)
 
         self.dockedFilesWidget = QtGui.QDockWidget("Data explorer", self._workspace, flags=flags)
@@ -95,5 +95,5 @@
         # Default perspective
         self._current_perspective = self.invariantWidget
-     
+
     def fileRead(self, data):
         """
@@ -101,5 +101,5 @@
         """
         pass
-    
+
     def updatePerspective(self, data):
         """
@@ -111,6 +111,6 @@
             msg = "No perspective is currently active."
             logging.info(msg)
-        
-            
+
+
     def communicator(self):
         """
@@ -143,33 +143,4 @@
         """
         return self._data_manager.create_gui_data(item, p_file)
-
-    def addData(self, data_list):
-        """
-        receive a dictionary of data from loader
-        store them its data manager if possible
-        send to data the current active perspective if the data panel
-        is not active.
-        :param data_list: dictionary of data's ID and value Data
-        """
-        #Store data into manager
-        #self._data_manager.add_data(data_list)
-
-        # set data in the data panel
-        #if self._data_panel is not None:
-        #    data_state = self._data_manager.get_data_state(data_list.keys())
-        #    self._data_panel.load_data_list(data_state)
-
-        #if the data panel is shown wait for the user to press a button
-        #to send data to the current perspective. if the panel is not
-        #show  automatically send the data to the current perspective
-        #style = self.__gui_style & GUIFRAME.MANAGER_ON
-        #if style == GUIFRAME.MANAGER_ON:
-        #    #wait for button press from the data panel to set_data
-        #    if self._data_panel is not None:
-        #        self._data_panel.frame.Show(True)
-        #else:
-            #automatically send that to the current perspective
-        #self.setData(data_id=data_list.keys())
-        pass
 
     def setData(self, data):
@@ -190,9 +161,9 @@
         quit_msg = "Are you sure you want to exit the application?"
         reply = QtGui.QMessageBox.question(
-                        self._parent,
-                        'Warning',
-                        quit_msg,
-                        QtGui.QMessageBox.Yes,
-                        QtGui.QMessageBox.No)
+            self._parent,
+            'Warning',
+            quit_msg,
+            QtGui.QMessageBox.Yes,
+            QtGui.QMessageBox.No)
 
         if reply == QtGui.QMessageBox.No:
@@ -201,5 +172,4 @@
         # Exit if yes
         reactor.callFromThread(reactor.stop)
-        sys.exit()
 
     def checkUpdate(self):
@@ -221,6 +191,6 @@
             except:
                 logging.info("Failed to connect to www.sasview.org")
-        self.processVersion(version_info)  
-  
+        self.processVersion(version_info)
+
     def processVersion(self, version_info):
         """
@@ -365,5 +335,5 @@
         """
         print("actionSave_Analysis TRIGGERED")
-       
+
         pass
 
Index: src/sas/qtgui/GuiUtils.py
===================================================================
--- src/sas/qtgui/GuiUtils.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/GuiUtils.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -5,8 +5,6 @@
 import os
 import sys
-import time
 import imp
 import warnings
-import re
 import webbrowser
 import urlparse
@@ -14,5 +12,4 @@
 warnings.simplefilter("ignore")
 import logging
-import traceback
 
 from PyQt4 import QtCore
@@ -74,5 +71,5 @@
     return userdir
 
-def _find_local_config(file, path):
+def _find_local_config(confg_file, path):
     """
         Find configuration file for the current application
@@ -81,12 +78,12 @@
     fObj = None
     try:
-        fObj, path_config, descr = imp.find_module(file, [path])
-        config_module = imp.load_module(file, fObj, path_config, descr)
+        fObj, path_config, descr = imp.find_module(confg_file, [path])
+        config_module = imp.load_module(confg_file, fObj, path_config, descr)
     except:
-        logging.error("Error loading %s/%s: %s" % (path, file, sys.exc_value))
+        logging.error("Error loading %s/%s: %s" % (path, confg_file, sys.exc_value))
     finally:
         if fObj is not None:
             fObj.close()
-    logging.info("GuiManager loaded %s/%s" % (path, file))
+    logging.info("GuiManager loaded %s/%s" % (path, confg_file))
     return config_module
 
@@ -238,5 +235,5 @@
     else:
         # otherwise just add a naked item
-        info_item = QtGui.QStandardItem("Info")        
+        info_item = QtGui.QStandardItem("Info")
 
     # Add the actual Data1D/Data2D object
@@ -274,5 +271,5 @@
                 # TODO: assure item type is correct (either data1/2D or Plotter)
                 plot_data.append(item_2.child(0).data().toPyObject())
-  
+
     return plot_data
 
@@ -286,17 +283,17 @@
     info_item = QtGui.QStandardItem("Info")
 
-    title_item   = QtGui.QStandardItem("Title: "      + data.title)
+    title_item = QtGui.QStandardItem("Title: " + data.title)
     info_item.appendRow(title_item)
-    run_item     = QtGui.QStandardItem("Run: "        + str(data.run))
+    run_item = QtGui.QStandardItem("Run: " + str(data.run))
     info_item.appendRow(run_item)
-    type_item    = QtGui.QStandardItem("Type: "       + str(data.__class__.__name__))
+    type_item = QtGui.QStandardItem("Type: " + str(data.__class__.__name__))
     info_item.appendRow(type_item)
 
     if data.path:
-        path_item    = QtGui.QStandardItem("Path: "       + data.path)
+        path_item = QtGui.QStandardItem("Path: " + data.path)
         info_item.appendRow(path_item)
 
     if data.instrument:
-        instr_item   = QtGui.QStandardItem("Instrument: " + data.instrument)
+        instr_item = QtGui.QStandardItem("Instrument: " + data.instrument)
         info_item.appendRow(instr_item)
 
Index: src/sas/qtgui/MainWindow.py
===================================================================
--- src/sas/qtgui/MainWindow.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/MainWindow.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -25,4 +25,5 @@
     def closeEvent(self, event):
         self.guiManager.quitApplication()
+
         
 def SplashScreen():
Index: c/sas/qtgui/UI/DataExplorer.py
===================================================================
--- src/sas/qtgui/UI/DataExplorer.py	(revision f721030e66e61dc6279aa8e024da03b25f8e0d42)
+++ 	(revision )
@@ -1,148 +1,0 @@
-# -*- coding: utf-8 -*-
-
-# Form implementation generated from reading ui file 'DataExplorer.ui'
-#
-# Created by: PyQt4 UI code generator 4.11.4
-#
-# WARNING! All changes made in this file will be lost!
-
-from PyQt4 import QtCore, QtGui
-
-try:
-    _fromUtf8 = QtCore.QString.fromUtf8
-except AttributeError:
-    def _fromUtf8(s):
-        return s
-
-try:
-    _encoding = QtGui.QApplication.UnicodeUTF8
-    def _translate(context, text, disambig):
-        return QtGui.QApplication.translate(context, text, disambig, _encoding)
-except AttributeError:
-    def _translate(context, text, disambig):
-        return QtGui.QApplication.translate(context, text, disambig)
-
-class Ui_DataExplorerUI(object):
-    def setupUi(self, DataExplorerUI):
-        DataExplorerUI.setObjectName(_fromUtf8("DataExplorerUI"))
-        DataExplorerUI.resize(488, 589)
-        self.gridLayout_4 = QtGui.QGridLayout(DataExplorerUI)
-        self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
-        self.label = QtGui.QLabel(DataExplorerUI)
-        self.label.setObjectName(_fromUtf8("label"))
-        self.gridLayout_4.addWidget(self.label, 0, 0, 1, 1)
-        self.comboBox = QtGui.QComboBox(DataExplorerUI)
-        self.comboBox.setObjectName(_fromUtf8("comboBox"))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.comboBox.addItem(_fromUtf8(""))
-        self.gridLayout_4.addWidget(self.comboBox, 1, 0, 1, 1)
-        spacerItem = QtGui.QSpacerItem(278, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
-        self.gridLayout_4.addItem(spacerItem, 1, 1, 1, 1)
-        self.groupBox = QtGui.QGroupBox(DataExplorerUI)
-        self.groupBox.setObjectName(_fromUtf8("groupBox"))
-        self.gridLayout = QtGui.QGridLayout(self.groupBox)
-        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
-        self.treeView = QtGui.QTreeView(self.groupBox)
-        self.treeView.setObjectName(_fromUtf8("treeView"))
-        self.gridLayout.addWidget(self.treeView, 0, 0, 1, 1)
-        self.verticalLayout = QtGui.QVBoxLayout()
-        self.verticalLayout.setObjectName(_fromUtf8("verticalLayout"))
-        self.pushButton = QtGui.QPushButton(self.groupBox)
-        self.pushButton.setObjectName(_fromUtf8("pushButton"))
-        self.verticalLayout.addWidget(self.pushButton)
-        self.pushButton_2 = QtGui.QPushButton(self.groupBox)
-        self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
-        self.verticalLayout.addWidget(self.pushButton_2)
-        spacerItem1 = QtGui.QSpacerItem(20, 141, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
-        self.verticalLayout.addItem(spacerItem1)
-        self.gridLayout.addLayout(self.verticalLayout, 0, 1, 1, 1)
-        self.horizontalLayout = QtGui.QHBoxLayout()
-        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
-        self.pushButton_6 = QtGui.QPushButton(self.groupBox)
-        self.pushButton_6.setObjectName(_fromUtf8("pushButton_6"))
-        self.horizontalLayout.addWidget(self.pushButton_6)
-        self.comboBox_3 = QtGui.QComboBox(self.groupBox)
-        self.comboBox_3.setObjectName(_fromUtf8("comboBox_3"))
-        self.comboBox_3.addItem(_fromUtf8(""))
-        self.comboBox_3.addItem(_fromUtf8(""))
-        self.comboBox_3.addItem(_fromUtf8(""))
-        self.horizontalLayout.addWidget(self.comboBox_3)
-        self.checkBox = QtGui.QCheckBox(self.groupBox)
-        self.checkBox.setObjectName(_fromUtf8("checkBox"))
-        self.horizontalLayout.addWidget(self.checkBox)
-        spacerItem2 = QtGui.QSpacerItem(197, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
-        self.horizontalLayout.addItem(spacerItem2)
-        self.gridLayout.addLayout(self.horizontalLayout, 1, 0, 1, 2)
-        self.gridLayout_4.addWidget(self.groupBox, 2, 0, 1, 2)
-        self.groupBox_2 = QtGui.QGroupBox(DataExplorerUI)
-        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
-        self.gridLayout_2 = QtGui.QGridLayout(self.groupBox_2)
-        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
-        self.listView = QtGui.QListView(self.groupBox_2)
-        self.listView.setObjectName(_fromUtf8("listView"))
-        self.gridLayout_2.addWidget(self.listView, 0, 0, 2, 1)
-        self.pushButton_3 = QtGui.QPushButton(self.groupBox_2)
-        self.pushButton_3.setObjectName(_fromUtf8("pushButton_3"))
-        self.gridLayout_2.addWidget(self.pushButton_3, 0, 1, 1, 1)
-        spacerItem3 = QtGui.QSpacerItem(20, 198, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
-        self.gridLayout_2.addItem(spacerItem3, 1, 1, 1, 1)
-        self.gridLayout_4.addWidget(self.groupBox_2, 3, 0, 1, 2)
-        self.groupBox_3 = QtGui.QGroupBox(DataExplorerUI)
-        self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
-        self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_3)
-        self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
-        self.pushButton_4 = QtGui.QPushButton(self.groupBox_3)
-        self.pushButton_4.setObjectName(_fromUtf8("pushButton_4"))
-        self.gridLayout_3.addWidget(self.pushButton_4, 0, 0, 1, 1)
-        self.pushButton_5 = QtGui.QPushButton(self.groupBox_3)
-        self.pushButton_5.setObjectName(_fromUtf8("pushButton_5"))
-        self.gridLayout_3.addWidget(self.pushButton_5, 1, 0, 1, 1)
-        self.comboBox_2 = QtGui.QComboBox(self.groupBox_3)
-        self.comboBox_2.setObjectName(_fromUtf8("comboBox_2"))
-        self.comboBox_2.addItem(_fromUtf8(""))
-        self.gridLayout_3.addWidget(self.comboBox_2, 1, 1, 1, 1)
-        self.gridLayout_4.addWidget(self.groupBox_3, 4, 0, 1, 1)
-        self.groupBox_3.raise_()
-        self.groupBox_2.raise_()
-        self.groupBox.raise_()
-        self.comboBox.raise_()
-        self.label.raise_()
-
-        self.retranslateUi(DataExplorerUI)
-        QtCore.QMetaObject.connectSlotsByName(DataExplorerUI)
-
-    def retranslateUi(self, DataExplorerUI):
-        DataExplorerUI.setWindowTitle(_translate("DataExplorerUI", "Dialog", None))
-        self.label.setText(_translate("DataExplorerUI", "Selection Options", None))
-        self.comboBox.setItemText(0, _translate("DataExplorerUI", "Select all", None))
-        self.comboBox.setItemText(1, _translate("DataExplorerUI", "Unselect all", None))
-        self.comboBox.setItemText(2, _translate("DataExplorerUI", "Select all 1D", None))
-        self.comboBox.setItemText(3, _translate("DataExplorerUI", "Unselect all 1D", None))
-        self.comboBox.setItemText(4, _translate("DataExplorerUI", "Select all 2D", None))
-        self.comboBox.setItemText(5, _translate("DataExplorerUI", "Unselect all 2D", None))
-        self.groupBox.setTitle(_translate("DataExplorerUI", "Data", None))
-        self.pushButton.setText(_translate("DataExplorerUI", "Load", None))
-        self.pushButton_2.setText(_translate("DataExplorerUI", "Delete", None))
-        self.pushButton_6.setText(_translate("DataExplorerUI", "Send to", None))
-        self.comboBox_3.setItemText(0, _translate("DataExplorerUI", "Fitting", None))
-        self.comboBox_3.setItemText(1, _translate("DataExplorerUI", "Pr inversion", None))
-        self.comboBox_3.setItemText(2, _translate("DataExplorerUI", "Invariant", None))
-        self.checkBox.setText(_translate("DataExplorerUI", "Batch mode", None))
-        self.groupBox_2.setTitle(_translate("DataExplorerUI", "Theory", None))
-        self.pushButton_3.setText(_translate("DataExplorerUI", "Freeze", None))
-        self.groupBox_3.setTitle(_translate("DataExplorerUI", "Plot", None))
-        self.pushButton_4.setText(_translate("DataExplorerUI", "New", None))
-        self.pushButton_5.setText(_translate("DataExplorerUI", "Append to", None))
-        self.comboBox_2.setItemText(0, _translate("DataExplorerUI", "Graph1", None))
-
-
-class DataExplorerUI(QtGui.QDialog, Ui_DataExplorerUI):
-    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
-        QtGui.QDialog.__init__(self, parent, f)
-
-        self.setupUi(self)
-
Index: src/sas/qtgui/UI/DataExplorerUI.py
===================================================================
--- src/sas/qtgui/UI/DataExplorerUI.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
+++ src/sas/qtgui/UI/DataExplorerUI.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -0,0 +1,237 @@
+# -*- coding: utf-8 -*-
+
+# Form implementation generated from reading ui file 'DataExplorerUI.ui'
+#
+# Created by: PyQt4 UI code generator 4.11.4
+#
+# WARNING! All changes made in this file will be lost!
+
+from PyQt4 import QtCore, QtGui
+
+try:
+    _fromUtf8 = QtCore.QString.fromUtf8
+except AttributeError:
+    def _fromUtf8(s):
+        return s
+
+try:
+    _encoding = QtGui.QApplication.UnicodeUTF8
+    def _translate(context, text, disambig):
+        return QtGui.QApplication.translate(context, text, disambig, _encoding)
+except AttributeError:
+    def _translate(context, text, disambig):
+        return QtGui.QApplication.translate(context, text, disambig)
+
+class Ui_DataLoadWidget(object):
+    def setupUi(self, DataLoadWidget):
+        DataLoadWidget.setObjectName(_fromUtf8("DataLoadWidget"))
+        DataLoadWidget.resize(517, 693)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(DataLoadWidget.sizePolicy().hasHeightForWidth())
+        DataLoadWidget.setSizePolicy(sizePolicy)
+        icon = QtGui.QIcon()
+        icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/res/ball.ico")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        DataLoadWidget.setWindowIcon(icon)
+        self.dataTab = QtGui.QWidget()
+        self.dataTab.setObjectName(_fromUtf8("dataTab"))
+        self.gridLayout_6 = QtGui.QGridLayout(self.dataTab)
+        self.gridLayout_6.setObjectName(_fromUtf8("gridLayout_6"))
+        self.groupBox = QtGui.QGroupBox(self.dataTab)
+        self.groupBox.setObjectName(_fromUtf8("groupBox"))
+        self.gridLayout = QtGui.QGridLayout(self.groupBox)
+        self.gridLayout.setObjectName(_fromUtf8("gridLayout"))
+        self.horizontalLayout_2 = QtGui.QHBoxLayout()
+        self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2"))
+        self.cmdLoad = QtGui.QPushButton(self.groupBox)
+        self.cmdLoad.setObjectName(_fromUtf8("cmdLoad"))
+        self.horizontalLayout_2.addWidget(self.cmdLoad)
+        self.cbSelect = QtGui.QComboBox(self.groupBox)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.cbSelect.sizePolicy().hasHeightForWidth())
+        self.cbSelect.setSizePolicy(sizePolicy)
+        self.cbSelect.setObjectName(_fromUtf8("cbSelect"))
+        self.cbSelect.addItem(_fromUtf8(""))
+        self.cbSelect.addItem(_fromUtf8(""))
+        self.cbSelect.addItem(_fromUtf8(""))
+        self.cbSelect.addItem(_fromUtf8(""))
+        self.cbSelect.addItem(_fromUtf8(""))
+        self.cbSelect.addItem(_fromUtf8(""))
+        self.horizontalLayout_2.addWidget(self.cbSelect)
+        spacerItem = QtGui.QSpacerItem(128, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout_2.addItem(spacerItem)
+        self.cmdDeleteData = QtGui.QPushButton(self.groupBox)
+        self.cmdDeleteData.setObjectName(_fromUtf8("cmdDeleteData"))
+        self.horizontalLayout_2.addWidget(self.cmdDeleteData)
+        self.gridLayout.addLayout(self.horizontalLayout_2, 0, 0, 1, 1)
+        self.treeView = QtGui.QTreeView(self.groupBox)
+        self.treeView.setAcceptDrops(True)
+        self.treeView.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
+        self.treeView.setDragEnabled(True)
+        self.treeView.setDragDropOverwriteMode(True)
+        self.treeView.setDragDropMode(QtGui.QAbstractItemView.DropOnly)
+        self.treeView.setDefaultDropAction(QtCore.Qt.CopyAction)
+        self.treeView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
+        self.treeView.setObjectName(_fromUtf8("treeView"))
+        self.treeView.header().setVisible(False)
+        self.gridLayout.addWidget(self.treeView, 1, 0, 1, 1)
+        self.horizontalLayout = QtGui.QHBoxLayout()
+        self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout"))
+        self.cmdFreeze = QtGui.QPushButton(self.groupBox)
+        self.cmdFreeze.setObjectName(_fromUtf8("cmdFreeze"))
+        self.horizontalLayout.addWidget(self.cmdFreeze)
+        spacerItem1 = QtGui.QSpacerItem(58, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout.addItem(spacerItem1)
+        self.cmdSendTo = QtGui.QToolButton(self.groupBox)
+        icon1 = QtGui.QIcon()
+        icon1.addPixmap(QtGui.QPixmap(_fromUtf8(":/res/file_send-128.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off)
+        self.cmdSendTo.setIcon(icon1)
+        self.cmdSendTo.setIconSize(QtCore.QSize(32, 32))
+        self.cmdSendTo.setObjectName(_fromUtf8("cmdSendTo"))
+        self.horizontalLayout.addWidget(self.cmdSendTo)
+        self.cbFitting = QtGui.QComboBox(self.groupBox)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.cbFitting.sizePolicy().hasHeightForWidth())
+        self.cbFitting.setSizePolicy(sizePolicy)
+        self.cbFitting.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
+        self.cbFitting.setObjectName(_fromUtf8("cbFitting"))
+        self.cbFitting.addItem(_fromUtf8(""))
+        self.cbFitting.addItem(_fromUtf8(""))
+        self.cbFitting.addItem(_fromUtf8(""))
+        self.horizontalLayout.addWidget(self.cbFitting)
+        self.chkBatch = QtGui.QCheckBox(self.groupBox)
+        self.chkBatch.setObjectName(_fromUtf8("chkBatch"))
+        self.horizontalLayout.addWidget(self.chkBatch)
+        self.gridLayout.addLayout(self.horizontalLayout, 2, 0, 1, 1)
+        self.gridLayout_6.addWidget(self.groupBox, 0, 0, 1, 1)
+        self.gridLayout_2 = QtGui.QGridLayout()
+        self.gridLayout_2.setObjectName(_fromUtf8("gridLayout_2"))
+        self.groupBox_3 = QtGui.QGroupBox(self.dataTab)
+        self.groupBox_3.setObjectName(_fromUtf8("groupBox_3"))
+        self.gridLayout_3 = QtGui.QGridLayout(self.groupBox_3)
+        self.gridLayout_3.setObjectName(_fromUtf8("gridLayout_3"))
+        self.cmdNew = QtGui.QPushButton(self.groupBox_3)
+        self.cmdNew.setObjectName(_fromUtf8("cmdNew"))
+        self.gridLayout_3.addWidget(self.cmdNew, 0, 0, 1, 1)
+        self.cmdAppend = QtGui.QPushButton(self.groupBox_3)
+        self.cmdAppend.setObjectName(_fromUtf8("cmdAppend"))
+        self.gridLayout_3.addWidget(self.cmdAppend, 1, 0, 1, 1)
+        self.cbgraph = QtGui.QComboBox(self.groupBox_3)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.cbgraph.sizePolicy().hasHeightForWidth())
+        self.cbgraph.setSizePolicy(sizePolicy)
+        self.cbgraph.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
+        self.cbgraph.setObjectName(_fromUtf8("cbgraph"))
+        self.cbgraph.addItem(_fromUtf8(""))
+        self.gridLayout_3.addWidget(self.cbgraph, 1, 1, 1, 1)
+        self.gridLayout_2.addWidget(self.groupBox_3, 0, 0, 1, 1)
+        spacerItem2 = QtGui.QSpacerItem(108, 111, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.gridLayout_2.addItem(spacerItem2, 0, 1, 1, 1)
+        self.cmdHelp = QtGui.QPushButton(self.dataTab)
+        self.cmdHelp.setObjectName(_fromUtf8("cmdHelp"))
+        self.gridLayout_2.addWidget(self.cmdHelp, 0, 2, 1, 1, QtCore.Qt.AlignBottom)
+        self.gridLayout_6.addLayout(self.gridLayout_2, 1, 0, 1, 1)
+        DataLoadWidget.addTab(self.dataTab, _fromUtf8(""))
+        self.theoryTab = QtGui.QWidget()
+        self.theoryTab.setObjectName(_fromUtf8("theoryTab"))
+        self.gridLayout_8 = QtGui.QGridLayout(self.theoryTab)
+        self.gridLayout_8.setObjectName(_fromUtf8("gridLayout_8"))
+        self.groupBox_2 = QtGui.QGroupBox(self.theoryTab)
+        self.groupBox_2.setObjectName(_fromUtf8("groupBox_2"))
+        self.gridLayout_4 = QtGui.QGridLayout(self.groupBox_2)
+        self.gridLayout_4.setObjectName(_fromUtf8("gridLayout_4"))
+        self.horizontalLayout_3 = QtGui.QHBoxLayout()
+        self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3"))
+        spacerItem3 = QtGui.QSpacerItem(353, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.horizontalLayout_3.addItem(spacerItem3)
+        self.cmdDeleteTheory = QtGui.QPushButton(self.groupBox_2)
+        self.cmdDeleteTheory.setObjectName(_fromUtf8("cmdDeleteTheory"))
+        self.horizontalLayout_3.addWidget(self.cmdDeleteTheory)
+        self.gridLayout_4.addLayout(self.horizontalLayout_3, 0, 0, 1, 1)
+        self.freezeView = QtGui.QTreeView(self.groupBox_2)
+        self.freezeView.setObjectName(_fromUtf8("freezeView"))
+        self.freezeView.header().setVisible(False)
+        self.gridLayout_4.addWidget(self.freezeView, 1, 0, 1, 1)
+        self.gridLayout_8.addWidget(self.groupBox_2, 0, 0, 1, 1)
+        self.gridLayout_5 = QtGui.QGridLayout()
+        self.gridLayout_5.setObjectName(_fromUtf8("gridLayout_5"))
+        self.groupBox_4 = QtGui.QGroupBox(self.theoryTab)
+        self.groupBox_4.setObjectName(_fromUtf8("groupBox_4"))
+        self.gridLayout_7 = QtGui.QGridLayout(self.groupBox_4)
+        self.gridLayout_7.setObjectName(_fromUtf8("gridLayout_7"))
+        self.cmdNew_2 = QtGui.QPushButton(self.groupBox_4)
+        self.cmdNew_2.setObjectName(_fromUtf8("cmdNew_2"))
+        self.gridLayout_7.addWidget(self.cmdNew_2, 0, 0, 1, 1)
+        self.cmdAppend_2 = QtGui.QPushButton(self.groupBox_4)
+        self.cmdAppend_2.setObjectName(_fromUtf8("cmdAppend_2"))
+        self.gridLayout_7.addWidget(self.cmdAppend_2, 1, 0, 1, 1)
+        self.cbgraph_2 = QtGui.QComboBox(self.groupBox_4)
+        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed)
+        sizePolicy.setHorizontalStretch(0)
+        sizePolicy.setVerticalStretch(0)
+        sizePolicy.setHeightForWidth(self.cbgraph_2.sizePolicy().hasHeightForWidth())
+        self.cbgraph_2.setSizePolicy(sizePolicy)
+        self.cbgraph_2.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents)
+        self.cbgraph_2.setObjectName(_fromUtf8("cbgraph_2"))
+        self.cbgraph_2.addItem(_fromUtf8(""))
+        self.gridLayout_7.addWidget(self.cbgraph_2, 1, 1, 1, 1)
+        self.gridLayout_5.addWidget(self.groupBox_4, 0, 0, 1, 1)
+        spacerItem4 = QtGui.QSpacerItem(108, 111, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
+        self.gridLayout_5.addItem(spacerItem4, 0, 1, 1, 1)
+        self.cmdHelp_2 = QtGui.QPushButton(self.theoryTab)
+        self.cmdHelp_2.setObjectName(_fromUtf8("cmdHelp_2"))
+        self.gridLayout_5.addWidget(self.cmdHelp_2, 0, 2, 1, 1, QtCore.Qt.AlignBottom)
+        self.gridLayout_8.addLayout(self.gridLayout_5, 1, 0, 1, 1)
+        DataLoadWidget.addTab(self.theoryTab, _fromUtf8(""))
+
+        self.retranslateUi(DataLoadWidget)
+        DataLoadWidget.setCurrentIndex(0)
+        QtCore.QMetaObject.connectSlotsByName(DataLoadWidget)
+
+    def retranslateUi(self, DataLoadWidget):
+        DataLoadWidget.setWindowTitle(_translate("DataLoadWidget", "TabWidget", None))
+        self.groupBox.setTitle(_translate("DataLoadWidget", "Data", None))
+        self.cmdLoad.setText(_translate("DataLoadWidget", "Load", None))
+        self.cbSelect.setItemText(0, _translate("DataLoadWidget", "Select all", None))
+        self.cbSelect.setItemText(1, _translate("DataLoadWidget", "Unselect all", None))
+        self.cbSelect.setItemText(2, _translate("DataLoadWidget", "Select all 1D", None))
+        self.cbSelect.setItemText(3, _translate("DataLoadWidget", "Unselect all 1D", None))
+        self.cbSelect.setItemText(4, _translate("DataLoadWidget", "Select all 2D", None))
+        self.cbSelect.setItemText(5, _translate("DataLoadWidget", "Unselect all 2D", None))
+        self.cmdDeleteData.setText(_translate("DataLoadWidget", "Delete", None))
+        self.cmdFreeze.setText(_translate("DataLoadWidget", "Freeze Theory", None))
+        self.cmdSendTo.setText(_translate("DataLoadWidget", "...", None))
+        self.cbFitting.setItemText(0, _translate("DataLoadWidget", "Fitting", None))
+        self.cbFitting.setItemText(1, _translate("DataLoadWidget", "Pr inversion", None))
+        self.cbFitting.setItemText(2, _translate("DataLoadWidget", "Invariant", None))
+        self.chkBatch.setText(_translate("DataLoadWidget", "Batch mode", None))
+        self.groupBox_3.setTitle(_translate("DataLoadWidget", "Plot", None))
+        self.cmdNew.setText(_translate("DataLoadWidget", "Create New", None))
+        self.cmdAppend.setText(_translate("DataLoadWidget", "Append to", None))
+        self.cbgraph.setItemText(0, _translate("DataLoadWidget", "Graph1", None))
+        self.cmdHelp.setText(_translate("DataLoadWidget", "Help", None))
+        DataLoadWidget.setTabText(DataLoadWidget.indexOf(self.dataTab), _translate("DataLoadWidget", "Data", None))
+        self.groupBox_2.setTitle(_translate("DataLoadWidget", "Theory", None))
+        self.cmdDeleteTheory.setText(_translate("DataLoadWidget", "Delete", None))
+        self.groupBox_4.setTitle(_translate("DataLoadWidget", "Plot", None))
+        self.cmdNew_2.setText(_translate("DataLoadWidget", "Create New", None))
+        self.cmdAppend_2.setText(_translate("DataLoadWidget", "Append to", None))
+        self.cbgraph_2.setItemText(0, _translate("DataLoadWidget", "Graph1", None))
+        self.cmdHelp_2.setText(_translate("DataLoadWidget", "Help", None))
+        DataLoadWidget.setTabText(DataLoadWidget.indexOf(self.theoryTab), _translate("DataLoadWidget", "Theory", None))
+
+import main_resources_rc
+
+class DataLoadWidget(QtGui.QTabWidget, Ui_DataLoadWidget):
+    def __init__(self, parent=None, f=QtCore.Qt.WindowFlags()):
+        QtGui.QTabWidget.__init__(self, parent)
+
+        self.setupUi(self)
+
Index: src/sas/qtgui/UI/DataExplorerUI.ui
===================================================================
--- src/sas/qtgui/UI/DataExplorerUI.ui	(revision f721030e66e61dc6279aa8e024da03b25f8e0d42)
+++ src/sas/qtgui/UI/DataExplorerUI.ui	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -1,263 +1,402 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>DataExplorerUI</class>
- <widget class="QDialog" name="DataExplorerUI">
+ <class>DataLoadWidget</class>
+ <widget class="QTabWidget" name="DataLoadWidget">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>454</width>
-    <height>577</height>
+    <width>517</width>
+    <height>693</height>
    </rect>
   </property>
+  <property name="sizePolicy">
+   <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+    <horstretch>0</horstretch>
+    <verstretch>0</verstretch>
+   </sizepolicy>
+  </property>
   <property name="windowTitle">
-   <string>Dialog</string>
+   <string>TabWidget</string>
   </property>
-  <layout class="QGridLayout" name="gridLayout_4">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Selection Options</string>
-     </property>
-    </widget>
-   </item>
-   <item row="1" column="0">
-    <widget class="QComboBox" name="comboBox">
-     <item>
-      <property name="text">
-       <string>Select all</string>
+  <property name="windowIcon">
+   <iconset resource="main_resources.qrc">
+    <normaloff>:/res/ball.ico</normaloff>:/res/ball.ico</iconset>
+  </property>
+  <property name="currentIndex">
+   <number>0</number>
+  </property>
+  <widget class="QWidget" name="dataTab">
+   <attribute name="title">
+    <string>Data</string>
+   </attribute>
+   <layout class="QGridLayout" name="gridLayout_6">
+    <item row="0" column="0">
+     <widget class="QGroupBox" name="groupBox">
+      <property name="title">
+       <string>Data</string>
       </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Unselect all</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Select all 1D</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Unselect all 1D</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Select all 2D</string>
-      </property>
-     </item>
-     <item>
-      <property name="text">
-       <string>Unselect all 2D</string>
-      </property>
-     </item>
-    </widget>
-   </item>
-   <item row="1" column="1">
-    <spacer name="horizontalSpacer_2">
-     <property name="orientation">
-      <enum>Qt::Horizontal</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>278</width>
-       <height>20</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="2" column="0" colspan="2">
-    <widget class="QGroupBox" name="groupBox">
-     <property name="title">
-      <string>Data</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout">
+      <layout class="QGridLayout" name="gridLayout">
+       <item row="0" column="0">
+        <layout class="QHBoxLayout" name="horizontalLayout_2">
+         <item>
+          <widget class="QPushButton" name="cmdLoad">
+           <property name="text">
+            <string>Load</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbSelect">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <item>
+            <property name="text">
+             <string>Select all</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Unselect all</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Select all 1D</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Unselect all 1D</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Select all 2D</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Unselect all 2D</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer_7">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>128</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="cmdDeleteData">
+           <property name="text">
+            <string>Delete</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item row="1" column="0">
+        <widget class="QTreeView" name="treeView">
+         <property name="acceptDrops">
+          <bool>true</bool>
+         </property>
+         <property name="editTriggers">
+          <set>QAbstractItemView::NoEditTriggers</set>
+         </property>
+         <property name="dragEnabled">
+          <bool>true</bool>
+         </property>
+         <property name="dragDropOverwriteMode">
+          <bool>true</bool>
+         </property>
+         <property name="dragDropMode">
+          <enum>QAbstractItemView::DropOnly</enum>
+         </property>
+         <property name="defaultDropAction">
+          <enum>Qt::CopyAction</enum>
+         </property>
+         <property name="selectionMode">
+          <enum>QAbstractItemView::ExtendedSelection</enum>
+         </property>
+         <attribute name="headerVisible">
+          <bool>false</bool>
+         </attribute>
+        </widget>
+       </item>
+       <item row="2" column="0">
+        <layout class="QHBoxLayout" name="horizontalLayout">
+         <item>
+          <widget class="QPushButton" name="cmdFreeze">
+           <property name="text">
+            <string>Freeze Theory</string>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <spacer name="horizontalSpacer">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>58</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QToolButton" name="cmdSendTo">
+           <property name="text">
+            <string>...</string>
+           </property>
+           <property name="icon">
+            <iconset resource="main_resources.qrc">
+             <normaloff>:/res/file_send-128.png</normaloff>:/res/file_send-128.png</iconset>
+           </property>
+           <property name="iconSize">
+            <size>
+             <width>32</width>
+             <height>32</height>
+            </size>
+           </property>
+          </widget>
+         </item>
+         <item>
+          <widget class="QComboBox" name="cbFitting">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="sizeAdjustPolicy">
+            <enum>QComboBox::AdjustToContents</enum>
+           </property>
+           <item>
+            <property name="text">
+             <string>Fitting</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Pr inversion</string>
+            </property>
+           </item>
+           <item>
+            <property name="text">
+             <string>Invariant</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+         <item>
+          <widget class="QCheckBox" name="chkBatch">
+           <property name="text">
+            <string>Batch mode</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+      </layout>
+     </widget>
+    </item>
+    <item row="1" column="0">
+     <layout class="QGridLayout" name="gridLayout_2">
       <item row="0" column="0">
-       <widget class="QTreeView" name="treeView">
-        <property name="dragEnabled">
-         <bool>true</bool>
-        </property>
-        <property name="dragDropMode">
-         <enum>QAbstractItemView::DragDrop</enum>
-        </property>
-        <property name="defaultDropAction">
-         <enum>Qt::CopyAction</enum>
-        </property>
-        <property name="selectionMode">
-         <enum>QAbstractItemView::ExtendedSelection</enum>
-        </property>
+       <widget class="QGroupBox" name="groupBox_3">
+        <property name="title">
+         <string>Plot</string>
+        </property>
+        <layout class="QGridLayout" name="gridLayout_3">
+         <item row="0" column="0">
+          <widget class="QPushButton" name="cmdNew">
+           <property name="text">
+            <string>Create New</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="0">
+          <widget class="QPushButton" name="cmdAppend">
+           <property name="text">
+            <string>Append to</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QComboBox" name="cbgraph">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="sizeAdjustPolicy">
+            <enum>QComboBox::AdjustToContents</enum>
+           </property>
+           <item>
+            <property name="text">
+             <string>Graph1</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+        </layout>
        </widget>
       </item>
       <item row="0" column="1">
-       <layout class="QVBoxLayout" name="verticalLayout">
-        <item>
-         <widget class="QPushButton" name="pushButton">
-          <property name="text">
-           <string>Load</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QPushButton" name="pushButton_2">
-          <property name="text">
-           <string>Delete</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="verticalSpacer_2">
-          <property name="orientation">
-           <enum>Qt::Vertical</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>20</width>
-            <height>141</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </item>
-      <item row="1" column="0" colspan="2">
-       <layout class="QHBoxLayout" name="horizontalLayout">
-        <item>
-         <widget class="QPushButton" name="pushButton_6">
-          <property name="text">
-           <string>Send to</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <widget class="QComboBox" name="comboBox_3">
-          <property name="sizePolicy">
-           <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
-            <horstretch>0</horstretch>
-            <verstretch>0</verstretch>
-           </sizepolicy>
-          </property>
-          <item>
-           <property name="text">
-            <string>Fitting</string>
-           </property>
-          </item>
-          <item>
-           <property name="text">
-            <string>Pr inversion</string>
-           </property>
-          </item>
-          <item>
-           <property name="text">
-            <string>Invariant</string>
-           </property>
-          </item>
-         </widget>
-        </item>
-        <item>
-         <widget class="QCheckBox" name="checkBox">
-          <property name="text">
-           <string>Batch mode</string>
-          </property>
-         </widget>
-        </item>
-        <item>
-         <spacer name="horizontalSpacer">
-          <property name="orientation">
-           <enum>Qt::Horizontal</enum>
-          </property>
-          <property name="sizeHint" stdset="0">
-           <size>
-            <width>197</width>
-            <height>20</height>
-           </size>
-          </property>
-         </spacer>
-        </item>
-       </layout>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item row="3" column="0" colspan="2">
-    <widget class="QGroupBox" name="groupBox_2">
-     <property name="title">
-      <string>Theory</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_2">
-      <item row="0" column="0" rowspan="2">
-       <widget class="QListView" name="listView"/>
-      </item>
-      <item row="0" column="1">
-       <widget class="QPushButton" name="pushButton_3">
-        <property name="text">
-         <string>Freeze</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <spacer name="verticalSpacer">
+       <spacer name="horizontalSpacer_3">
         <property name="orientation">
-         <enum>Qt::Vertical</enum>
+         <enum>Qt::Horizontal</enum>
         </property>
         <property name="sizeHint" stdset="0">
          <size>
-          <width>20</width>
-          <height>198</height>
+          <width>108</width>
+          <height>111</height>
          </size>
         </property>
        </spacer>
       </item>
+      <item row="0" column="2" alignment="Qt::AlignBottom">
+       <widget class="QPushButton" name="cmdHelp">
+        <property name="text">
+         <string>Help</string>
+        </property>
+       </widget>
+      </item>
      </layout>
-    </widget>
-   </item>
-   <item row="4" column="0">
-    <widget class="QGroupBox" name="groupBox_3">
-     <property name="title">
-      <string>Plot</string>
-     </property>
-     <layout class="QGridLayout" name="gridLayout_3">
+    </item>
+   </layout>
+  </widget>
+  <widget class="QWidget" name="theoryTab">
+   <attribute name="title">
+    <string>Theory</string>
+   </attribute>
+   <layout class="QGridLayout" name="gridLayout_8">
+    <item row="0" column="0">
+     <widget class="QGroupBox" name="groupBox_2">
+      <property name="title">
+       <string>Theory</string>
+      </property>
+      <layout class="QGridLayout" name="gridLayout_4">
+       <item row="0" column="0">
+        <layout class="QHBoxLayout" name="horizontalLayout_3">
+         <item>
+          <spacer name="horizontalSpacer_5">
+           <property name="orientation">
+            <enum>Qt::Horizontal</enum>
+           </property>
+           <property name="sizeHint" stdset="0">
+            <size>
+             <width>353</width>
+             <height>20</height>
+            </size>
+           </property>
+          </spacer>
+         </item>
+         <item>
+          <widget class="QPushButton" name="cmdDeleteTheory">
+           <property name="text">
+            <string>Delete</string>
+           </property>
+          </widget>
+         </item>
+        </layout>
+       </item>
+       <item row="1" column="0">
+        <widget class="QTreeView" name="freezeView">
+         <attribute name="headerVisible">
+          <bool>false</bool>
+         </attribute>
+        </widget>
+       </item>
+      </layout>
+     </widget>
+    </item>
+    <item row="1" column="0">
+     <layout class="QGridLayout" name="gridLayout_5">
       <item row="0" column="0">
-       <widget class="QPushButton" name="pushButton_4">
+       <widget class="QGroupBox" name="groupBox_4">
+        <property name="title">
+         <string>Plot</string>
+        </property>
+        <layout class="QGridLayout" name="gridLayout_7">
+         <item row="0" column="0">
+          <widget class="QPushButton" name="cmdNew_2">
+           <property name="text">
+            <string>Create New</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="0">
+          <widget class="QPushButton" name="cmdAppend_2">
+           <property name="text">
+            <string>Append to</string>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="QComboBox" name="cbgraph_2">
+           <property name="sizePolicy">
+            <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+             <horstretch>0</horstretch>
+             <verstretch>0</verstretch>
+            </sizepolicy>
+           </property>
+           <property name="sizeAdjustPolicy">
+            <enum>QComboBox::AdjustToContents</enum>
+           </property>
+           <item>
+            <property name="text">
+             <string>Graph1</string>
+            </property>
+           </item>
+          </widget>
+         </item>
+        </layout>
+       </widget>
+      </item>
+      <item row="0" column="1">
+       <spacer name="horizontalSpacer_4">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>108</width>
+          <height>111</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="0" column="2" alignment="Qt::AlignBottom">
+       <widget class="QPushButton" name="cmdHelp_2">
         <property name="text">
-         <string>New</string>
+         <string>Help</string>
         </property>
        </widget>
       </item>
-      <item row="1" column="0">
-       <widget class="QPushButton" name="pushButton_5">
-        <property name="text">
-         <string>Append to</string>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QComboBox" name="comboBox_2">
-        <property name="sizePolicy">
-         <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-          <horstretch>0</horstretch>
-          <verstretch>0</verstretch>
-         </sizepolicy>
-        </property>
-        <item>
-         <property name="text">
-          <string>Graph1</string>
-         </property>
-        </item>
-       </widget>
-      </item>
      </layout>
-    </widget>
-   </item>
-  </layout>
-  <zorder>groupBox_3</zorder>
-  <zorder>groupBox_2</zorder>
-  <zorder>groupBox</zorder>
-  <zorder>comboBox</zorder>
-  <zorder>label</zorder>
-  <zorder>horizontalSpacer_2</zorder>
+    </item>
+   </layout>
+  </widget>
  </widget>
- <resources/>
+ <resources>
+  <include location="main_resources.qrc"/>
+ </resources>
  <connections/>
 </ui>
Index: src/sas/qtgui/UI/TabbedFileLoadUI.py
===================================================================
--- src/sas/qtgui/UI/TabbedFileLoadUI.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/UI/TabbedFileLoadUI.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -133,4 +133,5 @@
         self.freezeView = QtGui.QTreeView(self.groupBox_2)
         self.freezeView.setObjectName(_fromUtf8("freezeView"))
+        self.freezeView.header().setVisible(False)
         self.gridLayout_4.addWidget(self.freezeView, 0, 0, 1, 2)
         self.gridLayout_7.addWidget(self.groupBox_2, 0, 0, 1, 2)
Index: src/sas/qtgui/UI/TabbedFileLoadUI.ui
===================================================================
--- src/sas/qtgui/UI/TabbedFileLoadUI.ui	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/UI/TabbedFileLoadUI.ui	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -281,5 +281,9 @@
        </item>
        <item row="0" column="0" colspan="2">
-        <widget class="QTreeView" name="freezeView"/>
+        <widget class="QTreeView" name="freezeView">
+         <attribute name="headerVisible">
+          <bool>false</bool>
+         </attribute>
+        </widget>
        </item>
       </layout>
Index: src/sas/qtgui/UnitTesting/DataExplorerTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/DataExplorerTest.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/UnitTesting/DataExplorerTest.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -49,25 +49,47 @@
     def testDefaults(self):
         '''Test the GUI in its default state'''
+        # Tab widget
         self.assertIsInstance(self.form, QTabWidget)
-        self.assertIsInstance(self.form.treeView, QTreeView)
-        self.assertIsInstance(self.form.freezeView, QTreeView)
         self.assertEqual(self.form.count(), 2)
 
+        # Buttons - data tab
         self.assertEqual(self.form.cmdLoad.text(), "Load")
         self.assertEqual(self.form.cmdDeleteData.text(), "Delete")
         self.assertEqual(self.form.cmdDeleteTheory.text(), "Delete")
-        self.assertEqual(self.form.cmdFreeze.text(), "Freeze")
-        self.assertEqual(self.form.cmdSendTo.text(), "Send to")
+        self.assertEqual(self.form.cmdFreeze.text(), "Freeze Theory")
+        self.assertEqual(self.form.cmdSendTo.text(), "...")
+        self.assertEqual(self.form.cmdSendTo.iconSize(), QSize(32, 32))
+        self.assertIsInstance(self.form.cmdSendTo.icon(), QIcon)
         self.assertEqual(self.form.chkBatch.text(), "Batch mode")
         self.assertFalse(self.form.chkBatch.isChecked())
 
+        # Buttons - theory tab
+
+        # Combo boxes
         self.assertEqual(self.form.cbSelect.count(), 6)
         self.assertEqual(self.form.cbSelect.currentIndex(), 0)
 
-        # Class is in the default state even without pressing OK
+        # Models - data
+        self.assertIsInstance(self.form.model, QStandardItemModel)
         self.assertEqual(self.form.treeView.model().rowCount(), 0)
         self.assertEqual(self.form.treeView.model().columnCount(), 0)
         self.assertEqual(self.form.model.rowCount(), 0)
         self.assertEqual(self.form.model.columnCount(), 0)
+        self.assertIsInstance(self.form.data_proxy, QSortFilterProxyModel)
+        self.assertEqual(self.form.data_proxy.sourceModel(), self.form.model)
+        self.assertEqual("[^()]", str(self.form.data_proxy.filterRegExp().pattern()))
+        self.assertIsInstance(self.form.treeView, QTreeView)
+
+        # Models - theory
+        self.assertIsInstance(self.form.theory_model, QStandardItemModel)
+        self.assertEqual(self.form.freezeView.model().rowCount(), 0)
+        self.assertEqual(self.form.freezeView.model().columnCount(), 0)
+        self.assertEqual(self.form.theory_model.rowCount(), 0)
+        self.assertEqual(self.form.theory_model.columnCount(), 0)
+        self.assertIsInstance(self.form.theory_proxy, QSortFilterProxyModel)
+        self.assertEqual(self.form.theory_proxy.sourceModel(), self.form.theory_model)
+        self.assertEqual("[^()]", str(self.form.theory_proxy.filterRegExp().pattern()))
+        self.assertIsInstance(self.form.freezeView, QTreeView)
+
         
     def testLoadButton(self):
@@ -153,4 +175,66 @@
         QTest.mouseClick(deleteButton, Qt.LeftButton)
 
+    def testDeleteTheory(self):
+        """
+        Test that clicking "Delete" in theories tab removes selected indices
+        """
+        deleteButton = self.form.cmdDeleteTheory
+
+        # Mock the confirmation dialog with return=No
+        QtGui.QMessageBox.question = MagicMock(return_value=QtGui.QMessageBox.No)
+
+        # Populate the model
+        item1 = QtGui.QStandardItem(True)
+        item1.setCheckable(True)
+        item1.setCheckState(QtCore.Qt.Checked)
+        item1.setText("item 1")
+        self.form.theory_model.appendRow(item1)
+        item2 = QtGui.QStandardItem(True)
+        item2.setCheckable(True)
+        item2.setCheckState(QtCore.Qt.Unchecked)
+        item2.setText("item 2")
+        self.form.theory_model.appendRow(item2)
+
+        # Assure the model contains two items
+        self.assertEqual(self.form.theory_model.rowCount(), 2)
+
+        # Assure the checkboxes are on
+        self.assertTrue(item1.checkState() == QtCore.Qt.Checked)
+        self.assertTrue(item2.checkState() == QtCore.Qt.Unchecked)
+
+        # Click on the delete  button
+        QTest.mouseClick(deleteButton, Qt.LeftButton)
+
+        # Test the warning dialog called once
+        self.assertTrue(QtGui.QMessageBox.question.called)
+
+        # Assure the model still contains the items
+        self.assertEqual(self.form.theory_model.rowCount(), 2)
+
+        # Now, mock the confirmation dialog with return=Yes
+        QtGui.QMessageBox.question = MagicMock(return_value=QtGui.QMessageBox.Yes)
+
+        # Click on the delete  button
+        QTest.mouseClick(deleteButton, Qt.LeftButton)
+
+        # Test the warning dialog called once
+        self.assertTrue(QtGui.QMessageBox.question.called)
+
+        # Assure the model contains 1 item
+        self.assertEqual(self.form.theory_model.rowCount(), 1)
+
+        # Set the remaining item to checked
+        self.form.theory_model.item(0).setCheckState(QtCore.Qt.Checked)
+
+        # Click on the delete button again
+        QTest.mouseClick(deleteButton, Qt.LeftButton)
+
+        # Assure the model contains no items
+        self.assertEqual(self.form.theory_model.rowCount(), 0)
+
+        # Click delete once again to assure no nasty behaviour on empty model
+        QTest.mouseClick(deleteButton, Qt.LeftButton)
+
+
     def testSendToButton(self):
         """
@@ -253,4 +337,38 @@
         #    self.form.cbSelect.setCurrentIndex(6)
 
+    def testFreezeTheory(self):
+        """
+        Assure theory freeze functionality works
+        """
+        # Not yet tested - agree on design first.
+        pass
+
+    def testRecursivelyCloneItem(self):
+        """
+        Test the rescursive QAbstractItem/QStandardItem clone
+        """
+        # Create an item with several branches
+        item1 = QtGui.QStandardItem()
+        item2 = QtGui.QStandardItem()
+        item3 = QtGui.QStandardItem()
+        item4 = QtGui.QStandardItem()
+        item5 = QtGui.QStandardItem()
+        item6 = QtGui.QStandardItem()
+
+        item4.appendRow(item5)
+        item2.appendRow(item4)
+        item2.appendRow(item6)
+        item1.appendRow(item2)
+        item1.appendRow(item3)
+
+        # Clone
+        new_item = self.form.recursivelyCloneItem(item1)
+
+        # assure the trees look identical
+        self.assertEqual(item1.rowCount(), new_item.rowCount())
+        self.assertEqual(item1.child(0).rowCount(), new_item.child(0).rowCount())
+        self.assertEqual(item1.child(1).rowCount(), new_item.child(1).rowCount())
+        self.assertEqual(item1.child(0).child(0).rowCount(), new_item.child(0).child(0).rowCount())
+
     def testReadData(self):
         """
@@ -281,4 +399,27 @@
         self.assertEqual(model_name, filename[0])
 
+    def testDisplayHelp(self):
+        """
+        Test that the Help window gets shown correctly
+        """
+        partial_url = "sasgui/guiframe/data_explorer_help.html"
+        button1 = self.form.cmdHelp
+        button2 = self.form.cmdHelp_2
+
+        # Click on the Help button
+        QTest.mouseClick(button1, Qt.LeftButton)
+        qApp.processEvents()
+
+        # Check the browser
+        self.assertIn(partial_url, str(self.form._helpView.url()))
+        # Close the browser
+        self.form._helpView.close()
+
+        # Click on the Help_2 button
+        QTest.mouseClick(button2, Qt.LeftButton)
+        qApp.processEvents()
+        # Check the browser
+        self.assertIn(partial_url, str(self.form._helpView.url()))
+
     def testLoadFile(self):
         """
@@ -292,10 +433,14 @@
         Test the list of known extensions
         """
-        list = self.form.getWlist()
+        w_list = self.form.getWlist()
+
         defaults = 'All (*.*);;canSAS files (*.xml);;SESANS files' +\
             ' (*.ses);;ASCII files (*.txt);;IGOR 2D files (*.asc);;' +\
             'IGOR/DAT 2D Q_map files (*.dat);;IGOR 1D files (*.abs);;'+\
             'HFIR 1D files (*.d1d);;DANSE files (*.sans);;NXS files (*.nxs)'
-        self.assertEqual(defaults, list)
+        default_list = defaults.split(';;')
+
+        for format in default_list:
+            self.assertIn(format, w_list)
        
     def testLoadComplete(self):
Index: src/sas/qtgui/UnitTesting/DroppableDataLoadWidgetTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/DroppableDataLoadWidgetTest.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/UnitTesting/DroppableDataLoadWidgetTest.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -6,4 +6,5 @@
 from PyQt4.QtCore import Qt
 from DroppableDataLoadWidget import DroppableDataLoadWidget
+from GuiUtils import *
 
 app = QApplication(sys.argv)
@@ -13,5 +14,24 @@
     def setUp(self):
         '''Create the GUI'''
-        self.form = DroppableDataLoadWidget()
+        class dummy_manager(object):
+            def communicator(self):
+                return Communicate()
+            def perspective(self):
+                return MyPerspective()
+
+        self.form = DroppableDataLoadWidget(None, guimanager=dummy_manager())
+        # create dummy mime objects
+
+    def testDragIsOK(self):
+        """
+        Test the item being dragged over the load widget
+        """
+        pass
+
+    def testDropEvent(self):
+        """
+        Test what happens if an object is dropped onto the load widget
+        """
+        pass
 
 if __name__ == "__main__":
Index: src/sas/qtgui/UnitTesting/GuiManagerTest.py
===================================================================
--- src/sas/qtgui/UnitTesting/GuiManagerTest.py	(revision f82ab8cebb48e29a3c2598340d12929e037d764c)
+++ src/sas/qtgui/UnitTesting/GuiManagerTest.py	(revision 481ff261d4487dbfcc8eabb342125294e0c6f514)
@@ -87,6 +87,4 @@
         # See that the MessageBox method got called
         self.assertTrue(QMessageBox.question.called)
-        # Also, sys.exit() called
-        self.assertTrue(sys.exit.called)
 
     def testCheckUpdate(self):
