Index: setup.py
===================================================================
--- setup.py	(revision fa81e94af983227efded2314c2c544f98e2c56ba)
+++ setup.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
@@ -386,4 +386,10 @@
     "src", "sas", "qtgui", "Perspectives", "Inversion", "UI")
 packages.extend(["sas.qtgui.Perspectives.Inversion", "sas.qtgui.Perspectives.Inversion.UI"])
+
+package_dir["sas.qtgui.Perspectives.Corfunc"] = os.path.join(
+    "src", "sas", "qtgui", "Perspectives", "Corfunc")
+package_dir["sas.qtgui.Perspectives.Corfunc.UI"] = os.path.join(
+    "src", "sas", "qtgui", "Perspectives", "Corfunc", "UI")
+packages.extend(["sas.qtgui.Perspectives.Corfunc", "sas.qtgui.Perspectives.Corfunc.UI"])
 
 ## Plotting
Index: src/sas/qtgui/GUITests.py
===================================================================
--- src/sas/qtgui/GUITests.py	(revision 7c487846c7ed6f3baee2597fb61629d47eb38267)
+++ src/sas/qtgui/GUITests.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
@@ -82,6 +82,4 @@
         # Main window
         unittest.makeSuite(DataExplorerTest.DataExplorerTest,  'test'),
-
-        unittest.makeSuite(GuiUtilsTest.GuiUtilsTest,          'test'),
         unittest.makeSuite(DroppableDataLoadWidgetTest.DroppableDataLoadWidgetTest, 'test'),
         unittest.makeSuite(MainWindowTest.MainWindowTest,      'test'),
@@ -91,6 +89,9 @@
 
         # Utilities
-        unittest.makeSuite(TestUtilsTest.TestUtilsTest,         'test'),
-        unittest.makeSuite(SasviewLoggerTest.SasviewLoggerTest, 'test'),
+        unittest.makeSuite(TestUtilsTest.TestUtilsTest,           'test'),
+        unittest.makeSuite(SasviewLoggerTest.SasviewLoggerTest,   'test'),
+        unittest.makeSuite(GuiUtilsTest.GuiUtilsTest,             'test'),
+        unittest.makeSuite(GuiUtilsTest.DoubleValidatorTest,      'test'),
+        unittest.makeSuite(GuiUtilsTest.HashableStandardItemTest, 'test'),
 
         # Calculators
Index: src/sas/qtgui/MainWindow/DataManager.py
===================================================================
--- src/sas/qtgui/MainWindow/DataManager.py	(revision b3e8629bf18b74f4214d6552e620fcbc4e73a28c)
+++ src/sas/qtgui/MainWindow/DataManager.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
@@ -126,6 +126,10 @@
         rename data
         """
-        ## name of the data allow to differentiate data when plotted
-        name = GuiUtils.parseName(name=name, expression="_")
+        # name of the data allow to differentiate data when plotted
+        try:
+            name = GuiUtils.parseName(name=name, expression="_")
+        except TypeError:
+            # bad name sent to rename
+            return None
 
         max_char = name.find("[")
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 7c487846c7ed6f3baee2597fb61629d47eb38267)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
@@ -591,5 +591,5 @@
             try:
                 value = GuiUtils.toDouble(item.text())
-            except ValueError:
+            except TypeError:
                 # Can't be converted properly, bring back the old value and exit
                 return
@@ -606,5 +606,5 @@
             try:
                 value = GuiUtils.toDouble(item.text())
-            except ValueError:
+            except TypeError:
                 # Can't be converted properly, bring back the old value and exit
                 return
@@ -639,5 +639,5 @@
         try:
             value = GuiUtils.toDouble(item.text())
-        except ValueError:
+        except TypeError:
             # Unparsable field
             return
@@ -1310,5 +1310,5 @@
         try:
             value = GuiUtils.toDouble(item.text())
-        except ValueError:
+        except TypeError:
             # Unparsable field
             return
Index: src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py	(revision 6a3e1fed96400e06c3fff6a0cf0316fe8169b0d5)
+++ src/sas/qtgui/Perspectives/Inversion/DMaxExplorerWidget.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
@@ -45,5 +45,5 @@
         self.setupUi(self)
 
-        self.setWindowTitle("Dâââ Explorer")
+        self.setWindowTitle("Dââ Explorer")
 
         self.pr_state = pr_state
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision 6a3e1fed96400e06c3fff6a0cf0316fe8169b0d5)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
@@ -271,5 +271,5 @@
     """
     def __init__(self, parent=None):
-        super(QtGui.QStandardItem, self).__init__()
+        super(HashableStandardItem, self).__init__()
 
     def __hash__(self):
@@ -277,4 +277,10 @@
         #return hash(self.__init__)
         return 0
+
+    def clone(self):
+        ''' Assure __hash__ is cloned as well'''
+        clone = super(HashableStandardItem, self).clone()
+        clone.__hash__ = self.__hash__
+        return clone
 
 
@@ -561,5 +567,5 @@
     with open(path,'w') as out:
         has_errors = True
-        if data.dy is None or not data.dy:
+        if data.dy is None or not data.dy.any():
             has_errors = False
         # Sanity check
@@ -571,5 +577,5 @@
                 has_errors = False
         if has_errors:
-            if data.dx is not None and data.dx:
+            if data.dx is not None and data.dx.any():
                 out.write("<X>   <Y>   <dY>   <dX>\n")
             else:
@@ -580,5 +586,5 @@
         for i in range(len(data.x)):
             if has_errors:
-                if data.dx is not None and data.dx:
+                if data.dx is not None and data.dx.any():
                     if  data.dx[i] is not None:
                         out.write("%g  %g  %g  %g\n" % (data.x[i],
@@ -857,5 +863,5 @@
         return value[0]
     else:
-        raise ValueError
+        raise TypeError
 
 class DoubleValidator(QtGui.QDoubleValidator):
@@ -867,5 +873,5 @@
         Return invalid for commas
         """
-        if (',' in input):
+        if input is not None and ',' in input:
             return (QtGui.QValidator.Invalid, input, pos)
         return super(DoubleValidator, self).validate(input, pos)
@@ -875,5 +881,5 @@
         Correct (remove) potential preexisting content
         """
-        QtGui.QDoubleValidator.fixup(input)
+        super(DoubleValidator, self).fixup(input)
         input = input.replace(",", "")
 
Index: src/sas/qtgui/Utilities/UnitTesting/GuiUtilsTest.py
===================================================================
--- src/sas/qtgui/Utilities/UnitTesting/GuiUtilsTest.py	(revision 53c771ed573b1c8716ecc969b54a1d617a4cb931)
+++ src/sas/qtgui/Utilities/UnitTesting/GuiUtilsTest.py	(revision 0261bc13615593f5eb2e08941252c044b8bb2e3b)
@@ -414,4 +414,88 @@
         self.assertEqual(yscale, "log")
 
+    def testParseName(self):
+        '''test parse out a string from the beinning of a string'''
+        # good input
+        value = "_test"
+        self.assertEqual(parseName(value, '_'), 'test')
+        value = "____test____"
+        self.assertEqual(parseName(value, '_'), '___test____')
+        self.assertEqual(parseName(value, '___'), '_test____')
+        self.assertEqual(parseName(value, 'test'), '____test____')
+        # bad input
+        with self.assertRaises(TypeError):
+            parseName(value, None)
+        with self.assertRaises(TypeError):
+            parseName(None, '_')
+        value = []
+        with self.assertRaises(TypeError):
+            parseName(value, '_')
+        value = 1.44
+        with self.assertRaises(TypeError):
+            parseName(value, 'p')
+        value = 100
+        with self.assertRaises(TypeError):
+            parseName(value, 'p')
+
+    def testToDouble(self):
+        '''test homemade string-> double converter'''
+        #good values
+        value = "1"
+        self.assertEqual(toDouble(value), 1.0)
+        value = "1.2"
+        # has to be AlmostEqual due to numerical rounding
+        self.assertAlmostEqual(toDouble(value), 1.2, 6)
+        value = "2,1"
+        self.assertAlmostEqual(toDouble(value), 2.1, 6)
+
+        # bad values
+        value = None
+        with self.assertRaises(TypeError):
+            toDouble(value)
+        value = "MyDouble"
+        with self.assertRaises(TypeError):
+            toDouble(value)
+        value = [1,2.2]
+        with self.assertRaises(TypeError):
+            toDouble(value)
+
+
+class DoubleValidatorTest(unittest.TestCase):
+    """ Test the validator for floats """
+    def setUp(self):
+        '''Create the validator'''
+        self.validator = DoubleValidator()
+
+    def tearDown(self):
+        '''Destroy the validator'''
+        self.validator = None
+
+    def testValidateGood(self):
+        """Test a valid float """
+        QtCore.QLocale.setDefault(QtCore.QLocale('en_US'))
+        float_good = "170"
+        self.assertEqual(self.validator.validate(float_good, 1)[0], QtGui.QValidator.Acceptable)
+        float_good = "170.11"
+        ## investigate: a double returns Invalid here!
+        ##self.assertEqual(self.validator.validate(float_good, 1)[0], QtGui.QValidator.Acceptable)
+        float_good = "17e2"
+        self.assertEqual(self.validator.validate(float_good, 1)[0], QtGui.QValidator.Acceptable)
+
+    def testValidateBad(self):
+        """Test a bad float """
+        float_bad = None
+        self.assertEqual(self.validator.validate(float_bad, 1)[0], QtGui.QValidator.Intermediate)
+        float_bad = [1]
+        with self.assertRaises(TypeError):
+           self.validator.validate(float_bad, 1)
+        float_bad = "1,3"
+        self.assertEqual(self.validator.validate(float_bad, 1)[0], QtGui.QValidator.Invalid)
+
+    def notestFixup(self):
+        """Fixup of a float"""
+        float_to_fixup = "1,3"
+        self.validator.fixup(float_to_fixup)
+        self.assertEqual(float_to_fixup, "13")
+
 
 class FormulaValidatorTest(unittest.TestCase):
@@ -434,5 +518,5 @@
 
     def testValidateBad(self):
-        """Test a valid Formula """
+        """Test an invalid Formula """
         formula_bad = "H24 %%%O12C4C6N2Pu"
         self.assertRaises(self.validator.validate(formula_bad, 1)[0])
@@ -442,4 +526,28 @@
         self.assertEqual(self.validator.validate(formula_bad, 1)[0], QtGui.QValidator.Intermediate)
 
+class HashableStandardItemTest(unittest.TestCase):
+    """ Test the reimplementation of QStandardItem """
+    def setUp(self):
+        '''Create the validator'''
+        self.item = HashableStandardItem()
+
+    def tearDown(self):
+        '''Destroy the validator'''
+        self.item = None
+
+    def testHash(self):
+        '''assure the item returns hash'''
+        self.assertEqual(self.item.__hash__(), 0)
+
+    def testIndexing(self):
+        '''test that we can use HashableSI as an index'''
+        dictionary = {}
+        dictionary[self.item] = "wow!"
+        self.assertEqual(dictionary[self.item], "wow!")
+
+    def testClone(self):
+        '''let's see if we can clone the item'''
+        item_clone = self.item.clone()
+        self.assertEqual(item_clone.__hash__(), 0)
 
 if __name__ == "__main__":
