Index: src/sans/fit/AbstractFitEngine.py
===================================================================
--- src/sans/fit/AbstractFitEngine.py	(revision 8d074d926d99193a8c902448957d621abd9235d5)
+++ src/sans/fit/AbstractFitEngine.py	(revision bf5e9855e1a062489232f1457ad3e9a9ef0d87c6)
@@ -396,6 +396,4 @@
         Base class for scipy and park fit engine
         """
-        #List of parameter names to fit
-        self.param_list = []
         #Dictionnary of fitArrange element (fit problems)
         self.fit_arrange_dict = {}
@@ -444,6 +442,4 @@
         self.fit_arrange_dict[id].vals = [sasmodel.getParam(name) for name in pars]
         self.fit_arrange_dict[id].constraints = constraints
-
-        self.param_list.extend(pars)
 
     def set_data(self, data, id, smearer=None, qmin=None, qmax=None):
Index: src/sans/fit/BumpsFitting.py
===================================================================
--- src/sans/fit/BumpsFitting.py	(revision eff93b8d577de85b34ffd99e484da07484c35580)
+++ src/sans/fit/BumpsFitting.py	(revision bf5e9855e1a062489232f1457ad3e9a9ef0d87c6)
@@ -111,6 +111,8 @@
         for k,p in self._pars.items():
             p.fixed = (k not in param_list or k in self.constraints)
-        self.fitted_pars = [self._pars[k] for k in param_list if k not in self.constraints]
         self.fitted_par_names = [k for k in param_list if k not in self.constraints]
+        self.computed_par_names = [k for k in param_list if k in self.constraints]
+        self.fitted_pars = [self._pars[k] for k in self.fitted_par_names]
+        self.computed_pars = [self._pars[k] for k in self.computed_par_names]
 
     # ===== Fitness interface ====
@@ -163,10 +165,10 @@
             ftol=1.49012e-8, reset_flag=False):
         # Build collection of bumps fitness calculators
-        models = [ SasFitness(model=M.get_model(),
-                              data=M.get_data(),
-                              constraints=M.constraints,
-                              fitted=M.pars)
-                   for i,M in enumerate(self.fit_arrange_dict.values())
-                   if M.get_to_fit() == 1 ]
+        models = [SasFitness(model=M.get_model(),
+                             data=M.get_data(),
+                             constraints=M.constraints,
+                             fitted=M.pars)
+                  for M in self.fit_arrange_dict.values()
+                  if M.get_to_fit()]
         if len(models) == 0:
             raise RuntimeError("Nothing to fit")
@@ -177,10 +179,10 @@
         exprs = {}
         for M in models:
-            exprs.update((".".join((M.name,k)),v) for k,v in M.constraints.items())
+            exprs.update((".".join((M.name, k)), v) for k, v in M.constraints.items())
         if exprs:
-            symtab = dict((".".join((M.name,k)),p)
+            symtab = dict((".".join((M.name, k)), p)
                           for M in models
                           for k,p in M.parameters().items())
-            constraints = compile_constraints(symtab,exprs)
+            constraints = compile_constraints(symtab, exprs)
         else:
             constraints = lambda: 0
@@ -206,11 +208,13 @@
             fitted_index = [varying.index(p) for p in fitness.fitted_pars]
             R = FResult(model=fitness.model, data=fitness.data,
-                        param_list=fitness.fitted_par_names)
+                        param_list=fitness.fitted_par_names+fitness.computed_par_names)
             R.theory = fitness.theory()
             R.residuals = fitness.residuals()
             R.fitter_id = self.fitter_id
             # TODO: should scale stderr by sqrt(chisq/DOF) if dy is unknown
-            R.stderr = result['stderr'][fitted_index]
-            R.pvec = result['value'][fitted_index]
+            R.stderr = numpy.hstack((result['stderr'][fitted_index],
+                                     numpy.NaN*numpy.ones(len(fitness.computed_pars))))
+            R.pvec = numpy.hstack((result['value'][fitted_index],
+                                  [p.value for p in fitness.computed_pars]))
             R.success = result['success']
             R.fitness = numpy.sum(R.residuals**2)/(fitness.numpoints() - len(fitted_index))
Index: src/sans/perspectives/fitting/basepage.py
===================================================================
--- src/sans/perspectives/fitting/basepage.py	(revision 116e1a745c824ae90452a0a866bede4b161d79f5)
+++ src/sans/perspectives/fitting/basepage.py	(revision bf5e9855e1a062489232f1457ad3e9a9ef0d87c6)
@@ -96,5 +96,5 @@
         self.num_points = None
         ## default fitengine type
-        self.engine_type = 'scipy'
+        self.engine_type = 'bumps'
         ## smear default
         self.current_smearer = None
@@ -2986,5 +2986,5 @@
             self.qmin.SetValue(str(self.qmin_x))
             self.qmax.SetValue(str(self.qmax_x))
-            self.set_npts2fit()
+            self.show_npts2fit()
             # At this point, some button and variables satatus (disabled?)
             # should be checked such as color that should be reset to
@@ -3874,5 +3874,5 @@
         to fit if implemented
         """
-    def set_npts2fit(self):
+    def show_npts2fit(self):
         """
         setValue Npts for fitting if implemented
Index: src/sans/perspectives/fitting/fitpage.py
===================================================================
--- src/sans/perspectives/fitting/fitpage.py	(revision 4e9f22702695459c7a6c8721061aab9d9e4ef437)
+++ src/sans/perspectives/fitting/fitpage.py	(revision bf5e9855e1a062489232f1457ad3e9a9ef0d87c6)
@@ -661,7 +661,6 @@
                           wx.EXPAND | wx.ADJUST_MINSIZE, 0)
         
-        if self.engine_type in ("park","bumps"):
-            self.text_disp_max.Show(True)
-            self.text_disp_min.Show(True)
+        self.text_disp_max.Show(True)
+        self.text_disp_min.Show(True)
 
         for item in self.model.dispersion.keys():
@@ -738,7 +737,6 @@
                                           wx.EXPAND | wx.ADJUST_MINSIZE, 0)
 
-                        if self.engine_type in ("park","bumps"):
-                            ctl3.Show(True)
-                            ctl4.Show(True)
+                        ctl3.Show(True)
+                        ctl4.Show(True)
                                                               
                     elif p == "npts":
@@ -1268,5 +1266,5 @@
         if check_float(tcrtl):
             flag = self._onparamEnter_helper()
-            self.set_npts2fit()
+            self.show_npts2fit()
             if self.fitrange:
                 temp_smearer = None
@@ -1468,5 +1466,5 @@
                     #self.data.mask = index_data
                     #self.Npts_fit.SetValue(str(len(self.data.mask)))
-                    self.set_npts2fit()
+                    self.show_npts2fit()
             else:
                 index_data = ((self.qmin_x <= self.data.x) & \
@@ -1766,9 +1764,9 @@
             # try re draw the model plot if it exists
             self._draw_model()
-            self.set_npts2fit()
+            self.show_npts2fit()
         elif self.model == None:
             self.panel.MakeModal(False)
             event.Skip()
-            self.set_npts2fit()
+            self.show_npts2fit()
             msg = "No model is found on updating MASK in the model plot... "
             wx.PostEvent(self._manager.parent, StatusEvent(status=msg))
@@ -2056,5 +2054,5 @@
         return npts2fit
 
-    def set_npts2fit(self):
+    def show_npts2fit(self):
         """
         setValue Npts for fitting
@@ -2093,6 +2091,4 @@
         if chisqr != None and numpy.isfinite(chisqr):
             #format chi2
-            if self.engine_type in ("park","bumps"):
-                npt_fit = float(self.get_npts2fit())
             chi2 = format_number(chisqr, True)
             self.tcChi.SetValue(chi2)
Index: src/sans/perspectives/fitting/fitting.py
===================================================================
--- src/sans/perspectives/fitting/fitting.py	(revision eff93b8d577de85b34ffd99e484da07484c35580)
+++ src/sans/perspectives/fitting/fitting.py	(revision bf5e9855e1a062489232f1457ad3e9a9ef0d87c6)
@@ -1084,5 +1084,10 @@
         batch_inputs = {}
         batch_outputs = {}
-        page = self.fit_panel.get_page_by_id(uid)
+        if fit_type == "simultaneous":
+            page = self.sim_page
+        elif fit_type == "combined_batch":
+            page = self.batch_page
+        else:
+            page = self.fit_panel.get_page_by_id(uid)
         if page.batch_on:
             calc_fit = FitThread(handler=handler,
Index: src/sans/perspectives/fitting/simfitpage.py
===================================================================
--- src/sans/perspectives/fitting/simfitpage.py	(revision 4e9f22702695459c7a6c8721061aab9d9e4ef437)
+++ src/sans/perspectives/fitting/simfitpage.py	(revision bf5e9855e1a062489232f1457ad3e9a9ef0d87c6)
@@ -139,9 +139,4 @@
                 break
 
-        ## some model or parameters can be constrained
-        self._show_constraint()
-        self.sizer3.Layout()
-        self.Layout()
-        self.Refresh()
         #self._onAdd_constraint(None)
              
@@ -820,6 +815,7 @@
                         
                     for fid in self.page_finder[id].iterkeys():
-                        self.page_finder[id].set_model_param(param,
-                                                        constraint, fid=fid)
+                        # wrap in param/constraint in str() to remove unicode
+                        self.page_finder[id].set_model_param(str(param),
+                                                        str(constraint), fid=fid)
                     break
         return True
