Index: src/sas/qtgui/Calculators/DataOperationUtilityPanel.py
===================================================================
--- src/sas/qtgui/Calculators/DataOperationUtilityPanel.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Calculators/DataOperationUtilityPanel.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -56,5 +56,5 @@
 
         # validator for coefficient
-        self.txtNumber.setValidator(QtGui.QDoubleValidator())
+        self.txtNumber.setValidator(GuiUtils.DoubleValidator())
 
         self.layoutOutput = QtWidgets.QHBoxLayout()
Index: src/sas/qtgui/Calculators/GenericScatteringCalculator.py
===================================================================
--- src/sas/qtgui/Calculators/GenericScatteringCalculator.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Calculators/GenericScatteringCalculator.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -611,12 +611,12 @@
             'options': QtWidgets.QFileDialog.DontUseNativeDialog}
         # Query user for filename.
-        filename = str(QtWidgets.QFileDialog.getSaveFileName(**kwargs))
+        filename_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs)
+        filename = name_tuple[0]
         if filename:
             try:
-                if os.path.splitext(filename)[1].lower() == '.sld':
-                    sas_gen.SLDReader().write(filename, self.sld_data)
-                else:
-                    sas_gen.SLDReader().write('.'.join((filename, 'sld')),
-                                              self.sld_data)
+                _, extension = os.path.splitext(filename)
+                if not extension:
+                    filename = '.'.join((filename, 'sld'))
+                sas_gen.SLDReader().write(filename, self.sld_data)
             except:
                 raise
Index: src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py
===================================================================
--- src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Calculators/ResolutionCalculatorPanel.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -106,7 +106,7 @@
 
         # double validator
-        self.txtSource2SampleDistance.setValidator(QtGui.QDoubleValidator())
-        self.txtSample2DetectorDistance.setValidator(QtGui.QDoubleValidator())
-        self.txtSampleOffset.setValidator(QtGui.QDoubleValidator())
+        self.txtSource2SampleDistance.setValidator(GuiUtils.DoubleValidator())
+        self.txtSample2DetectorDistance.setValidator(GuiUtils.DoubleValidator())
+        self.txtSampleOffset.setValidator(GuiUtils.DoubleValidator())
 
         # call compute to calculate with default values
Index: src/sas/qtgui/MainWindow/DataExplorer.py
===================================================================
--- src/sas/qtgui/MainWindow/DataExplorer.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/MainWindow/DataExplorer.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -270,6 +270,10 @@
             'options'   : QtWidgets.QFileDialog.DontUseNativeDialog
         }
-        filename = str(QtWidgets.QFileDialog.getSaveFileName(**kwargs))
+        name_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs)
+        filename = name_tuple[0]
         if filename:
+            _, extension = os.path.splitext(filename)
+            if not extension:
+                filename = '.'.join((filename, 'json'))
             self.communicator.statusBarUpdateSignal.emit("Saving Project... %s\n" % os.path.basename(filename))
             with open(filename, 'w') as outfile:
@@ -1084,13 +1088,14 @@
         # TODO: fix this to resemble GuiUtils.updateModelItemWithPlot
         #
-        self.model.beginResetModel()
-        current_tab_name = model_item.text()[:2]
-        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)
-                break
-
-        # Reset the view
-        self.model.endResetModel()
+        ##self.model.beginResetModel()
+        ##current_tab_name = model_item.text()[:2]
+        ##for current_index in range(self.theory_model.rowCount()):
+            #if current_tab_name in self.theory_model.item(current_index).text():
+            #    return
+        ##        self.theory_model.removeRow(current_index)
+        ##        break
+
+        ### Reset the view
+        ##self.model.endResetModel()
 
         # Reset the view
Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -8,5 +8,5 @@
 from PyQt5.QtWidgets import *
 from PyQt5.QtGui import *
-from PyQt5.QtCore import Qt, QLocale
+from PyQt5.QtCore import Qt, QLocale, QUrl
 from PyQt5.QtWebKitWidgets import QWebView
 
@@ -55,4 +55,7 @@
         self._workspace = parent
         self._parent = parent
+
+        # Decide on a locale
+        QLocale.setDefault(QLocale('en_US'))
 
         # Add signal callbacks
Index: src/sas/qtgui/MainWindow/MainWindow.py
===================================================================
--- src/sas/qtgui/MainWindow/MainWindow.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/MainWindow/MainWindow.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -61,5 +61,5 @@
     # (unless you know what you're doing)
     import qt5reactor
-    # Using the Qt4 reactor wrapper from https://github.com/ghtdak/qtreactor
+    # Using the Qt5 reactor wrapper from https://github.com/ghtdak/qtreactor
     qt5reactor.install()
 
Index: src/sas/qtgui/Perspectives/Fitting/FittingOptions.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingOptions.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Perspectives/Fitting/FittingOptions.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -88,5 +88,5 @@
                 validator.setBottom(0)
             elif f_type == float:
-                validator = QtGui.QDoubleValidator()
+                validator = GuiUtils.DoubleValidator()
                 validator.setBottom(0)
             else:
Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -13,4 +13,8 @@
 from PyQt5 import QtWidgets
 from PyQt5 import QtWebKitWidgets
+# Officially QtWebEngineWidgets are the way to display HTML in Qt5,
+# but this module isn't ported to PyQt5 yet...
+# let's wait. In the meantime no Help.
+#from PyQt5 import QtWebEngineWidgets
 
 from sasmodels import product
@@ -51,5 +55,6 @@
 DEFAULT_POLYDISP_FUNCTION = 'gaussian'
 
-USING_TWISTED = True
+#USING_TWISTED = True
+USING_TWISTED = False
 
 class ToolTippedItemModel(QtGui.QStandardItemModel):
@@ -469,5 +474,5 @@
         menu = QtWidgets.QMenu()
         label = QtWidgets.QLabel(msg)
-        action = QtGui.QWidgetAction(self)
+        action = QtWidgets.QWidgetAction(self)
         action.setDefaultWidget(label)
         menu.addAction(action)
@@ -478,5 +483,5 @@
         Respond to select Model from list event
         """
-        model = str(self.cbModel.currentText())
+        model = self.cbModel.currentText()
 
         # empty combobox forced to be read
@@ -534,5 +539,5 @@
         Select Category from list
         """
-        category = str(self.cbCategory.currentText())
+        category = self.cbCategory.currentText()
         # Check if the user chose "Choose category entry"
         if category == CATEGORY_DEFAULT:
@@ -680,4 +685,6 @@
             helpfile = "mag_help.html"
         help_location = tree_location + helpfile
+
+        content = QtCore.QUrl(help_location)
         self.helpView.load(QtCore.QUrl(help_location))
         self.helpView.show()
@@ -733,6 +740,11 @@
             fitter = Fit()
             data = GuiUtils.dataFromItem(fit_index)
-            fitter.set_model(model, fit_id, params_to_fit, data=data,
+            try:
+                fitter.set_model(model, fit_id, params_to_fit, data=data,
                              constraints=constraints)
+            except ValueError as ex:
+                logging.error("Setting model parameters failed with: %s" % ex)
+                return
+
             qmin, qmax, _ = self.logic.computeRangeFromData(data)
             fitter.set_data(data=data, id=fit_id, smearer=smearer, qmin=qmin,
@@ -1522,5 +1534,5 @@
         residuals_plot.id = "Residual " + residuals_plot.id
         self.createNewIndex(residuals_plot)
-        self.communicate.plotUpdateSignal.emit([residuals_plot])
+        #self.communicate.plotUpdateSignal.emit([residuals_plot])
 
     def calcException(self, etype, value, tb):
Index: src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Perspectives/Fitting/OptionsWidget.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -8,4 +8,5 @@
 
 from sas.qtgui.Plotting.PlotterData import Data2D
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
 # Local UI
@@ -66,6 +67,6 @@
 
         # Let only floats in the range edits
-        self.txtMinRange.setValidator(QtGui.QDoubleValidator())
-        self.txtMaxRange.setValidator(QtGui.QDoubleValidator())
+        self.txtMinRange.setValidator(GuiUtils.DoubleValidator())
+        self.txtMaxRange.setValidator(GuiUtils.DoubleValidator())
         # Let only ints in the number of points edit
         self.txtNpts.setValidator(QtGui.QIntValidator())
Index: src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Perspectives/Fitting/SmearingWidget.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -8,4 +8,5 @@
 from sas.qtgui.Plotting.PlotterData import Data1D
 from sas.qtgui.Plotting.PlotterData import Data2D
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
 # Local UI
@@ -51,6 +52,6 @@
         self.parent = parent
         # Let only floats in the line edits
-        self.txtSmearDown.setValidator(QtGui.QDoubleValidator())
-        self.txtSmearUp.setValidator(QtGui.QDoubleValidator())
+        self.txtSmearDown.setValidator(GuiUtils.DoubleValidator())
+        self.txtSmearUp.setValidator(GuiUtils.DoubleValidator())
 
         # Attach slots
Index: src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -4,10 +4,4 @@
 
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
-
-class CommaLessValidator(QtGui.QDoubleValidator):
-    """
-    Custom double validator which doesn't allow for commas to be used as decimal point
-    """
-    pass
 
 class ModelViewDelegate(QtWidgets.QStyledItemDelegate):
@@ -87,5 +81,5 @@
         if index.column() == self.param_value: #only in the value column
             editor = QtWidgets.QLineEdit(widget)
-            validator = QtGui.QDoubleValidator()
+            validator = GuiUtils.DoubleValidator()
             editor.setValidator(validator)
             return editor
@@ -168,5 +162,5 @@
         elif index.column() in self.editableParameters():
             self.editor = QtWidgets.QLineEdit(widget)
-            validator = QtGui.QDoubleValidator()
+            validator = GuiUtils.DoubleValidator()
             self.editor.setValidator(validator)
             return self.editor
@@ -246,5 +240,5 @@
         if index.column() in self.editableParameters():
             editor = QtWidgets.QLineEdit(widget)
-            validator = QtGui.QDoubleValidator()
+            validator = GuiUtils.DoubleValidator()
             editor.setValidator(validator)
             return editor
Index: src/sas/qtgui/Plotting/BoxSum.py
===================================================================
--- src/sas/qtgui/Plotting/BoxSum.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Plotting/BoxSum.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -5,4 +5,6 @@
 from PyQt5 import QtGui
 from PyQt5 import QtWidgets
+
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
 # Local UI
@@ -17,8 +19,8 @@
         assert isinstance(model, QtGui.QStandardItemModel)
 
-        self.txtBoxHeight.setValidator(QtGui.QDoubleValidator())
-        self.txtBoxWidth.setValidator(QtGui.QDoubleValidator())
-        self.txtCenterX.setValidator(QtGui.QDoubleValidator())
-        self.txtCenterY.setValidator(QtGui.QDoubleValidator())
+        self.txtBoxHeight.setValidator(GuiUtils.DoubleValidator())
+        self.txtBoxWidth.setValidator(GuiUtils.DoubleValidator())
+        self.txtCenterX.setValidator(GuiUtils.DoubleValidator())
+        self.txtCenterY.setValidator(GuiUtils.DoubleValidator())
 
         self.model = model
Index: src/sas/qtgui/Plotting/ColorMap.py
===================================================================
--- src/sas/qtgui/Plotting/ColorMap.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Plotting/ColorMap.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -13,5 +13,5 @@
 from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
 from sas.qtgui.Plotting.PlotterData import Data2D
-from sas.qtgui.Utilities.GuiUtils import formatNumber
+from sas.qtgui.Utilities.GuiUtils import formatNumber, DoubleValidator
 from .rangeSlider import RangeSlider
 
@@ -51,8 +51,8 @@
 
         # Initialize validators on amplitude textboxes
-        validator_min = QtGui.QDoubleValidator(self.txtMinAmplitude)
+        validator_min = DoubleValidator(self.txtMinAmplitude)
         validator_min.setNotation(0)
         self.txtMinAmplitude.setValidator(validator_min)
-        validator_max = QtGui.QDoubleValidator(self.txtMaxAmplitude)
+        validator_max = DoubleValidator(self.txtMaxAmplitude)
         validator_max.setNotation(0)
         self.txtMaxAmplitude.setValidator(validator_max)
Index: src/sas/qtgui/Plotting/LinearFit.py
===================================================================
--- src/sas/qtgui/Plotting/LinearFit.py	(revision 7969b9cd4da902481490aee839cad862a47ed05a)
+++ src/sas/qtgui/Plotting/LinearFit.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -8,5 +8,5 @@
 from PyQt5 import QtWidgets
 
-from sas.qtgui.Utilities.GuiUtils import formatNumber
+from sas.qtgui.Utilities.GuiUtils import formatNumber, DoubleValidator
 
 from sas.qtgui.Plotting import Fittings
@@ -43,6 +43,6 @@
         self.y_is_log = self.yLabel == "log10(y)"
 
-        self.txtFitRangeMin.setValidator(QtGui.QDoubleValidator())
-        self.txtFitRangeMax.setValidator(QtGui.QDoubleValidator())
+        self.txtFitRangeMin.setValidator(DoubleValidator())
+        self.txtFitRangeMax.setValidator(DoubleValidator())
 
         # Default values in the line edits
@@ -158,10 +158,10 @@
         y_model = self.model.run(xmin)
         tempx.append(xminView)
-        tempy.append(numpy.power(10, y_model) if self.y_is_log else y_model)
+        tempy.append(numpy.power(10.0, y_model) if self.y_is_log else y_model)
 
         # load tempy with the maximum transformation
         y_model = self.model.run(xmax)
         tempx.append(xmaxView)
-        tempy.append(numpy.power(10, y_model) if self.y_is_log else y_model)
+        tempy.append(numpy.power(10.0, y_model) if self.y_is_log else y_model)
 
         # Set the fit parameter display when  FitDialog is opened again
@@ -247,9 +247,9 @@
             return numpy.sqrt(numpy.sqrt(x))
         elif self.xLabel == "log10(x)":
-            return numpy.power(10, x)
+            return numpy.power(10.0, x)
         elif self.xLabel == "ln(x)":
             return numpy.exp(x)
         elif self.xLabel == "log10(x^(4))":
-            return numpy.sqrt(numpy.sqrt(numpy.power(10, x)))
+            return numpy.sqrt(numpy.sqrt(numpy.power(10.0, x)))
         return x
 
Index: src/sas/qtgui/Plotting/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotting/Plotter2D.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Plotting/Plotter2D.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -3,4 +3,5 @@
 import pylab
 import functools
+import logging
 
 from PyQt5 import QtCore
@@ -126,9 +127,11 @@
         zmax_temp = self.zmax
         # self.scale predefined in the baseclass
+        # in numpy > 1.12 power(int, -int) raises ValueException
+        # "Integers to negative integer powers are not allowed."
         if self.scale == 'log_{10}':
             if self.zmin is not None:
-                zmin_temp = numpy.power(10, self.zmin)
+                zmin_temp = numpy.power(10.0, self.zmin)
             if self.zmax is not None:
-                zmax_temp = numpy.power(10, self.zmax)
+                zmax_temp = numpy.power(10.0, self.zmax)
         else:
             if self.zmin is not None:
@@ -289,4 +292,5 @@
         new_plot.is_data = True
         GuiUtils.updateModelItemWithPlot(self._item, new_plot, new_plot.id)
+
         self.manager.communicator.plotUpdateSignal.emit([new_plot])
 
Index: src/sas/qtgui/Plotting/SetGraphRange.py
===================================================================
--- src/sas/qtgui/Plotting/SetGraphRange.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Plotting/SetGraphRange.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -5,4 +5,6 @@
 from PyQt5 import QtGui
 from PyQt5 import QtWidgets
+
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
 # Local UI
@@ -18,8 +20,8 @@
         assert(isinstance(y_range, tuple))
 
-        self.txtXmin.setValidator(QtGui.QDoubleValidator())
-        self.txtXmax.setValidator(QtGui.QDoubleValidator())
-        self.txtYmin.setValidator(QtGui.QDoubleValidator())
-        self.txtYmax.setValidator(QtGui.QDoubleValidator())
+        self.txtXmin.setValidator(GuiUtils.DoubleValidator())
+        self.txtXmax.setValidator(GuiUtils.DoubleValidator())
+        self.txtYmin.setValidator(GuiUtils.DoubleValidator())
+        self.txtYmax.setValidator(GuiUtils.DoubleValidator())
 
         self.txtXmin.setText(str(x_range[0]))
Index: src/sas/qtgui/Plotting/SlicerModel.py
===================================================================
--- src/sas/qtgui/Plotting/SlicerModel.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Plotting/SlicerModel.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -1,3 +1,4 @@
 from PyQt5 import QtGui
+from PyQt5 import QtCore
 
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
Index: src/sas/qtgui/Plotting/SlicerParameters.py
===================================================================
--- src/sas/qtgui/Plotting/SlicerParameters.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Plotting/SlicerParameters.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -8,4 +8,6 @@
 from PyQt5 import QtWidgets
 from PyQt5 import QtWebKitWidgets
+
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
 # Local UI
@@ -126,7 +128,7 @@
             super(PositiveDoubleEditor, self).__init__(parent)
             self.setAutoFillBackground(True)
-            validator = QtGui.QDoubleValidator()
+            validator = GuiUtils.DoubleValidator()
             # Don't use the scientific notation, cause 'e'.
-            validator.setNotation(QtGui.QDoubleValidator.StandardNotation)
+            validator.setNotation(GuiUtils.DoubleValidator.StandardNotation)
 
             self.setValidator(validator)
Index: src/sas/qtgui/Plotting/Slicers/SectorSlicer.py
===================================================================
--- src/sas/qtgui/Plotting/Slicers/SectorSlicer.py	(revision 4992ff2626be19df7de9e5dfc0078b96bf47a75e)
+++ src/sas/qtgui/Plotting/Slicers/SectorSlicer.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -3,4 +3,5 @@
 """
 import numpy
+import logging
 
 from .BaseInteractor import BaseInteractor
@@ -167,4 +168,5 @@
         new_plot.is_data = True
         GuiUtils.updateModelItemWithPlot(self._item, new_plot, new_plot.id)
+
         self.base.manager.communicator.plotUpdateSignal.emit([new_plot])
 
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision fbfc488f82ca4192217ad32b69f00fc4a4e137ab)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision d6b8a1dfaf6521ae4a9054d5195def2810d6d8bc)
@@ -584,11 +584,10 @@
     }
     # Query user for filename.
-    filename = QtWidgets.QFileDialog.getSaveFileName(**kwargs)
+    filename_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs)
+    filename = filename_tuple[0]
 
     # User cancelled.
     if not filename:
         return
-
-    filename = str(filename)
 
     #Instantiate a loader
@@ -616,10 +615,11 @@
     }
     # Query user for filename.
-    filename = QtWidgets.QFileDialog.getSaveFileName(**kwargs)
+    filename_tuple = QtWidgets.QFileDialog.getSaveFileName(**kwargs)
+    filename = filename_tuple[0]
 
     # User cancelled.
     if not filename:
         return
-    filename = str(filename)
+
     #Instantiate a loader
     loader = Loader()
@@ -825,2 +825,22 @@
     else:
         raise ValueError
+
+class DoubleValidator(QtGui.QDoubleValidator):
+    """
+    Allow only dots as decimal separator
+    """
+    def validate(self, input, pos):
+        """
+        Return invalid for commas
+        """
+        if (',' in input):
+            return (QtGui.QValidator.Invalid, input, pos)
+        return super(DoubleValidator, self).validate(input, pos)
+
+    def fixup(self, input):
+        """
+        Correct (remove) potential preexisting content
+        """
+        QtGui.QDoubleValidator.fixup(input)
+        input = input.replace(",", "")
+
