Index: src/sas/qtgui/Utilities/CategoryInstaller.py
===================================================================
--- src/sas/qtgui/Utilities/CategoryInstaller.py	(revision 125c4be1f2a9bcc043693f90241343f185040dde)
+++ src/sas/qtgui/Utilities/CategoryInstaller.py	(revision b0b09b9740526b0b3838f642e43599409dfd8772)
@@ -103,5 +103,5 @@
                 master_category_dict[category].append(\
                     (model, model_enabled_dict[model]))
-        return OrderedDict(sorted(master_category_dict.items(), key=lambda t: t[0]))
+        return OrderedDict(sorted(list(master_category_dict.items()), key=lambda t: t[0]))
 
     @staticmethod
@@ -126,5 +126,5 @@
         """
         _model_dict = { model.name: model for model in model_list}
-        _model_list = _model_dict.keys()
+        _model_list = list(_model_dict.keys())
 
         serialized_file = None
@@ -143,5 +143,5 @@
         add_list = _model_list
         del_name = False
-        for cat in master_category_dict.keys():
+        for cat in list(master_category_dict.keys()):
             for ind in range(len(master_category_dict[cat])):
                 model_name, enabled = master_category_dict[cat][ind]
@@ -152,5 +152,5 @@
                         model_enabled_dict.pop(model_name)
                     except:
-                        logging.error("CategoryInstaller: %s", sys.exc_value)
+                        logging.error("CategoryInstaller: %s", sys.exc_info()[1])
                 else:
                     add_list.remove(model_name)
Index: src/sas/qtgui/Utilities/ConnectionProxy.py
===================================================================
--- src/sas/qtgui/Utilities/ConnectionProxy.py	(revision dc5ef150e8b37e01a3b7e253eb5b66d3b82de99c)
+++ src/sas/qtgui/Utilities/ConnectionProxy.py	(revision b0b09b9740526b0b3838f642e43599409dfd8772)
@@ -1,5 +1,5 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
-import urllib2
+import urllib.request, urllib.error, urllib.parse
 import sys
 import json
@@ -33,5 +33,5 @@
         if sys.platform == 'win32':
             try:
-                import _winreg as winreg  # used from python 2.0-2.6
+                import winreg as winreg  # used from python 2.0-2.6
             except:
                 import winreg  # used from python 2.7 onwards
@@ -45,5 +45,5 @@
                 this_name, this_val, this_type = winreg.EnumValue(net, i)
                 subkeys[this_name] = this_val
-            if 'AutoConfigURL' in subkeys.keys() and len(subkeys['AutoConfigURL']) > 0:
+            if 'AutoConfigURL' in list(subkeys.keys()) and len(subkeys['AutoConfigURL']) > 0:
                 pac_files.append(subkeys['AutoConfigURL'])
         elif sys.platform == 'darwin':
@@ -53,8 +53,8 @@
             networks = sys_prefs['NetworkServices']
             # loop through each possible network (e.g. Ethernet, Airport...)
-            for network in networks.items():
+            for network in list(networks.items()):
                 # the first part is a long identifier
                 net_key, network = network
-                if 'ProxyAutoConfigURLString' in network['Proxies'].keys():
+                if 'ProxyAutoConfigURLString' in list(network['Proxies'].keys()):
                     pac_files.append(
                         network['Proxies']['ProxyAutoConfigURLString'])
@@ -73,5 +73,5 @@
             logging.debug('Trying pac file (%s)...' % this_pac_url)
             try:
-                response = urllib2.urlopen(
+                response = urllib.request.urlopen(
                     this_pac_url, timeout=self.timeout)
                 logging.debug('Succeeded (%s)...' % this_pac_url)
@@ -101,11 +101,11 @@
             # information is retrieved from the OS X System Configuration
             # Framework.
-            proxy = urllib2.ProxyHandler()
+            proxy = urllib.request.ProxyHandler()
         else:
             # If proxies is given, it must be a dictionary mapping protocol names to
             # URLs of proxies.
-            proxy = urllib2.ProxyHandler(proxy_dic)
-        opener = urllib2.build_opener(proxy)
-        urllib2.install_opener(opener)
+            proxy = urllib.request.ProxyHandler(proxy_dic)
+        opener = urllib.request.build_opener(proxy)
+        urllib.request.install_opener(opener)
 
     def connect(self):
@@ -114,10 +114,10 @@
         @return: response object from urllib2.urlopen
         '''
-        req = urllib2.Request(self.url)
+        req = urllib.request.Request(self.url)
         response = None
         try:
             logging.debug("Trying Direct connection to %s..."%self.url)
-            response = urllib2.urlopen(req, timeout=self.timeout)
-        except Exception, e:
+            response = urllib.request.urlopen(req, timeout=self.timeout)
+        except Exception as e:
             logging.debug("Failed!")
             logging.debug(e)
@@ -125,6 +125,6 @@
                 logging.debug("Trying to use system proxy if it exists...")
                 self._set_proxy()
-                response = urllib2.urlopen(req, timeout=self.timeout)
-            except Exception, e:
+                response = urllib.request.urlopen(req, timeout=self.timeout)
+            except Exception as e:
                 logging.debug("Failed!")
                 logging.debug(e)
@@ -135,6 +135,6 @@
                         logging.debug("Trying to use the proxy %s found in proxy.pac configuration"%proxy)
                         self._set_proxy(proxy)
-                        response = urllib2.urlopen(req, timeout=self.timeout)
-                    except Exception, e:
+                        response = urllib.request.urlopen(req, timeout=self.timeout)
+                    except Exception as e:
                         logging.debug("Failed!")
                         logging.debug(e)
@@ -151,5 +151,5 @@
     response = c.connect()
     if response is not None:
-        print 50 * '-'
+        print(50 * '-')
         content = json.loads(response.read().strip())
         pprint(content)
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 88e1f57e340b062a07d1e5693c8b7b8a4edc4b32)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision b0b09b9740526b0b3838f642e43599409dfd8772)
@@ -9,5 +9,5 @@
 import warnings
 import webbrowser
-import urlparse
+import urllib.parse
 
 warnings.simplefilter("ignore")
@@ -86,5 +86,5 @@
         #logging.error("Error loading %s/%s: %s" % (path, confg_file, sys.exc_value))
     except ValueError:
-        print "Value error"
+        print("Value error")
         pass
     finally:
@@ -242,6 +242,7 @@
     """
     assert isinstance(item, QtGui.QStandardItem)
-    assert isinstance(update_data, QtCore.QVariant)
-    py_update_data = update_data.toPyObject()
+    #assert isinstance(update_data, QtCore.QVariant)
+    #py_update_data = update_data.toPyObject()
+    py_update_data = update_data
 
     # Check if data with the same ID is already present
@@ -249,5 +250,5 @@
         plot_item = item.child(index)
         if plot_item.isCheckable():
-            plot_data = plot_item.child(0).data().toPyObject()
+            plot_data = plot_item.child(0).data() #.toPyObject()
             if plot_data.id is not None and plot_data.id == py_update_data.id:
                 # replace data section in item
@@ -270,6 +271,7 @@
     Adds QVariant 'update_data' to that row.
     """
-    assert isinstance(update_data, QtCore.QVariant)
-    py_update_data = update_data.toPyObject()
+    #assert isinstance(update_data, QtCore.QVariant)
+    #py_update_data = update_data.toPyObject()
+    py_update_data = update_data
 
     checkbox_item = QtGui.QStandardItem()
@@ -309,5 +311,6 @@
     object_item = QtGui.QStandardItem()
     object_item.setText(name)
-    object_item.setData(QtCore.QVariant(update_data))
+    #object_item.setData(QtCore.QVariant(update_data))
+    object_item.setData(update_data)
 
     # Append the new row to the main item
@@ -319,9 +322,8 @@
     """
     assert isinstance(model_item, QtGui.QStandardItemModel)
-    assert isinstance(filename, basestring)
+    assert isinstance(filename, str)
 
     # Iterate over model looking for named items
-    item = list(filter(lambda i: str(i.text()) == filename,
-                  [model_item.item(index) for index in range(model_item.rowCount())]))
+    item = list([i for i in [model_item.item(index) for index in range(model_item.rowCount())] if str(i.text()) == filename])
     return item[0] if len(item)>0 else None
 
@@ -331,5 +333,5 @@
     """
     assert isinstance(model_item, QtGui.QStandardItemModel)
-    assert isinstance(filename, basestring)
+    assert isinstance(filename, str)
 
     plot_data = []
@@ -339,5 +341,5 @@
         if str(item.text()) == filename:
             # TODO: assure item type is correct (either data1/2D or Plotter)
-            plot_data.append(item.child(0).data().toPyObject())
+            plot_data.append(item.child(0).data()) #.toPyObject())
             # Going 1 level deeper only
             for index_2 in range(item.rowCount()):
@@ -345,5 +347,5 @@
                 if item_2 and item_2.isCheckable():
                     # TODO: assure item type is correct (either data1/2D or Plotter)
-                    plot_data.append(item_2.child(0).data().toPyObject())
+                    plot_data.append(item_2.child(0).data()) #.toPyObject())
 
     return plot_data
@@ -361,5 +363,5 @@
         if item.isCheckable() and item.checkState() == QtCore.Qt.Checked:
             # TODO: assure item type is correct (either data1/2D or Plotter)
-            plot_data.append((item, item.child(0).data().toPyObject()))
+            plot_data.append((item, item.child(0).data())) #.toPyObject()))
         # Going 1 level deeper only
         for index_2 in range(item.rowCount()):
@@ -367,5 +369,5 @@
             if item_2 and item_2.isCheckable() and item_2.checkState() == QtCore.Qt.Checked:
                 # TODO: assure item type is correct (either data1/2D or Plotter)
-                plot_data.append((item_2, item_2.child(0).data().toPyObject()))
+                plot_data.append((item_2, item_2.child(0).data())) #.toPyObject()))
 
     return plot_data
@@ -419,10 +421,10 @@
     Check the URL first, though.
     """
-    parsed_url = urlparse.urlparse(url)
+    parsed_url = urllib.parse.urlparse(url)
     if parsed_url.scheme:
         webbrowser.open(url)
     else:
         msg = "Attempt at opening an invalid URL"
-        raise AttributeError, msg
+        raise AttributeError(msg)
 
 def retrieveData1d(data):
@@ -433,5 +435,5 @@
     if not isinstance(data, Data1D):
         msg = "Incorrect type passed to retrieveData1d"
-        raise AttributeError, msg
+        raise AttributeError(msg)
     try:
         xmin = min(data.x)
@@ -441,5 +443,5 @@
                     data.filename
         #logging.error(msg)
-        raise ValueError, msg
+        raise ValueError(msg)
 
     text = data.__str__()
@@ -485,5 +487,5 @@
     if not isinstance(data, Data2D):
         msg = "Incorrect type passed to retrieveData2d"
-        raise AttributeError, msg
+        raise AttributeError(msg)
 
     text = data.__str__()
@@ -499,5 +501,5 @@
     dy_val = 0.0
     len_data = len(data.qx_data)
-    for index in xrange(0, len_data):
+    for index in range(0, len_data):
         x_val = data.qx_data[index]
         y_val = data.qy_data[index]
@@ -756,5 +758,5 @@
     The assumption - data stored in SasView standard, in child 0
     """
-    return item.child(0).data().toPyObject()
+    return item.child(0).data() #.toPyObject()
 
 def formatNumber(value, high=False):
Index: src/sas/qtgui/Utilities/LocalConfig.py
===================================================================
--- src/sas/qtgui/Utilities/LocalConfig.py	(revision dc5ef150e8b37e01a3b7e253eb5b66d3b82de99c)
+++ src/sas/qtgui/Utilities/LocalConfig.py	(revision b0b09b9740526b0b3838f642e43599409dfd8772)
@@ -139,5 +139,5 @@
     """
     if __EVT_DEBUG__:
-        print "%g:  %s" % (time.clock(), message)
+        print("%g:  %s" % (time.clock(), message))
 
         if __EVT_DEBUG_2_FILE__:
Index: src/sas/qtgui/Utilities/ObjectLibrary.py
===================================================================
--- src/sas/qtgui/Utilities/ObjectLibrary.py	(revision 61a92d4c3e2e9b0410555517d59b1e8503c98ff4)
+++ src/sas/qtgui/Utilities/ObjectLibrary.py	(revision b0b09b9740526b0b3838f642e43599409dfd8772)
@@ -9,5 +9,5 @@
 
 def deleteObjectByRef(obj):
-    for name, object in this._objects.iteritems():
+    for name, object in this._objects.items():
         if object == obj:
             del this._objects[name]
@@ -22,5 +22,5 @@
 
 def listObjects():
-    return this._objects.keys()
+    return list(this._objects.keys())
 
 
Index: src/sas/qtgui/Utilities/SasviewLogger.py
===================================================================
--- src/sas/qtgui/Utilities/SasviewLogger.py	(revision 83eb5208b8acb86b064162274de583670f72da47)
+++ src/sas/qtgui/Utilities/SasviewLogger.py	(revision b0b09b9740526b0b3838f642e43599409dfd8772)
@@ -19,5 +19,5 @@
     def write(self, msg):
         if(not self.signalsBlocked()):
-            self.messageWritten.emit(unicode(msg))
+            self.messageWritten.emit(str(msg))
 
     @staticmethod
