Index: src/sas/qtgui/MainWindow/AboutBox.py
===================================================================
--- src/sas/qtgui/MainWindow/AboutBox.py	(revision cd2cc7458970e179039a783e9409f48c4c1fca0d)
+++ src/sas/qtgui/MainWindow/AboutBox.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
@@ -8,5 +8,5 @@
 from sas.qtgui.UI import main_resources_rc
 
-from UI.AboutUI import Ui_AboutUI
+from .UI.AboutUI import Ui_AboutUI
 
 class AboutBox(QtGui.QDialog, Ui_AboutUI):
Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision 88e1f57e340b062a07d1e5693c8b7b8a4edc4b32)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
@@ -155,5 +155,5 @@
         Populate the Perspective combobox and define callbacks
         """
-        available_perspectives = sorted([p for p in Perspectives.PERSPECTIVES.keys()])
+        available_perspectives = sorted([p for p in list(Perspectives.PERSPECTIVES.keys())])
         if available_perspectives:
             self.cbFitting.clear()
@@ -240,5 +240,5 @@
 
         self.manager.assign(manager)
-        for id, item in self.manager.get_all_data().iteritems():
+        for id, item in self.manager.get_all_data().items():
             self.updateModel(item.data, item.path)
 
@@ -345,5 +345,5 @@
         # Figure out which rows are checked
         selected_items = [self.model.item(index)
-                          for index in xrange(self.model.rowCount())
+                          for index in range(self.model.rowCount())
                           if isItemReady(index)]
 
@@ -400,5 +400,5 @@
         else:
             freeze_msg = "Unexpected number of theories copied: %i" % theories_copied
-            raise AttributeError, freeze_msg
+            raise AttributeError(freeze_msg)
         self.communicator.statusBarUpdateSignal.emit(freeze_msg)
         # Actively switch tabs
@@ -411,5 +411,5 @@
         new_item = item.clone()
         # clone doesn't do deepcopy :(
-        for child_index in xrange(item.rowCount()):
+        for child_index in range(item.rowCount()):
             child_item = self.recursivelyCloneItem(item.child(child_index))
             new_item.setChild(child_index, child_item)
@@ -435,5 +435,5 @@
             return
         new_plots = [PlotHelper.plotById(plot) for plot in graph_list]
-        active_plots_copy = self.active_plots.keys()
+        active_plots_copy = list(self.active_plots.keys())
         for plot in active_plots_copy:
             if self.active_plots[plot] in new_plots:
@@ -478,5 +478,5 @@
         for plot in plots:
             plot_id = plot.id
-            if plot_id in self.active_plots.keys():
+            if plot_id in list(self.active_plots.keys()):
                 self.active_plots[plot_id].replacePlot(plot_id, plot)
             else:
@@ -530,5 +530,5 @@
             else:
                 msg = "Incorrect data type passed to Plotting"
-                raise AttributeError, msg
+                raise AttributeError(msg)
 
         if 'new_plot' in locals() and \
@@ -597,5 +597,5 @@
 
         id = data.id
-        if data.id in self.active_plots.keys():
+        if data.id in list(self.active_plots.keys()):
             self.active_plots[id].replacePlot(id, data)
 
@@ -610,10 +610,10 @@
         # But only with Qt built-in dialog (non-platform native)
         paths = QtGui.QFileDialog.getOpenFileNames(self, "Choose a file", "",
-                wlist, None, QtGui.QFileDialog.DontUseNativeDialog)
+                wlist, QtGui.QFileDialog.DontUseNativeDialog)
         if paths is None:
             return
 
-        if isinstance(paths, QtCore.QStringList):
-            paths = [str(f) for f in paths]
+        #if isinstance(paths, QtCore.QStringList):
+        #    paths = [str(f) for f in paths]
 
         if not isinstance(paths, list):
@@ -687,5 +687,5 @@
 
             except Exception as ex:
-                logging.error(sys.exc_value)
+                logging.error(sys.exc_info()[1])
 
                 any_error = True
@@ -747,5 +747,5 @@
         if not isinstance(index, int):
             msg = "Incorrect type passed to DataExplorer.selectData()"
-            raise AttributeError, msg
+            raise AttributeError(msg)
 
         # Respond appropriately
@@ -773,5 +773,5 @@
                 except AttributeError:
                     msg = "Bad structure of the data model."
-                    raise RuntimeError, msg
+                    raise RuntimeError(msg)
 
                 if is1D:
@@ -787,5 +787,5 @@
                 except AttributeError:
                     msg = "Bad structure of the data model."
-                    raise RuntimeError, msg
+                    raise RuntimeError(msg)
 
                 if item.isCheckable() and item.checkState() == QtCore.Qt.Checked and is1D:
@@ -801,5 +801,5 @@
                 except AttributeError:
                     msg = "Bad structure of the data model."
-                    raise RuntimeError, msg
+                    raise RuntimeError(msg)
 
                 if is2D:
@@ -815,5 +815,5 @@
                 except AttributeError:
                     msg = "Bad structure of the data model."
-                    raise RuntimeError, msg
+                    raise RuntimeError(msg)
 
                 if item.isCheckable() and item.checkState() == QtCore.Qt.Checked and is2D:
@@ -823,5 +823,5 @@
             msg = "Incorrect value in the Selection Option"
             # Change this to a proper logging action
-            raise Exception, msg
+            raise Exception(msg)
 
     def contextMenu(self):
@@ -1016,5 +1016,5 @@
         # Add the actual Data1D/Data2D object
         object_item = QtGui.QStandardItem()
-        object_item.setData(QtCore.QVariant(data))
+        object_item.setData(data)
 
         checkbox_item.setChild(0, object_item)
@@ -1040,5 +1040,5 @@
         if not isinstance(model_item, QtGui.QStandardItem):
             msg = "Wrong data type returned from calculations."
-            raise AttributeError, msg
+            raise AttributeError(msg)
 
         # TODO: Assert other properties
@@ -1057,5 +1057,5 @@
         if not isinstance(model_item, QtGui.QStandardItem):
             msg = "Wrong data type returned from calculations."
-            raise AttributeError, msg
+            raise AttributeError(msg)
 
         # Check if there are any other items for this tab
@@ -1064,5 +1064,5 @@
         # 
         current_tab_name = model_item.text()[:2]
-        for current_index in xrange(self.theory_model.rowCount()):
+        for current_index in range(self.theory_model.rowCount()):
             if current_tab_name in self.theory_model.item(current_index).text():
                 self.theory_model.removeRow(current_index)
Index: src/sas/qtgui/MainWindow/DataManager.py
===================================================================
--- src/sas/qtgui/MainWindow/DataManager.py	(revision 7d9c83c92cef3381669815551c3850802b12abf0)
+++ src/sas/qtgui/MainWindow/DataManager.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
@@ -24,5 +24,5 @@
 import json
 import time
-from StringIO import StringIO
+from io import StringIO
 import numpy as np
 
@@ -66,5 +66,5 @@
         _str += "No of states  is %s \n" % str(len(self.stored_data))
         n_count = 0
-        for  value in self.stored_data.values():
+        for  value in list(self.stored_data.values()):
             n_count += 1
             _str += "State No %s \n"  % str(n_count)
@@ -146,5 +146,5 @@
         receive a list of
         """
-        for id, data in data_list.iteritems():
+        for id, data in data_list.items():
             if id  in self.stored_data:
                 msg = "Data manager already stores %s" % str(data.name)
@@ -162,10 +162,10 @@
         """
         """
-        if prev_data.id not in self.stored_data.keys():
+        if prev_data.id not in list(self.stored_data.keys()):
             return None, {}
         data_state = self.stored_data[prev_data.id]
         self.stored_data[new_data.id]  = data_state.clone()
         self.stored_data[new_data.id].data = new_data
-        if prev_data.id in self.stored_data.keys():
+        if prev_data.id in list(self.stored_data.keys()):
             del self.stored_data[prev_data.id]
         return prev_data.id, {new_data.id: self.stored_data[new_data.id]}
@@ -177,5 +177,5 @@
         if data_id is None and theory is not None:
             uid = theory.id
-        if uid in self.stored_data.keys():
+        if uid in list(self.stored_data.keys()):
              data_state = self.stored_data[uid]
         else:
@@ -207,5 +207,5 @@
                 if search_id == d_id:
                     _selected_data[search_id] = data
-                if search_id in theory_list.keys():
+                if search_id in list(theory_list.keys()):
                      _selected_theory_list[search_id] = theory_list[search_id]
 
@@ -216,5 +216,5 @@
         """
         """
-        return self.freeze_theory(self.stored_data.keys(), theory_id)
+        return self.freeze_theory(list(self.stored_data.keys()), theory_id)
 
     def freeze_theory(self, data_id, theory_id):
@@ -227,5 +227,5 @@
                 theory_list = data_state.get_theory()
                 for t_id in theory_id:
-                    if t_id in theory_list.keys():
+                    if t_id in list(theory_list.keys()):
                         theory_data, theory_state = theory_list[t_id]
                         new_theory = copy.deepcopy(theory_data)
@@ -247,5 +247,5 @@
         """
         for d_id in data_id:
-            if d_id in self.stored_data.keys():
+            if d_id in list(self.stored_data.keys()):
                 data_state = self.stored_data[d_id]
                 if data_state.data.name in self.data_name_dict:
@@ -265,5 +265,5 @@
                 data_state = self.stored_data[d_id]
                 theory_list = data_state.get_theory()
-                if theory_id in theory_list.keys():
+                if theory_id in list(theory_list.keys()):
                     del theory_list[theory_id]
         #del pure theory
@@ -284,5 +284,5 @@
         _selected_data = {}
         for selected_name in name_list:
-            for id, data_state in self.stored_data.iteritems():
+            for id, data_state in self.stored_data.items():
                 if data_state.data.name == selected_name:
                     _selected_data[id] = data_state.data
@@ -294,5 +294,5 @@
         """
         for selected_name in name_list:
-            for id, data_state in self.stored_data.iteritems():
+            for id, data_state in self.stored_data.items():
                 if data_state.data.name == selected_name:
                     del self.stored_data[id]
@@ -303,5 +303,5 @@
             # Take the copy of current, possibly shorter stored_data dict
             stored_data = copy.deepcopy(self.stored_data)
-            for idx in stored_data.keys():
+            for idx in list(stored_data.keys()):
                 if str(selected_name) in str(idx):
                     del self.stored_data[idx]
@@ -313,5 +313,5 @@
         _selected_data_state = {}
         for id in data_id:
-            if id in self.stored_data.keys():
+            if id in list(self.stored_data.keys()):
                 _selected_data_state[id] = self.stored_data[id]
         return _selected_data_state
@@ -396,5 +396,5 @@
             class Empty(object):
                 def __init__(self):
-                    for key, value in data.iteritems():
+                    for key, value in data.items():
                         setattr(self, key, generate(value, level))
 
@@ -451,5 +451,5 @@
                     # if dictionary doesn't have __type__ then it is assumed to be just an ordinary dictionary
                     o = {}
-                    for key, value in data.iteritems():
+                    for key, value in data.items():
                         o[key] = generate(value, level)
                     return o
@@ -463,5 +463,5 @@
 
         new_stored_data = {}
-        for id, data in json.load(fp).iteritems():
+        for id, data in json.load(fp).items():
             try:
                 new_stored_data[id] = generate(data, 0)
Index: src/sas/qtgui/MainWindow/DataState.py
===================================================================
--- src/sas/qtgui/MainWindow/DataState.py	(revision 749b715f280e81297ccee885592a53f964909d62)
+++ src/sas/qtgui/MainWindow/DataState.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
@@ -37,5 +37,5 @@
         _str += "Theories available: %s \n" % len(self.theory_list)
         if self.theory_list:
-            for id, item in self.theory_list.iteritems():
+            for id, item in self.theory_list.items():
                 theory_data, theory_state = item
                 _str += "Theory name : %s \n" % str(theory_data.name)
@@ -53,5 +53,5 @@
         obj.message = self.message
         obj.id = self.id
-        for id, item in self.theory_list.iteritems():
+        for id, item in self.theory_list.items():
             theory_data, theory_state = item
             state = None
@@ -95,5 +95,5 @@
         """
         self.theory_list[theory_data.id] = [theory_data, theory_state]
-        data, state = self.theory_list.values()[0]
+        data, state = list(self.theory_list.values())[0]
        
     def get_theory(self):
Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision 9e541999bafd14b2c0f96d8abc555b7a4b0c4fb4)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
@@ -199,5 +199,5 @@
         workspace_height = self._workspace.workspace.sizeHint().height()
         perspective_size = self._current_perspective.sizeHint()
-        if workspace_height < perspective_size.height:
+        if workspace_height < perspective_size.height():
             perspective_width = perspective_size.width()
             self._current_perspective.resize(perspective_width, workspace_height-10)
@@ -210,5 +210,5 @@
         assert isinstance(data, list)
         if self._current_perspective is not None:
-            self._current_perspective.setData(data.values())
+            self._current_perspective.setData(list(data.values()))
         else:
             msg = "No perspective is currently active."
@@ -254,5 +254,5 @@
         """
         if self._current_perspective is not None:
-            self._current_perspective.setData(data.values())
+            self._current_perspective.setData(list(data.values()))
         else:
             msg = "Guiframe does not have a current perspective"
@@ -297,5 +297,5 @@
             version_info = json.loads(content)
             self.processVersion(version_info)
-        except ValueError, ex:
+        except ValueError as ex:
             logging.info("Failed to connect to www.sasview.org:", ex)
 
@@ -329,5 +329,5 @@
         except:
             msg = "guiframe: could not get latest application"
-            msg += " version number\n  %s" % sys.exc_value
+            msg += " version number\n  %s" % sys.exc_info()[1]
             logging.error(msg)
             msg = "Could not connect to the application server."
@@ -764,5 +764,5 @@
                 not isinstance(new_datalist_item, dict):
             msg = "Wrong data type returned from calculations."
-            raise AttributeError, msg
+            raise AttributeError(msg)
 
         self.filesWidget.model.appendRow(new_item)
Index: src/sas/qtgui/MainWindow/MainWindow.py
===================================================================
--- src/sas/qtgui/MainWindow/MainWindow.py	(revision 2a8bd7052cb942c4a5ebe1ba1549393142ca199f)
+++ src/sas/qtgui/MainWindow/MainWindow.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
@@ -5,5 +5,5 @@
 # Local UI
 from sas.qtgui.UI import main_resources_rc
-from UI.MainWindowUI import Ui_MainWindow
+from .UI.MainWindowUI import Ui_MainWindow
 
 # Initialize logging
@@ -21,5 +21,5 @@
 
         # Create the gui manager
-        from GuiManager import GuiManager
+        from .GuiManager import GuiManager
         self.guiManager = GuiManager(self)
 
