Index: fittingview/src/sans/perspectives/fitting/basepage.py
===================================================================
--- fittingview/src/sans/perspectives/fitting/basepage.py	(revision 8a5fecdbfe4de395aa7cbd756aff6f43747c8dc2)
+++ fittingview/src/sans/perspectives/fitting/basepage.py	(revision fa02d950e7e18accb7f8354ee8b8746662d7cb62)
@@ -309,6 +309,9 @@
             chain_menu.Enable(self.batch_on)
             sim_menu = self._manager.menu1.FindItemById(self._manager.id_simfit)
-            sim_menu.Enable(not self.batch_on and self.data.is_data\
-                            and (self.model!=None)) 
+            flag = self.data.is_data\
+                            and (self.model!=None)
+            sim_menu.Enable(not self.batch_on and flag)
+            batch_menu = self._manager.menu1.FindItemById(self._manager.id_batchfit)
+            batch_menu.Enable(self.batch_on and flag) 
     
     class ModelTextCtrl(wx.TextCtrl):
Index: fittingview/src/sans/perspectives/fitting/fitpanel.py
===================================================================
--- fittingview/src/sans/perspectives/fitting/fitpanel.py	(revision f3f674675c4a3d4c25fe328b763d7ca4e2a15056)
+++ fittingview/src/sans/perspectives/fitting/fitpanel.py	(revision fa02d950e7e18accb7f8354ee8b8746662d7cb62)
@@ -61,4 +61,5 @@
         #page of simultaneous fit 
         self.sim_page = None
+        self.batch_page = None
         self.fit_engine_type = "scipy"
         ## get the state of a page
@@ -85,5 +86,5 @@
             if page.batch_on:
                 pos = self.GetPageIndex(page)
-                if pos != -1 and page != self.sim_page:
+                if pos != -1 and page not in [self.sim_page, self.batch_page]:
                     msg += "%s .\n" % str(self.GetPageText(pos))
             else:
@@ -116,5 +117,5 @@
         """
         self.fit_engine_type = name
-        if panel != self.sim_page:
+        if panel not in[self.batch_page, self.sim_page]:
             panel._on_engine_change(name=self.fit_engine_type)
                 
@@ -314,16 +315,30 @@
         return self.GetPage(self.GetSelection())
     
-    def add_sim_page(self):
+    def add_sim_page(self, caption="Simultaneous Fit"):
         """
         Add the simultaneous fit page
         """
         from simfitpage import SimultaneousFitPage
-        page_finder= self._manager.get_page_finder()
-        self.sim_page = SimultaneousFitPage(self,page_finder=page_finder, id=-1)
-        self.sim_page.uid = wx.NewId()
-        self.AddPage(self.sim_page,"Simultaneous Fit", True)
-        self.sim_page.set_manager(self._manager)
-        self.enable_close_button()
-        return self.sim_page
+        page_finder = self._manager.get_page_finder()
+        if caption == "Simultanous Fit":
+            self.sim_page = SimultaneousFitPage(self,page_finder=page_finder,
+                                                 id=-1, batch_on=False)
+            self.sim_page.window_caption = caption
+            self.sim_page.window_name = caption
+            self.sim_page.uid = wx.NewId()
+            self.AddPage(self.sim_page, caption, True)
+            self.sim_page.set_manager(self._manager)
+            self.enable_close_button()
+            return self.sim_page
+        else:
+            self.batch_page = SimultaneousFitPage(self, batch_on=True,
+                                                   page_finder=page_finder)
+            self.batch_page.window_caption = caption
+            self.batch_page.window_name = caption
+            self.batch_page.uid = wx.NewId()
+            self.AddPage(self.batch_page, caption, True)
+            self.batch_page.set_manager(self._manager)
+            self.enable_close_button()
+            return self.batch_page
         
  
@@ -566,4 +581,7 @@
             self._manager.sim_page=None 
             return
+        if selected_page == self.batch_page :
+            self._manager.batch_page=None 
+            return
         """
         # The below is not working when delete #5 and still have #6.
@@ -608,2 +626,9 @@
             ##non existing page
             pass     
+        try:
+            self.batch_page.draw_page()
+        except:
+            ## that page is already deleted no need to remove check box on
+            ##non existing page
+            pass     
+        
Index: fittingview/src/sans/perspectives/fitting/fitting.py
===================================================================
--- fittingview/src/sans/perspectives/fitting/fitting.py	(revision bb8a1807cad6841998ee9d118b5bdb9c95e3db71)
+++ fittingview/src/sans/perspectives/fitting/fitting.py	(revision fa02d950e7e18accb7f8354ee8b8746662d7cb62)
@@ -98,4 +98,7 @@
         #keep reference of the simultaneous fit page
         self.sim_page = None
+        self.sim_menu = None
+        self.batch_page = None
+        self.batch_menu = None
         self.index_model = 0
         self.test_model_color = None
@@ -170,10 +173,16 @@
         self.menu1.Append(self.id_simfit, '&Simultaneous Fit',simul_help)
         wx.EVT_MENU(owner, self.id_simfit, self.on_add_sim_page)
-        sim_menu = self.menu1.FindItemById(self.id_simfit)
-        sim_menu.Enable(False) 
-        
+        self.sim_menu = self.menu1.FindItemById(self.id_simfit)
+        self.sim_menu.Enable(False) 
+        #combined Batch
+        self.id_batchfit = wx.NewId()
+        batch_help = "Batch Fit"
+        self.menu1.Append(self.id_batchfit, '&Combine Batch Fit', batch_help)
+        wx.EVT_MENU(owner, self.id_batchfit,  self.on_add_sim_page)
+        self.batch_menu = self.menu1.FindItemById(self.id_batchfit)
+        self.batch_menu.Enable(False) 
         self.menu1.AppendSeparator()
         #Set park engine
-        scipy_help= "Scipy Engine: Perform Simple fit. More in Help window...."
+        scipy_help = "Scipy Engine: Perform Simple fit. More in Help window...."
         self.menu1.AppendCheckItem(self.scipy_id, "Simple FitEngine [LeastSq]",
                                    scipy_help) 
@@ -209,19 +218,31 @@
         #create  menubar items
         return [(self.menu1, self.sub_menu)]
-               
+            
+   
     def on_add_sim_page(self, event):
         """
         Create a page to access simultaneous fit option
         """
-        if self.sim_page != None:
-            self.sim_page.Show(True)
-            self.sim_page.Refresh()
-            self.sim_page.SetFocus()
+        id = event.GetId()
+        caption = "Simultaneous Fit"
+        page = self.sim_page
+        if id == self.id_batchfit:
+            caption = "Batch Fit"
+            page = self.batch_page
+            
+        def set_focus_page(page):
+            page.Show(True)
+            page.Refresh()
+            page.SetFocus()
             self.parent._mgr.Update()
-            msg= "Simultaneous Fit page already opened"
-            wx.PostEvent(self.parent, StatusEvent(status= msg))
-            return 
-        
-        self.sim_page= self.fit_panel.add_sim_page()
+            msg = "%s already opened\n" % str(page.window_caption)
+            wx.PostEvent(self.parent, StatusEvent(status=msg))
+            
+        if page != None:
+            return set_focus_page(page)
+        if caption == "Simultaneous Fit":
+            self.sim_page = self.fit_panel.add_sim_page(caption=caption)
+        else:
+            self.batch_page = self.fit_panel.add_sim_page(caption=caption)
         
     def help(self, evt):
@@ -547,5 +568,5 @@
         sim_page_id = self.sim_page.uid
         for uid, value in self.page_finder.iteritems():
-            if uid != sim_page_id:
+            if uid != sim_page_id and uid != self.batch_page.uid:
                 list = value.get_model()
                 model = list[0]
@@ -614,10 +635,12 @@
         #set the fit button label of page when fit stop is trigger from
         #simultaneous fit pane
-        if  self.sim_page is not None and uid == self.sim_page.uid:
+        sim_flag = self.sim_page is not None and uid == self.sim_page.uid
+        batch_flag = self.batch_page is not None and uid == self.batch_page.uid
+        if sim_flag or batch_flag:
             for uid, value in self.page_finder.iteritems():
                 if value.get_scheduled() == 1:
                     if uid in self.fit_panel.opened_pages.keys():
                         panel = self.fit_panel.opened_pages[uid]
-                        panel. _on_fit_complete()
+                        panel._on_fit_complete()
   
     def set_smearer(self, uid, smearer, fid, qmin=None, qmax=None, draw=True,
@@ -746,4 +769,5 @@
         sim_fitter = None     
         is_single_fit = True
+        batch_on = False
         if self.sim_page is not None and self.sim_page.uid == uid:
             #simulatanous fit only one engine need to be created 
@@ -751,6 +775,8 @@
             self._on_change_engine(engine='park')   
             sim_fitter = Fit(self._fit_engine)  
+            sim_fitter.fitter_id = self.sim_page.uid
             fitter_list.append(sim_fitter) 
             is_single_fit = False
+            batch_on = self.sim_page.batch_on
             
 
@@ -770,6 +796,8 @@
             # if uid is specified (singlefit), do it only on the page.
             if engineType == "Single Fit":
-                if page_id != uid:
-                    continue
+                #combine more than 1 batch page on single mode
+                if self.batch_page is None or self.batch_page.uid != uid:
+                    if page_id != uid:
+                        continue
             try:
                 if value.get_scheduled() == 1:
@@ -799,4 +827,5 @@
                         if sim_fitter is None:
                             fitter = Fit(self._fit_engine)  
+                            fitter.fitter_id = page_id
                             self._fit_helper(fitproblem=fitproblem, 
                                                 pars=pars, 
@@ -840,6 +869,14 @@
             batch_on = page.batch_on
         except:
-            batch_on = False
-
+            try:
+                #if the id cannot be found then  we deal with a self.sim_page 
+                #or a self.batch_page
+                if self.sim_page is not None and uid == self.sim_page.uid:
+                    batch_on = self.sim_page.uid
+                if self.batch_page is not None and uid == self.batch_page.uid:
+                    batch_on = self.batch_page.uid
+            except:
+                raise
+  
         # batch fit
         if batch_on:
@@ -978,4 +1015,7 @@
         if self.sim_page is not None and not self.batch_on:
             self.sim_page.draw_page()
+        if self.batch_page is not None and self.batch_on:
+            self.batch_page.draw_page()
+            
         return page
             
@@ -1102,121 +1142,148 @@
         wx.PostEvent(self.parent, StatusEvent(status=msg, info="info",
                                                       type="stop"))
-        pid = page_id[0]
-        cpage = self.fit_panel.get_page_by_id(pid)
-        batch_on = cpage.batch_on
+       
         if batch_outputs is None:
             batch_outputs = {}
-        if batch_on:
-            # format batch_outputs
-            batch_outputs["Chi2"] = []
-            for index  in range(len(pars)):
-                batch_outputs[pars[index]] = []
-                batch_inputs["error on %s" % pars[index]] = []
-            msg = ""
-            for list_res in result:
-                for res in list_res:
-                    model, data = res.inputs[0]
-                    correct_result = False
-                    if model is not None and hasattr(model, "model"):
-                        model = model.model
-                    if data is not None and hasattr(data, "sans_data"):
-                        data = data.sans_data
-                    is_data2d = issubclass(data.__class__, Data2D)
-                    #check consistency of arrays
+        
+        # format batch_outputs
+        batch_outputs["Chi2"] = []
+        #Don't like these loops
+        # Need to create dictionary of all fitted parameters 
+        # since the number of parameters can differ between each fit result
+        for list_res in result:
+            for res in list_res:
+                model, data = res.inputs[0]
+                if model is not None and hasattr(model, "model"):
+                    model = model.model
+                #get all fittable parameters of the current model
+                for param in  model.getParamList():
+                    if param  not in batch_outputs.keys():
+                        batch_outputs[param] = []
+                for param in model.getDispParamList():
+                    if not model.is_fittable(param) and \
+                        param in batch_outputs.keys():
+                        del batch_outputs[param]
+                # Add fitted parameters and their error
+                for param in res.param_list:
+                    if param not in batch_outputs.keys():
+                        batch_outputs[param] = []
+                    err_param = "error on %s" % str(param)
+                    if err_param not in batch_inputs.keys():
+                        batch_inputs[err_param] = []
+        msg = ""
+        for list_res in result:
+            for res in list_res:
+                pid = res.fitter_id
+                model, data = res.inputs[0]
+                correct_result = False
+                if model is not None and hasattr(model, "model"):
+                    model = model.model
+                if data is not None and hasattr(data, "sans_data"):
+                    data = data.sans_data
+                
+                is_data2d = issubclass(data.__class__, Data2D)
+                #check consistency of arrays
+                if not is_data2d:
+                    if len(res.theory) == len(res.index[res.index]) and \
+                        len(res.index) == len(data.y):
+                        correct_result = True
+                else:
+                    copy_data = deepcopy(data)
+                    new_theory = copy_data.data
+                    new_theory[res.index] = res.theory
+                    new_theory[res.index == False] = numpy.nan 
+                    correct_result = True
+                #get all fittable parameters of the current model
+                param_list = model.getParamList()
+                for param in model.getDispParamList():
+                    if not model.is_fittable(param) and \
+                        param in param_list:
+                        param_list.remove(param)       
+                if not correct_result or res.fitness is None or \
+                    not numpy.isfinite(res.fitness) or \
+                    numpy.any(res.pvec == None) or not \
+                    numpy.all(numpy.isfinite(res.pvec)):
+                    data_name = str(None)
+                    if data is not None:
+                        data_name = str(data.name)
+                    model_name = str(None)
+                    if model is not None:
+                        model_name = str(model.name)
+                    msg += "Data %s and Model %s did not fit.\n" % (data_name, 
+                                                                    model_name)
+                    ERROR = numpy.NAN
+                    cell = BatchCell()
+                    cell.label = res.fitness
+                    cell.value = res.fitness
+                    batch_outputs["Chi2"].append(ERROR)
+                    for param in param_list:
+                        # save value of  fixed parameters
+                        if param not in res.param_list:
+                            batch_outputs[str(param)].append(ERROR)
+                        else:
+                            #save only fitted values
+                            batch_outputs[param].append(ERROR)
+                            batch_inputs["error on %s" % str(param)].append(ERROR)
+                else:
+                    cell = BatchCell()
+                    cell.label = res.fitness
+                    cell.value = res.fitness
+                    batch_outputs["Chi2"].append(cell)
+                    # add parameters to batch_results
+                    for param in param_list:
+                        # save value of  fixed parameters
+                        if param not in res.param_list:
+                            batch_outputs[str(param)].append(model.getParam(param))
+                        else:
+                            index = res.param_list.index(param)
+                            #save only fitted values
+                            batch_outputs[param].append(res.pvec[index])
+                            if res.stderr is not None and \
+                                len(res.stderr) == len(res.param_list):
+                                item = res.stderr[index]
+                                batch_inputs["error on %s" % param].append(item)
+                            model.setParam(param, res.pvec[index])
+                #fill the batch result with emtpy value if not in the current 
+                #model
+                EMPTY = "-"
+                for key in batch_outputs.keys():
+                    if key not in param_list and key not in ["Chi2", "Data"]:
+                        batch_outputs[key].append(EMPTY)
+                for key in batch_inputs.keys():
+                    if key not in param_list and key not in ["Chi2", "Data"]:
+                        batch_inputs[key].append(EMPTY)
+                                
+                self.page_finder[pid].set_batch_result(batch_inputs=batch_inputs,
+                                                     batch_outputs=batch_outputs) 
+               
+                cpage = self.fit_panel.get_page_by_id(pid)
+                cpage._on_fit_complete()
+                self.page_finder[pid][data.id].set_result(res)
+                fitproblem = self.page_finder[pid][data.id]
+                qmin, qmax = fitproblem.get_range()
+               
+                if correct_result:
                     if not is_data2d:
-                        if len(res.theory) == len(res.index[res.index]) and \
-                            len(res.index) == len(data.y):
-                            correct_result = True
+                        self._complete1D(x=data.x, y=res.theory, page_id=pid, 
+                                     elapsed=None, 
+                                     index=res.index, model=model,
+                                     weight=None, fid=data.id,
+                                     toggle_mode_on=False, state=None, 
+                                     data=data, update_chisqr=False, 
+                                     source='fit')
                     else:
-                        copy_data = deepcopy(data)
-                        new_theory = copy_data.data
-                        new_theory[res.index] = res.theory
-                        new_theory[res.index == False] = numpy.nan 
-                        correct_result = True
-                    #get all fittable parameters of the current model
-                    param_list = model.getParamList()
-                    for param in model.getDispParamList():
-                        if not model.is_fittable(param) and \
-                            param in param_list:
-                            param_list.remove(param)       
-                    if not correct_result or res.fitness is None or \
-                        not numpy.isfinite(res.fitness) or \
-                        numpy.any(res.pvec == None) or not \
-                        numpy.all(numpy.isfinite(res.pvec)):
-                        data_name = str(None)
-                        if data is not None:
-                            data_name = str(data.name)
-                        model_name = str(None)
-                        if model is not None:
-                            model_name = str(model.name)
-                        msg += "Data %s and Model %s did not fit.\n" % (data_name, 
-                                                                        model_name)
-                        ERROR = numpy.NAN
-                        cell = BatchCell()
-                        cell.label = res.fitness
-                        cell.value = res.fitness
-                        batch_outputs["Chi2"].append(ERROR)
-                        for param in param_list:
-                            # save value of  fixed parameters
-                            if param not in batch_outputs.keys():
-                                batch_outputs[param] = []
-                            if param not in res.param_list:
-                                batch_outputs[str(param)].append(ERROR)
-                        for index  in range(len(res.param_list)):
-                            #save only fitted values
-                            batch_outputs[res.param_list[index]].append(ERROR)
-                            batch_inputs["error on %s" % res.param_list[index]].append(ERROR)
-                    else:
-                        cell = BatchCell()
-                        cell.label = res.fitness
-                        cell.value = res.fitness
-                        batch_outputs["Chi2"].append(cell)
-                        # add parameters to batch_results
-                        for param in param_list:
-                            # save value of  fixed parameters
-                            if param not in batch_outputs.keys():
-                                batch_outputs[param] = []
-                            if param not in res.param_list:
-                                batch_outputs[str(param)].append(model.getParam(param))
-                        for index  in range(len(res.param_list)):
-                            #save only fitted values
-                            batch_outputs[res.param_list[index]].append(res.pvec[index])
-                            if res.stderr is not None and len(res.stderr) == len(res.param_list):
-                                item = res.stderr[index]
-                                batch_inputs["error on %s" % res.param_list[index]].append(item)
-                            if res.param_list[index] in model.getParamList():
-                                model.setParam(res.param_list[index], res.pvec[index])
-                                    
-                    self.page_finder[pid].set_batch_result(batch_inputs=batch_inputs,
-                                                         batch_outputs=batch_outputs)   
-                    cpage = self.fit_panel.get_page_by_id(pid)
-                    cpage._on_fit_complete()
-                    self.page_finder[pid][data.id].set_result(res)
-                    fitproblem = self.page_finder[pid][data.id]
-                    qmin, qmax = fitproblem.get_range()
-                   
-                    if correct_result:
-                        if not is_data2d:
-                            self._complete1D(x=data.x, y=res.theory, page_id=pid, 
-                                         elapsed=None, 
-                                         index=res.index, model=model,
-                                         weight=None, fid=data.id,
-                                         toggle_mode_on=False, state=None, 
-                                         data=data, update_chisqr=False, 
-                                         source='fit')
-                        else:
-                            self._complete2D(image=new_theory, data=data,
-                                          model=model,
-                                          page_id=pid,  elapsed=None, 
-                                          index=res.index, 
-                                          qmin=qmin,
-                                         qmax=qmax, fid=data.id, weight=None,
-                                          toggle_mode_on=False, state=None, 
-                                         update_chisqr=False, 
-                                         source='fit')
-                    self.on_set_batch_result(page_id=pid, 
-                                             fid=data.id, 
-                                             batch_outputs=batch_outputs, 
-                                             batch_inputs=batch_inputs)
+                        self._complete2D(image=new_theory, data=data,
+                                      model=model,
+                                      page_id=pid,  elapsed=None, 
+                                      index=res.index, 
+                                      qmin=qmin,
+                                     qmax=qmax, fid=data.id, weight=None,
+                                      toggle_mode_on=False, state=None, 
+                                     update_chisqr=False, 
+                                     source='fit')
+                self.on_set_batch_result(page_id=pid, 
+                                         fid=data.id, 
+                                         batch_outputs=batch_outputs, 
+                                         batch_inputs=batch_inputs)
         
         wx.PostEvent(self.parent, StatusEvent(status=msg, error="error",
@@ -1480,4 +1547,6 @@
         if self.sim_page is not None and not self.batch_on:
             self.sim_page.draw_page()
+        if self.batch_page is not None and self.batch_on:
+            self.batch_page.draw_page()
         
     def _update1D(self, x, output):
Index: fittingview/src/sans/perspectives/fitting/simfitpage.py
===================================================================
--- fittingview/src/sans/perspectives/fitting/simfitpage.py	(revision 81a7b6cd9482d107f0d4ee4e14bf2c35e354f7fb)
+++ fittingview/src/sans/perspectives/fitting/simfitpage.py	(revision fa02d950e7e18accb7f8354ee8b8746662d7cb62)
@@ -44,6 +44,9 @@
     
     
-    def __init__(self, parent,page_finder ={}, *args, **kwargs):
-        ScrolledPanel.__init__(self, parent,style= wx.FULL_REPAINT_ON_RESIZE )
+    def __init__(self, parent,page_finder ={}, id=-1, batch_on=False,
+                     *args, **kwargs):
+        ScrolledPanel.__init__(self, parent, id=id,
+                               style= wx.FULL_REPAINT_ON_RESIZE, 
+                               *args, **kwargs)
         PanelBase.__init__(self, parent)
         """
@@ -55,4 +58,5 @@
         self.uid = wx.NewId()
         self.parent = parent
+        self.batch_on = batch_on
         ## store page_finder
         self.page_finder = page_finder
@@ -139,8 +143,12 @@
         
         """
+        flag = False
+        # check if the current page a simultaneous fit page or a batch page
+        if self == self._manager.sim_page:
+            flag = (self._manager.sim_page.uid == self.uid)
+
         ## making sure all parameters content a constraint
         ## validity of the constraint expression is own by fit engine
-        if self.parent._manager._fit_engine != "park" and\
-                    self._manager.sim_page.uid == self.uid: 
+        if self.parent._manager._fit_engine != "park" and flag: 
             msg = "The FitEnging will be set to 'Park' fit engine\n"
             msg += " for the simultaneous fit..."
@@ -176,5 +184,5 @@
         self.manager = manager
        
-    def check_all_model_name(self,event):
+    def check_all_model_name(self, event=None):
         """
         check all models names
@@ -189,9 +197,10 @@
             ## constraint info
             self._store_model()
-            ## display constraint fields
-            if self.show_constraint.GetValue() and\
-                             len(self.constraints_list)==0:
-                self._show_all_constraint() 
-                self._show_constraint()
+            if not self.batch_on:
+                ## display constraint fields
+                if self.show_constraint.GetValue() and\
+                                 len(self.constraints_list)==0:
+                    self._show_all_constraint() 
+                    self._show_constraint()
         else:
             for item in self.model_list:
@@ -199,6 +208,7 @@
                 
             self.model_toFit=[]
-            ##constraint info
-            self._hide_constraint()
+            if not self.batch_on:
+                ##constraint info
+                self._hide_constraint()
             
         self._update_easy_setup_cb()
@@ -303,4 +313,5 @@
             self.cb1 = wx.CheckBox(self, -1,'Select all')
             self.cb1.SetValue(False)
+            
             wx.EVT_CHECKBOX(self, self.cb1.GetId(), self.check_all_model_name)
             
@@ -313,5 +324,6 @@
             self._fill_sizer_model_list(sizer_couples)
             ## draw the sizer containing constraint info
-            self._fill_sizer_constraint()
+            if not self.batch_on:
+                self._fill_sizer_constraint()
             ## draw fit button 
             self._fill_sizer_fit()
@@ -675,9 +687,12 @@
         self.btFit.Bind(wx.EVT_BUTTON, self.onFit,id= self.btFit.GetId())
         self.btFit.SetToolTipString("Perform fit.")
-        text  = "     Note: Park fitting engine will be used automatically. \n"
-        text += "     This page requires at least one FitPage with a data \n"
-        text += "       and a model set for fitting."
-        #text+= "automatically for more than 2 combinations checked"
-        text_hint = wx.StaticText(self,-1,text)
+        if self.batch_on:
+            text = " Fit in Parallel all Data set and model selected.\n"
+        else:
+            text  = "     Note: Park fitting engine will be used automatically. \n"
+            text += "     This page requires at least one FitPage with a data \n"
+            text += "       and a model set for fitting."
+            #text+= "automatically for more than 2 combinations checked"
+        text_hint = wx.StaticText(self, -1, text)
         
         sizer_button.Add(text_hint,  wx.RIGHT|wx.EXPAND, 10)
@@ -697,4 +712,7 @@
         
         self.sizer2.Clear(True)
+        if self.batch_on:
+            self.sizer2.Hide()
+            return
         box_description= wx.StaticBox(self, -1,"Fit Constraints")
         boxsizer1 = wx.StaticBoxSizer(box_description, wx.VERTICAL)
@@ -709,10 +727,15 @@
         self.Bind( wx.EVT_RADIOBUTTON, self._display_constraint,
                     id= self.hide_constraint.GetId() )
-        self.Bind(  wx.EVT_RADIOBUTTON, self._display_constraint,
-                         id= self.show_constraint.GetId()    )
+        self.Bind(wx.EVT_RADIOBUTTON, self._display_constraint,
+                         id= self.show_constraint.GetId())
+        if self.batch_on:
+            self.hide_constraint.Enable(False)
+            self.show_constraint.Enable(False)
         self.hide_constraint.SetValue(True)
-        sizer_title.Add( wx.StaticText(self,-1," Model") )
+        self.show_constraint.SetValue(False)
+        
+        sizer_title.Add(wx.StaticText(self,-1," Model"))
         sizer_title.Add(( 10,10) )
-        sizer_title.Add( wx.StaticText(self,-1," Parameter") )
+        sizer_title.Add( wx.StaticText(self,-1," Parameter"))
         sizer_title.Add(( 10,10) )
         sizer_title.Add( wx.StaticText(self,-1," Add Constraint?") )
@@ -721,4 +744,5 @@
         sizer_title.Add( self.hide_constraint )
         sizer_title.Add(( 10,10) )
+       
         
         self.btAdd =wx.Button(self,wx.NewId(),'Add')
@@ -742,4 +766,5 @@
         self.sizer2.Add(boxsizer1,0, wx.EXPAND | wx.ALL, 10)
         self.sizer2.Layout()
+       
         #self.SetScrollbars(20,20,25,65)
     
@@ -836,47 +861,64 @@
             if id not in self.parent.opened_pages:
                 continue
-            try:
-                ix = 0
-                for fitproblem in value.get_fit_problem():
-                    if  self.parent.get_page_by_id(id).batch_on:
-                        continue
-                    data = fitproblem.get_fit_data()
-                    if not data.is_data:
-                        continue
-                    model = fitproblem.get_model()
-                    if model == None:
-                        continue
-                    iy += 1 
-                    name = '_'
-                    if model is not None:
-                        name = str(model.name)
-                    cb = wx.CheckBox(self, -1, name)
-                    cb.SetValue(False)
-                    cb.Enable(model is not None and data.is_data)
-                    sizer.Add(cb, (iy, ix), (1, 1), 
-                               wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
-                    wx.EVT_CHECKBOX(self, cb.GetId(), self.check_model_name)
-                    ix += 2 
-                    type = model.__class__.__name__
-                    model_type = wx.StaticText(self, -1, str(type))
-                    sizer.Add(model_type, (iy, ix), (1, 1), 
-                              wx.EXPAND|wx.ADJUST_MINSIZE, 0)
-                    name = '-'
-                    if data is not None and data.is_data:
-                        name = str(data.name)
-                    data_used = wx.StaticText(self, -1, name)
-                    ix += 1 
-                    sizer.Add(data_used, (iy, ix), (1, 1), 
-                              wx.EXPAND|wx.ADJUST_MINSIZE, 0)
-                    ix += 1 
-                    caption = value.get_fit_tab_caption()
-                    tab_caption_used= wx.StaticText(self, -1, str(caption))
-                    sizer.Add(tab_caption_used, (iy, ix), (1, 1), 
-                              wx.EXPAND|wx.ADJUST_MINSIZE, 0)
+
+            if self.batch_on != self.parent.get_page_by_id(id).batch_on:
+                continue
+            
+            data_list = []
+            model_list = []
+            # get data name and model objetta
+            for fitproblem in value.get_fit_problem():
                 
-                    self.model_list.append([cb,value,id,model])   
-            except:
-                raise
-                #pass
+                data = fitproblem.get_fit_data()
+                if not data.is_data:
+                    continue
+                name = '-'
+                if data is not None and data.is_data:
+                    name = str(data.name)
+                data_list.append(name)
+                    
+                model = fitproblem.get_model()
+                if model is None:
+                    continue
+                model_list.append(model)
+           
+            if len(model_list) == 0:   
+                continue
+            # Draw sizer
+            ix = 0
+            iy += 1 
+            model = model_list[0]
+            name = '_'
+            if model is not None:
+                name = str(model.name)
+            cb = wx.CheckBox(self, -1, name)
+            cb.SetValue(False)
+            cb.Enable(model is not None and data.is_data)
+            sizer.Add(cb, (iy, ix), (1, 1), 
+                       wx.LEFT|wx.EXPAND|wx.ADJUST_MINSIZE, 15)
+            wx.EVT_CHECKBOX(self, cb.GetId(), self.check_model_name)
+            ix += 2 
+            type = model.__class__.__name__
+            model_type = wx.StaticText(self, -1, str(type))
+            sizer.Add(model_type, (iy, ix), (1, 1), 
+                      wx.EXPAND|wx.ADJUST_MINSIZE, 0)
+            if self.batch_on:
+                data_used = wx.ComboBox(self, -1, style=wx.CB_READONLY)
+                data_used.AppendItems(data_list)
+                data_used.SetSelection(0)
+            else:
+                data_used = wx.StaticText(self, -1, data_list[0])
+            
+            ix += 1 
+            sizer.Add(data_used, (iy, ix), (1, 1), 
+                      wx.EXPAND|wx.ADJUST_MINSIZE, 0)
+            ix += 1 
+            caption = value.get_fit_tab_caption()
+            tab_caption_used= wx.StaticText(self, -1, str(caption))
+            sizer.Add(tab_caption_used, (iy, ix), (1, 1), 
+                          wx.EXPAND|wx.ADJUST_MINSIZE, 0)
+            
+            self.model_list.append([cb, value, id, model])   
+            
         iy += 1
         sizer.Add((20, 20), (iy, ix), (1, 1), 
