Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision ad6b4e2ec9617a81f76dd82998ddb4e7e176db46)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 601178841ff508ca14f3d81fe3e15aa674294647)
@@ -34,4 +34,5 @@
 from sas.qtgui.Perspectives.Fitting.FitPage import FitPage
 from sas.qtgui.Perspectives.Fitting.ViewDelegate import ModelViewDelegate
+from sas.qtgui.Perspectives.Fitting.ViewDelegate import PolyViewDelegate
 
 TAB_MAGNETISM = 4
@@ -77,4 +78,8 @@
         self.chi2 = None
 
+        # Does the control support UNDO/REDO
+        # temporarily off
+        self.support_undo = False
+
         # Data for chosen model
         self.model_data = None
@@ -146,4 +151,6 @@
         self.setPolyModel()
         self.setTableProperties(self.lstPoly)
+        # Delegates for custom editing and display
+        self.lstPoly.setItemDelegate(PolyViewDelegate(self))
 
         # Magnetism model displayed in magnetism list
@@ -361,6 +368,8 @@
             self.createDefaultDataset()
 
-        # TODO: update state stack
-        #state = self.currentState()
+        # Update state stack
+        if self.support_undo:
+            state = self.currentState()
+            self.pushFitPage(state)
 
     def onSelectStructureFactor(self):
@@ -850,5 +859,4 @@
 
         # Extract changed value. Assumes proper validation by QValidator/Delegate
-        # TODO: disable model update for uneditable cells/columns
         try:
             value = float(item.text())
@@ -1068,12 +1076,12 @@
             checked_list = ["Distribution of "+param.name, str(param.default),
                             str(param.limits[0]), str(param.limits[1]),
-                            "35", "3", ""]
+                            "35", "3", "gaussian"]
             FittingUtilities.addCheckedListToModel(self._poly_model, checked_list)
 
             #TODO: Need to find cleaner way to input functions
-            func = QtGui.QComboBox()
-            func.addItems(['rectangle', 'array', 'lognormal', 'gaussian', 'schulz',])
-            func_index = self.lstPoly.model().index(row, 6)
-            self.lstPoly.setIndexWidget(func_index, func)
+            #func = QtGui.QComboBox()
+            #func.addItems(['rectangle', 'array', 'lognormal', 'gaussian', 'schulz',])
+            #func_index = self.lstPoly.model().index(row, 6)
+            #self.lstPoly.setIndexWidget(func_index, func)
 
         FittingUtilities.addPolyHeadersToModel(self._poly_model)
@@ -1179,5 +1187,4 @@
         self.q_range_max = fp.fit_options[fp.MAX_RANGE]
         self.npts = fp.fit_options[fp.NPTS]
-        #fp.fit_options[fp.NPTS_FIT] = self.npts_fit
         self.log_points = fp.fit_options[fp.LOG_POINTS]
         self.weighting = fp.fit_options[fp.WEIGHTING]
@@ -1258,5 +1265,5 @@
         Add a new fit page object with current state
         """
-        #page_stack.append(new_page)
+        self.page_stack.append(new_page)
         pass
 
@@ -1265,6 +1272,6 @@
         Remove top fit page from stack
         """
-        #if page_stack:
-        #    page_stack.pop()
+        if self.page_stack:
+            self.page_stack.pop()
         pass
 
Index: src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision 1bc27f17eb5c791b5a6b67eab47f42f7ad6e5377)
+++ src/sas/qtgui/Perspectives/Fitting/UnitTesting/FittingWidgetTest.py	(revision 601178841ff508ca14f3d81fe3e15aa674294647)
@@ -329,5 +329,5 @@
         for row in xrange(self.widget._poly_model.rowCount()):
             func_index = self.widget._poly_model.index(row, 6)
-            self.assertTrue(isinstance(self.widget.lstPoly.indexWidget(func_index), QtGui.QComboBox))
+            #self.assertTrue(isinstance(self.widget.lstPoly.indexWidget(func_index), QtGui.QComboBox))
             self.assertIn('Distribution of', self.widget._poly_model.item(row, 0).text())
 
Index: src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision ad6b4e2ec9617a81f76dd82998ddb4e7e176db46)
+++ src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision 601178841ff508ca14f3d81fe3e15aa674294647)
@@ -4,10 +4,30 @@
 import sas.qtgui.Utilities.GuiUtils as GuiUtils
 
-# Table view columns
-PROPERTY=0
-VALUE=1
-MIN=2
-MAX=3
-UNIT=4
+# Main parameter table view columns
+PARAM_PROPERTY=0
+PARAM_VALUE=1
+PARAM_MIN=2
+PARAM_MAX=3
+PARAM_UNIT=4
+
+# polydispersity functions
+POLYDISPERSE_FUNCTIONS=['rectangle', 'array', 'lognormal', 'gaussian', 'schulz']
+# polydispersity columns
+POLY_PARAMETER=0
+POLY_PD=1
+POLY_MIN=2
+POLY_MAX=3
+POLY_NPTS=4
+POLY_NSIGS=5
+POLY_FUNCTION=6
+
+class CustomLineEdit(QtGui.QLineEdit):
+    editingFinished = QtCore.pyqtSignal()
+    def __init__(self, parent=None, old_value=None):
+        super(CustomLineEdit, self).__init__(parent)
+        self.setAutoFillBackground(True)
+        self.old_value = old_value
+    def focusOutEvent(self, event):
+        self.editingFinished.emit()
 
 class ModelViewDelegate(QtGui.QStyledItemDelegate):
@@ -19,5 +39,5 @@
         Overwrite generic painter for certain columns
         """
-        if index.column() == UNIT or index.column() == MIN or index.column() == MAX:
+        if index.column() in (PARAM_UNIT, PARAM_MIN, PARAM_MAX):
             # Units - present in nice HTML
             options = QtGui.QStyleOptionViewItemV4(option)
@@ -50,10 +70,60 @@
             QtGui.QStyledItemDelegate.paint(self, painter, option, index)
 
-    #def sizeHint(self, option, index):
-    #    options = QtGui.QStyleOptionViewItemV4(option)
-    #    self.initStyleOption(options,index)
+    def createEditor(self, widget, option, index):
+        """
+        Overwrite generic editor for certain columns
+        """
+        if not index.isValid():
+            return 0
+        if index.column() == PARAM_VALUE: #only in the value column
+            editor = QtGui.QLineEdit(widget)
+            validator = QtGui.QDoubleValidator()
+            editor.setValidator(validator)
+            return editor
+        elif index.column() in (PARAM_MIN, PARAM_MAX):
+            # Save current value in case we need to revert
+            #self._old_value = index.data().toFloat()[0]
+            self._old_value = index.data().toString()
+            editor = CustomLineEdit(widget, old_value=self._old_value)
+            editor.editingFinished.connect(self.commitAndCloseEditor)
+            return editor
 
-    #    doc = QtGui.QTextDocument()
-    #    doc.setHtml(options.text)
-    #    doc.setTextWidth(options.rect.width())
-    #    return QtCore.QSize(doc.idealWidth(), doc.size().height())
+        return super(ModelViewDelegate, self).createEditor(widget, option, index)
+
+    #def setEditorData(self, editor, index):
+    #    if index.column() == MIN:
+    #        #value = index.data().toString()[0]
+    #        value = index.model().data(index, QtCore.Qt.DisplayRole).toString()
+    #        print "VALUE = ", value
+    #        editor.setText('['+value+']')
+    #        return editor
+
+    #    return super(ModelViewDelegate, self).setEditorData(editor, index)
+
+    def commitAndCloseEditor(self):
+            editor = self.sender()
+            content = editor.text()
+            try:
+                value_float = float(content)
+            except ValueError:
+                # TODO: Notify the user
+                # <scary popup>
+                # Do nothing
+                return
+            self.commitData.emit(editor)
+            self.closeEditor.emit(editor, QtGui.QAbstractItemDelegate.NoHint)
+
+
+class PolyViewDelegate(QtGui.QStyledItemDelegate):
+    """
+    Custom delegate for appearance and behavior control of the polydisperisty view
+    """
+    def createEditor(self, parent, option, index):
+        # TODO: set it to correct index on creation
+        if index.column() == POLY_FUNCTION:
+            editor = QtGui.QComboBox(parent)
+            for function in POLYDISPERSE_FUNCTIONS:
+                editor.addItem(function)
+            return editor
+        else:
+            QtGui.QStyledItemDelegate.createEditor(self, parent, option, index)
