Index: src/sas/qtgui/Perspectives/Fitting/FittingWidget.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision b00414d0f96303efbf5b902fc069bbc4e165923d)
+++ src/sas/qtgui/Perspectives/Fitting/FittingWidget.py	(revision 0d138146627d7bf2167711ba8d54c57a39c48f87)
@@ -167,4 +167,6 @@
         # Which shell is being currently displayed?
         self.current_shell_displayed = 0
+        # List of all shell-unique parameters
+        self.shell_names = []
 
         # Error column presence in parameter display
@@ -1137,4 +1139,6 @@
         self.undo_supported = temp_undo_state
 
+        self.shell_names = self.shellNamesList()
+
         # Update the QModel
         new_rows = FittingUtilities.addParametersToModel(self.model_parameters, self.kernel_module, self.is2D)
@@ -1419,25 +1423,43 @@
         self._poly_model.clear()
 
-        [self.setPolyModelParameters(row, param) for row, param in \
+        [self.setPolyModelParameters(param) for _, param in \
             enumerate(self.model_parameters.form_volume_parameters) if param.polydisperse]
         FittingUtilities.addPolyHeadersToModel(self._poly_model)
 
-    def setPolyModelParameters(self, row, param):
-        """
-        Creates a checked row for a polydisperse parameter
-        """
-        # Not suitable for multishell
+    def setPolyModelParameters(self, param):
+        """
+        Standard of multishell poly parameter driver
+        """
+        param_name = param.name
+        # see it the parameter is multishell
         if '[' in param.name:
-            return
+            # Skip empty shells
+            if self.current_shell_displayed == 0:
+                return
+            else:
+                # Create as many entries as current shells
+                for ishell in xrange(1, self.current_shell_displayed+1):
+                    # Remove [n] and add the shell numeral
+                    name = param_name[0:param_name.index('[')] + str(ishell)
+                    self.addNameToPolyModel(name)
+        else:
+            # Just create a simple param entry
+            self.addNameToPolyModel(param_name)
+
+    def addNameToPolyModel(self, param_name):
+        """
+        Creates a checked row in the poly model with param_name
+        """
         # Polydisp. values from the sasmodel
-        width = self.kernel_module.getParam(param.name + '.width')
-        npts = self.kernel_module.getParam(param.name + '.npts')
-        nsigs = self.kernel_module.getParam(param.name + '.nsigmas')
+        width = self.kernel_module.getParam(param_name + '.width')
+        npts = self.kernel_module.getParam(param_name + '.npts')
+        nsigs = self.kernel_module.getParam(param_name + '.nsigmas')
+        _, min, max = self.kernel_module.details[param_name]
 
         # Construct a row with polydisp. related variable.
         # This will get added to the polydisp. model
         # Note: last argument needs extra space padding for decent display of the control
-        checked_list = ["Distribution of " + param.name, str(width),
-                        str(param.limits[0]), str(param.limits[1]),
+        checked_list = ["Distribution of " + param_name, str(width),
+                        str(min), str(max),
                         str(npts), str(nsigs), "gaussian      "]
         FittingUtilities.addCheckedListToModel(self._poly_model, checked_list)
@@ -1536,8 +1558,32 @@
         FittingUtilities.addHeadersToModel(self._magnet_model)
 
+    def shellNamesList(self):
+        """
+        Returns list of names of all multi-shell parameters
+        E.g. for sld[n], radius[n], n=1..3 it will return
+        [sld1, sld2, sld3, radius1, radius2, radius3]
+        """
+        multi_names = [p.name[:p.name.index('[')] for p in self.model_parameters.iq_parameters if '[' in p.name]
+        top_index = self.kernel_module.multiplicity_info.number
+        shell_names = []
+        for i in xrange(1, top_index+1):
+            for name in multi_names:
+                shell_names.append(name+str(i))
+        return shell_names
+
     def addCheckedMagneticListToModel(self, param, model):
         """
         Wrapper for model update with a subset of magnetic parameters
         """
+        if param.name[param.name.index(':')+1:] in self.shell_names:
+            # check if two-digit shell number
+            try:
+                shell_index = int(param.name[-2:])
+            except ValueError:
+                shell_index = int(param.name[-1:])
+
+            if shell_index > self.current_shell_displayed:
+                return
+
         checked_list = [param.name,
                         str(param.default),
@@ -1604,4 +1650,8 @@
         FittingUtilities.addShellsToModel(self.model_parameters, self._model_model, index)
         self.current_shell_displayed = index
+
+        # Update relevant models
+        self.setPolyModel()
+        self.setMagneticModel()
 
     def readFitPage(self, fp):
Index: src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py
===================================================================
--- src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision b00414d0f96303efbf5b902fc069bbc4e165923d)
+++ src/sas/qtgui/Perspectives/Fitting/ViewDelegate.py	(revision 0d138146627d7bf2167711ba8d54c57a39c48f87)
@@ -61,4 +61,7 @@
             editor.setValidator(validator)
             return editor
+        if index.column() in [self.PARAM_PROPERTY, self.PARAM_UNIT]:
+            # Set some columns uneditable
+            return None
 
         return super(ModelViewDelegate, self).createEditor(widget, option, index)
@@ -226,5 +229,5 @@
         Overwrite generic painter for certain columns
         """
-        if index.column() in (self.mag_min, self.mag_max):
+        if index.column() in (self.mag_min, self.mag_max, self.mag_unit):
             # Units - present in nice HTML
             options = QtGui.QStyleOptionViewItemV4(option)
Index: src/sas/qtgui/path_prepare.py
===================================================================
--- src/sas/qtgui/path_prepare.py	(revision ded2ce3acd31054a86f20ac19888f05483d41827)
+++ src/sas/qtgui/path_prepare.py	(revision 0d138146627d7bf2167711ba8d54c57a39c48f87)
@@ -5,4 +5,13 @@
 import os
 import sys
+
+def exe_run():
+    """
+    Check if the process is run as .exe or as .py
+    Primitive extension check of the name of the running process
+    """
+    # Could be checking for .exe, but on mac/linux this wouldn't work well
+    return os.path.splitext(sys.argv[0])[1].lower() != ".py"
+
 def addpath(path):
     """
@@ -25,11 +34,17 @@
     return mod
 
-root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
-addpath(os.path.join(root, 'src'))
-#addpath(os.path.join(root, '../sasmodels/'))
-import sas
-from distutils.util import get_platform
-sas.sasview = import_package('sas.sasview', os.path.join(root,'sasview'))
-platform = '%s-%s'%(get_platform(),sys.version[:3])
-build_path = os.path.join(root, 'build','lib.'+platform)
-sys.path.append(build_path)
+root = ""
+if exe_run():
+    root = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
+    addpath(os.path.join(root, 'src'))
+    addpath('src')
+else:
+    root = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", ".."))
+    addpath(os.path.join(root, 'src'))
+    addpath('src')
+    # Add the local build directory to PYTHONPATH
+    from distutils.util import get_platform
+    platform = '%s-%s'%(get_platform(),sys.version[:3])
+    build_path = os.path.join(root, 'build','lib.'+platform)
+    sys.path.append(build_path)
+
