Index: park_integration/src/sans/fit/AbstractFitEngine.py
===================================================================
--- park_integration/src/sans/fit/AbstractFitEngine.py	(revision 5722d664c1b3c627571144dcbc3c3f31f29cd7e6)
+++ park_integration/src/sans/fit/AbstractFitEngine.py	(revision 444c900e848a06c444697ee2701a4bc87aea5eec)
@@ -2,5 +2,5 @@
 import  copy
 #import logging
-#import sys
+import sys
 import numpy
 import math
@@ -284,4 +284,5 @@
             raise RuntimeError, msg  
         return (self.y[self.idx] - fx[self.idx]) / self.dy[self.idx], fx[self.idx]
+            
      
     def residuals_deriv(self, model, pars=[]):
@@ -303,5 +304,5 @@
         """
         self.res_err_image = []
-        self.index_model = []
+        self.idx = []
         self.qmin = None
         self.qmax = None
@@ -340,8 +341,8 @@
         
         # Note: mask = True: for MASK while mask = False for NOT to mask
-        self.index_model = ((self.qmin <= self.radius)&\
+        self.idx = ((self.qmin <= self.radius)&\
                             (self.radius <= self.qmax))
-        self.index_model = (self.index_model) & (self.mask)
-        self.index_model = (self.index_model) & (numpy.isfinite(self.data))
+        self.idx = (self.idx) & (self.mask)
+        self.idx = (self.idx) & (numpy.isfinite(self.data))
         
     def set_smearer(self, smearer):  
@@ -352,5 +353,5 @@
             return
         self.smearer = smearer
-        self.smearer.set_index(self.index_model)
+        self.smearer.set_index(self.idx)
         self.smearer.get_data()
 
@@ -366,7 +367,7 @@
         self.index_model = ((self.qmin <= self.radius)&\
                             (self.radius <= self.qmax))
-        self.index_model = (self.index_model) &(self.mask)
-        self.index_model = (self.index_model) & (numpy.isfinite(self.data))
-        self.index_model = (self.index_model) & (self.res_err_data != 0)
+        self.idx = (self.idx) &(self.mask)
+        self.idx = (self.idx) & (numpy.isfinite(self.data))
+        self.idx = (self.idx) & (self.res_err_data != 0)
         
     def get_fit_range(self):
@@ -381,5 +382,5 @@
         """ 
         if self.smearer != None:
-            fn.set_index(self.index_model)
+            fn.set_index(self.idx)
             # Get necessary data from self.data and set the data for smearing
             fn.get_data()
@@ -387,10 +388,9 @@
             gn = fn.get_value()  
         else:
-            gn = fn([self.qx_data[self.index_model],
-                     self.qy_data[self.index_model]])
+            gn = fn([self.qx_data[self.idx],
+                     self.qy_data[self.idx]])
         # use only the data point within ROI range
-        res = (self.data[self.index_model] - gn)/\
-                    self.res_err_data[self.index_model]
-        return res, gn
+        res = (self.data[self.index_model] - gn)/self.res_err_data[self.idx]
+        return res, gn 
         
     def residuals_deriv(self, model, pars=[]):
@@ -470,4 +470,6 @@
         if self.fitresult is not None and  self.handler is not None:
             self.fitresult.set_model(model=self.model)
+            self.fitresult.residuals = self.true_res
+            self.fitresult.theory = theory
             #fitness = self.chisq(params=params)
             fitness = self.chisq()
@@ -760,2 +762,69 @@
         """
         return self.selected
+    
+    
+IS_MAC = True
+if sys.platform.count("win32") > 0:
+    IS_MAC = False
+    
+class FResult(object):
+    """
+    Storing fit result
+    """
+    def __init__(self, model=None, param_list=None, data=None):
+        self.calls = None
+        self.fitness = None
+        self.chisqr = None
+        self.pvec = []
+        self.cov = []
+        self.info = None
+        self.mesg = None
+        self.success = None
+        self.stderr = None
+        self.residuals = []
+        self.index = []
+        self.parameters = None
+        self.is_mac = IS_MAC
+        self.model = model
+        self.data = data
+        self.theory = []
+        self.param_list = param_list
+        self.iterations = 0
+        self.inputs = []
+        if self.model is not None and self.data is not None:
+            self.inputs = [(self.model, self.data)]
+     
+    def set_model(self, model):
+        """
+        """
+        self.model = model
+        
+    def set_fitness(self, fitness):
+        """
+        """
+        self.fitness = fitness
+        
+    def __str__(self):
+        """
+        """
+        if self.pvec == None and self.model is None and self.param_list is None:
+            return "No results"
+        n = len(self.model.parameterset)
+        self.iterations += 1
+        result_param = zip(xrange(n), self.model.parameterset)
+        msg1 = ["[Iteration #: %s ]" % self.iterations]
+        msg3 = ["=== goodness of fit: %s ===" % (str(self.fitness))]
+        if not self.is_mac:
+            msg2 = ["P%-3d  %s......|.....%s" % \
+                (p[0], p[1], p[1].value)\
+                  for p in result_param if p[1].name in self.param_list]
+            msg =  msg1 + msg3 + msg2
+        else:
+            msg = msg1 + msg3
+        msg = "\n".join(msg)
+        return msg
+    
+    def print_summary(self):
+        """
+        """
+        print self  
Index: park_integration/src/sans/fit/ParkFitting.py
===================================================================
--- park_integration/src/sans/fit/ParkFitting.py	(revision d59cb8c6383626c1625b731a981686172cac04ab)
+++ park_integration/src/sans/fit/ParkFitting.py	(revision 444c900e848a06c444697ee2701a4bc87aea5eec)
@@ -25,4 +25,5 @@
 #from Loader import Load
 from sans.fit.AbstractFitEngine import FitEngine
+from sans.fit.AbstractFitEngine import FResult
   
 class SansFitResult(fitresult.FitResult):
@@ -208,9 +209,13 @@
 class MyAssembly(Assembly):
     def __init__(self, models, curr_thread=None):
-        Assembly.__init__(self, models)
+        """Build an assembly from a list of models."""
+        self.parts = []
+        for m in models:
+            self.parts.append(SansPart(m))
         self.curr_thread = curr_thread
         self.chisq = None
         self._cancel = False
         self.theory = None
+        self._reset()
         
     def fit_parameters(self):
@@ -398,16 +403,37 @@
         if handler == None:
             handler = fitresult.ConsoleUpdate(improvement_delta=0.1)
+        
+        result_list = []
         try:
             result = fit.fit(self.problem, fitter=fitter, handler=handler)
             self.problem.all_results(result)
+            
         except LinAlgError:
             raise ValueError, "SVD did not converge"
-            
-        if result != None:
-            if q != None:
-                q.put(result)
-                return q
-            return result
-        else:
-            raise ValueError, "SVD did not converge"
-            
+    
+        for m in self.problem.parts:
+            residuals, theory = m.fitness.residuals()
+            small_result = FResult(model=m.model, data=m.data.sans_data)
+            small_result.theory = theory
+            small_result.residuals = residuals
+            small_result.pvec = []
+            small_result.cov = []
+            small_result.stderr = []
+            small_result.param_list = []
+            small_result.residuals = m.residuals
+            if result is not None:
+                for p in result.parameters:
+                    if p.data.name == small_result.data.name:
+                        small_result.index = m.data.idx
+                        small_result.fitness = result.fitness
+                        small_result.pvec.append(p.value)
+                        small_result.stderr.append(p.stderr)
+                        name = p.name.split('.')[1].strip()
+                        small_result.param_list.append(name)
+            result_list.append(small_result)    
+        if q != None:
+            q.put(result)
+            return q
+        print "park", len(result_list)
+        return result_list
+       
Index: park_integration/src/sans/fit/ScipyFitting.py
===================================================================
--- park_integration/src/sans/fit/ScipyFitting.py	(revision 425e49ca1d5a5a9cbce5394ed416ec11b8d8cfdf)
+++ park_integration/src/sans/fit/ScipyFitting.py	(revision 444c900e848a06c444697ee2701a4bc87aea5eec)
@@ -15,68 +15,5 @@
 from sans.fit.AbstractFitEngine import FitAbort
 from sans.fit.AbstractFitEngine import Model
-IS_MAC = True
-if sys.platform.count("win32") > 0:
-    IS_MAC = False
-    
-class fitresult(object):
-    """
-    Storing fit result
-    """
-    def __init__(self, model=None, param_list=None, data=None):
-        self.calls = None
-        self.fitness = None
-        self.chisqr = None
-        self.pvec = None
-        self.cov = None
-        self.info = None
-        self.mesg = None
-        self.success = None
-        self.stderr = None
-        self.parameters = None
-        self.is_mac = IS_MAC
-        if issubclass(model.__class__, Model):
-            model = model.model
-        self.model = model
-        self.data = data
-        self.theory = None
-        self.param_list = param_list
-        self.iterations = 0
-        
-        self.inputs = [(self.model, self.data)]
-     
-    def set_model(self, model):
-        """
-        """
-        self.model = model
-        
-    def set_fitness(self, fitness):
-        """
-        """
-        self.fitness = fitness
-        
-    def __str__(self):
-        """
-        """
-        if self.pvec == None and self.model is None and self.param_list is None:
-            return "No results"
-        n = len(self.model.parameterset)
-        self.iterations += 1
-        result_param = zip(xrange(n), self.model.parameterset)
-        msg1 = ["[Iteration #: %s ]" % self.iterations]
-        msg3 = ["=== goodness of fit: %s ===" % (str(self.fitness))]
-        if not self.is_mac:
-            msg2 = ["P%-3d  %s......|.....%s" % \
-                (p[0], p[1], p[1].value)\
-                  for p in result_param if p[1].name in self.param_list]
-            msg =  msg1 + msg3 + msg2
-        else:
-            msg = msg1 + msg3
-        msg = "\n".join(msg)
-        return msg
-    
-    def print_summary(self):
-        """
-        """
-        print self   
+from sans.fit.AbstractFitEngine import FResult 
 
 class ScipyFit(FitEngine):
@@ -146,5 +83,5 @@
         self._check_param_range(model)
         
-        result = fitresult(model=model, data=data.sans_data, param_list=self.param_list)
+        result = FResult(model=model, data=data, param_list=self.param_list)
         if handler is not None:
             handler.set_result(result=result)
@@ -197,7 +134,9 @@
             if success < 1 or success > 5:
                 result = None
-            return result
+        return [result]
+        """
         else:
             return None
+        """
         # Error will be present to the client, not here 
         #else:  
