Index: src/sas/qtgui/Plotter2D.py
===================================================================
--- src/sas/qtgui/Plotter2D.py	(revision 7b8485f896424de6f8b9b923a507708c4ea300d1)
+++ src/sas/qtgui/Plotter2D.py	(revision 161713c8e6fadc0d5442315916ec49e4df8f4dee)
@@ -136,9 +136,9 @@
         self.actionDataInfo = self.contextMenu.addAction("&DataInfo")
         self.actionDataInfo.triggered.connect(
-            functools.partial(self.onDataInfo, self.data))
+             functools.partial(self.onDataInfo, self.data))
 
         self.actionSavePointsAsFile = self.contextMenu.addAction("&Save Points as a File")
         self.actionSavePointsAsFile.triggered.connect(
-            functools.partial(self.onSavePoints, self.data))
+             functools.partial(self.onSavePoints, self.data))
         self.contextMenu.addSeparator()
 
@@ -225,5 +225,6 @@
         self.param_model = self.slicer.model()
         # Pass the model to the Slicer Parameters widget
-        self.slicer_widget = SlicerParameters(model=self.param_model)
+        self.slicer_widget = SlicerParameters(model=self.param_model,
+                                              validate_method=self.slicer.validate)
         self.slicer_widget.close_signal.connect(slicer_closed)
         # Add the plot to the workspace
Index: src/sas/qtgui/SlicerModel.py
===================================================================
--- src/sas/qtgui/SlicerModel.py	(revision 3bdbfcc5cdff8a3a11a9bb19c1cc8c3660a9c2e2)
+++ src/sas/qtgui/SlicerModel.py	(revision 161713c8e6fadc0d5442315916ec49e4df8f4dee)
@@ -52,2 +52,6 @@
         raise NotImplementedError("Parameter setter must be implemented in derived class.")
 
+    def validate(self):
+        ''' pure virtual '''
+        raise NotImplementedError("Validator must be implemented in derived class.")
+
Index: src/sas/qtgui/SlicerParameters.py
===================================================================
--- src/sas/qtgui/SlicerParameters.py	(revision 9a05a8d537376776734741891d71dabadf82aae0)
+++ src/sas/qtgui/SlicerParameters.py	(revision 161713c8e6fadc0d5442315916ec49e4df8f4dee)
@@ -2,4 +2,5 @@
 Allows users to modify the box slicer parameters.
 """
+import numpy
 import functools
 from PyQt4 import QtGui
@@ -16,11 +17,13 @@
     """
     close_signal = QtCore.pyqtSignal()
-    def __init__(self, model=None):
+    def __init__(self, model=None, validate_method=None):
         super(SlicerParameters, self).__init__()
 
         self.setupUi(self)
+
         assert isinstance(model, QtGui.QStandardItemModel)
 
         self.model = model
+        self.validate_method = validate_method
 
         # Define a proxy model so cell enablement can be finegrained.
@@ -35,5 +38,7 @@
 
         # Specify the validator on the parameter value column.
-        self.lstParams.setItemDelegate(ValidatedItemDelegate())
+        self.delegate = EditDelegate(self, validate_method=self.validate_method)
+        self.lstParams.setItemDelegate(self.delegate)
+        self.delegate.refocus_signal.connect(self.onFocus)
 
         # Display Help on clicking the button
@@ -53,4 +58,10 @@
         header.setStretchLastSection(True)
 
+    def onFocus(self, row, column):
+        """ Set the focus on the cell (row, column) """
+        selection_model = self.lstParams.selectionModel()
+        selection_model.select(self.model.index(row, column), QtGui.QItemSelectionModel.Select)
+        self.lstParams.setSelectionModel(selection_model)
+        self.lstParams.setCurrentIndex(self.model.index(row, column))
 
     def setModel(self, model):
@@ -105,19 +116,60 @@
         return flags
 
+class PositiveDoubleEditor(QtGui.QLineEdit):
+    # a signal to tell the delegate when we have finished editing
+    editingFinished = QtCore.Signal()
 
-class ValidatedItemDelegate(QtGui.QStyledItemDelegate):
-    """
-    Simple delegate enabling adding a validator to a cell editor.
-    """
-    def createEditor(self, widget, option, index):
-        '''Overwrite default editor'''
-        if not index.isValid():
-            return 0
-        if index.column() == 1: # Edir only cells in the second column
-            editor = QtGui.QLineEdit(widget)
+    def __init__(self, parent=None):
+            # Initialize the editor object
+            super(PositiveDoubleEditor, self).__init__(parent)
+            self.setAutoFillBackground(True)
             validator = QtGui.QDoubleValidator()
             # Don't use the scientific notation, cause 'e'.
             validator.setNotation(QtGui.QDoubleValidator.StandardNotation)
-            editor.setValidator(validator)
-            return editor
-        return super(ValidatedItemDelegate, self).createEditor(widget, option, index)
+
+            self.setValidator(validator)
+
+    def focusOutEvent(self, event):
+            # Once focus is lost, tell the delegate we're done editing
+            self.editingFinished.emit()
+
+
+class EditDelegate(QtGui.QStyledItemDelegate):
+    refocus_signal = QtCore.pyqtSignal(int, int)
+    def __init__(self, parent=None, validate_method=None):
+        super(EditDelegate, self).__init__(parent)
+        self.editor = None
+        self.index = None
+        self.validate_method = validate_method
+
+    def createEditor(self, parent, option, index):
+        # Creates and returns the custom editor object we will use to edit the cell
+        if not index.isValid():
+            return 0
+
+        result = index.column()
+        if result==1:
+                self.editor = PositiveDoubleEditor(parent)
+                self.index = index
+                return self.editor
+        else:
+                return QtGui.QStyledItemDelegate.createEditor(self, parent, option, index)
+
+    def setModelData(self, editor, model, index):
+        """
+        Custom version of the model update, rejecting bad values
+        """
+        self.index = index
+
+        # Find out the changed parameter name and proposed value
+        new_value = self.editor.text().toFloat()[0]
+        param_name = str(model.sourceModel().item(index.row(),0).text())
+
+        validated = True
+        if self.validate_method:
+            # Validate the proposed value in the slicer
+            value_accepted = self.validate_method(param_name, new_value)
+
+        if value_accepted:
+            # Update the model only if value accepted
+            return super(EditDelegate, self).setModelData(editor, model, index)          
Index: src/sas/sasgui/guiframe/local_perspectives/plotting/AnnulusSlicer.py
===================================================================
--- src/sas/sasgui/guiframe/local_perspectives/plotting/AnnulusSlicer.py	(revision 3bdbfcc5cdff8a3a11a9bb19c1cc8c3660a9c2e2)
+++ src/sas/sasgui/guiframe/local_perspectives/plotting/AnnulusSlicer.py	(revision 161713c8e6fadc0d5442315916ec49e4df8f4dee)
@@ -154,4 +154,34 @@
         self.draw()
 
+    def validate(self, param_name, param_value):
+        """
+        Test the proposed new value "value" for row "row" of parameters
+        """
+        MIN_DIFFERENCE = 0.01
+        isValid = True
+
+        if param_name == 'inner_radius':
+            # First, check the closeness
+            if numpy.fabs(param_value - self.getParams()['outer_radius']) < MIN_DIFFERENCE:
+                print("Inner and outer radii too close. Please adjust.")
+                isValid = False
+            elif param_value > self.qmax:
+                print("Inner radius exceeds maximum range. Please adjust.")
+                isValid = False
+        elif param_name == 'outer_radius':
+            # First, check the closeness
+            if numpy.fabs(param_value - self.getParams()['inner_radius']) < MIN_DIFFERENCE:
+                print("Inner and outer radii too close. Please adjust.")
+                isValid = False
+            elif param_value > self.qmax:
+                print("Outer radius exceeds maximum range. Please adjust.")
+                isValid = False
+        elif param_name == 'nbins':
+            # Can't be 0
+            if param_value < 1:
+                print("Number of bins cannot be less than or equal to 0. Please adjust.")
+                isValid = False
+
+        return isValid
 
     def moveend(self, ev):
Index: src/sas/sasgui/guiframe/local_perspectives/plotting/AzimutSlicer.py
===================================================================
--- src/sas/sasgui/guiframe/local_perspectives/plotting/AzimutSlicer.py	(revision d85c194ea2f78cb2b9b3de9c969e1b8ebea6b6d2)
+++ src/sas/sasgui/guiframe/local_perspectives/plotting/AzimutSlicer.py	(revision 161713c8e6fadc0d5442315916ec49e4df8f4dee)
@@ -182,4 +182,12 @@
                      NewPlotEvent(plot=new_plot, title=str(new_sector.__name__)))
 
+
+    def validate(self, param_name, param_value):
+        """
+        Test the proposed new value "value" for row "row" of parameters
+        """
+        # Here, always return true
+        return True
+
     def moveend(self, ev):
         #TODO: why is this empty?
Index: src/sas/sasgui/guiframe/local_perspectives/plotting/SectorSlicer.py
===================================================================
--- src/sas/sasgui/guiframe/local_perspectives/plotting/SectorSlicer.py	(revision 57b7ee2a03730ca7183c233fa0fcae728926ee09)
+++ src/sas/sasgui/guiframe/local_perspectives/plotting/SectorSlicer.py	(revision 161713c8e6fadc0d5442315916ec49e4df8f4dee)
@@ -176,4 +176,23 @@
         self.draw()
 
+    def validate(self, param_name, param_value):
+        """
+        Test the proposed new value "value" for row "row" of parameters
+        """
+        MIN_DIFFERENCE = 0.01
+        isValid = True
+
+        if param_name == 'Delta_Phi [deg]':
+            # First, check the closeness
+            if numpy.fabs(param_value) < MIN_DIFFERENCE:
+                print("Sector angles too close. Please adjust.")
+                isValid = False
+        elif param_name == 'nbins':
+            # Can't be 0
+            if param_value < 1:
+                print("Number of bins cannot be less than or equal to 0. Please adjust.")
+                isValid = False
+        return isValid
+
     def moveend(self, ev):
         """
