Index: src/sas/sascalc/data_util/qsmearing.py
===================================================================
--- src/sas/sascalc/data_util/qsmearing.py	(revision c1c9929d6b02699660b0af8a643376612943deb8)
+++ src/sas/sascalc/data_util/qsmearing.py	(revision c1c9929d6b02699660b0af8a643376612943deb8)
@@ -14,6 +14,11 @@
 import sys
 
+import numpy as np  # type: ignore
+from numpy import pi, exp # type:ignore
+
 from sasmodels.resolution import Slit1D, Pinhole1D
+from sasmodels.sesans import SesansTransform
 from sasmodels.resolution2d import Pinhole2D
+from .nxsunit import Converter
 
 def smear_selection(data, model = None):
@@ -36,4 +41,5 @@
     # Sanity check. If we are not dealing with a SAS Data1D
     # object, just return None
+    # This checks for 2D data (does not throw exception because fail is common)
     if  data.__class__.__name__ not in ['Data1D', 'Theory1D']:
         if data == None:
@@ -41,6 +47,6 @@
         elif data.dqx_data == None or data.dqy_data == None:
             return None
-        return PySmear2D(data, model)
-
+        return PySmear2D(data)
+    # This checks for 1D data with smearing info in the data itself (again, fail is likely; no exceptions)
     if  not hasattr(data, "dx") and not hasattr(data, "dxl")\
          and not hasattr(data, "dxw"):
@@ -48,4 +54,26 @@
 
     # Look for resolution smearing data
+    # This is the code that checks for SESANS data; it looks for the file loader
+    # TODO: change other sanity checks to check for file loader instead of data structure?
+    _found_sesans = False
+    #if data.dx is not None and data.meta_data['loader']=='SESANS':
+    if data.dx is not None and data.isSesans:
+        #if data.dx[0] > 0.0:
+        if numpy.size(data.dx[data.dx <= 0]) == 0:
+            _found_sesans = True
+        # if data.dx[0] <= 0.0:
+        if numpy.size(data.dx[data.dx <= 0]) > 0:
+            raise ValueError('one or more of your dx values are negative, please check the data file!')
+
+    if _found_sesans == True:
+        #Pre-compute the Hankel matrix (H)
+        qmax, qunits = data.sample.zacceptance
+        SElength = Converter(data._xunit)(data.x, "A")
+        zaccept = Converter(qunits)(qmax, "1/A"),
+        Rmax = 10000000
+        hankel = SesansTransform(data.x, SElength, zaccept, Rmax)
+        # Then return the actual transform, as if it were a smearing function
+        return PySmear(hankel, model, offset=0)
+
     _found_resolution = False
     if data.dx is not None and len(data.dx) == len(data.x):
@@ -89,8 +117,10 @@
     Wrapper for pure python sasmodels resolution functions.
     """
-    def __init__(self, resolution, model):
+    def __init__(self, resolution, model, offset=None):
         self.model = model
         self.resolution = resolution
-        self.offset = numpy.searchsorted(self.resolution.q_calc, self.resolution.q[0])
+        if offset is None:
+            offset = numpy.searchsorted(self.resolution.q_calc, self.resolution.q[0])
+        self.offset = offset
 
     def apply(self, iq_in, first_bin=0, last_bin=None):
Index: src/sas/sascalc/dataloader/data_info.py
===================================================================
--- src/sas/sascalc/dataloader/data_info.py	(revision 345e7e4a8c6f5977c8c07032553b5ab00bdf837d)
+++ src/sas/sascalc/dataloader/data_info.py	(revision 2ffe241a82548f1c3017267ebe33cb91ce512e31)
@@ -25,57 +25,4 @@
 import numpy
 import math
-
-class plottable_sesans1D(object):
-    """
-    SESANS is a place holder for 1D SESANS plottables.
-
-    #TODO: This was directly copied from the plottables_1D. Modified Somewhat.
-    #Class has been updated.
-    """
-    # The presence of these should be mutually
-    # exclusive with the presence of Qdev (dx)
-    x = None
-    y = None
-    lam = None
-    dx = None
-    dy = None
-    dlam = None
-    ## Slit smearing length
-    dxl = None
-    ## Slit smearing width
-    dxw = None
-
-    # Units
-    _xaxis = ''
-    _xunit = ''
-    _yaxis = ''
-    _yunit = ''
-
-    def __init__(self, x, y, lam, dx=None, dy=None, dlam=None):
-#        print "SESANS plottable working"
-        self.x = numpy.asarray(x)
-        self.y = numpy.asarray(y)
-        self.lam = numpy.asarray(lam)
-        if dx is not None:
-            self.dx = numpy.asarray(dx)
-        if dy is not None:
-            self.dy = numpy.asarray(dy)
-        if dlam is not None:
-            self.dlam = numpy.asarray(dlam)
-
-    def xaxis(self, label, unit):
-        """
-        set the x axis label and unit
-        """
-        self._xaxis = label
-        self._xunit = unit
-
-    def yaxis(self, label, unit):
-        """
-        set the y axis label and unit
-        """
-        self._yaxis = label
-        self._yunit = unit
-
 
 class plottable_1D(object):
@@ -93,4 +40,7 @@
     ## Slit smearing width
     dxw = None
+    ## SESANS specific params (wavelengths for spin echo length calculation)
+    lam = None
+    dlam = None
 
     # Units
@@ -100,5 +50,5 @@
     _yunit = ''
 
-    def __init__(self, x, y, dx=None, dy=None, dxl=None, dxw=None):
+    def __init__(self, x, y, dx=None, dy=None, dxl=None, dxw=None, lam=None, dlam=None):
         self.x = numpy.asarray(x)
         self.y = numpy.asarray(y)
@@ -111,4 +61,8 @@
         if dxw is not None:
             self.dxw = numpy.asarray(dxw)
+        if lam is not None:
+            self.lam = numpy.asarray(lam)
+        if dlam is not None:
+            self.dlam = numpy.asarray(dlam)
 
     def xaxis(self, label, unit):
@@ -398,4 +352,6 @@
     ## Details
     details = None
+    ## SESANS zacceptance
+    zacceptance = None
 
     def __init__(self):
@@ -535,4 +491,7 @@
     ## Loading errors
     errors = None
+    ## SESANS data check
+    isSesans = None
+
 
     def __init__(self):
@@ -567,4 +526,6 @@
         ## Loading errors
         self.errors = []
+        ## SESANS data check
+        self.isSesans = False
 
     def append_empty_process(self):
@@ -586,4 +547,5 @@
         _str += "Title:           %s\n" % self.title
         _str += "Run:             %s\n" % str(self.run)
+        _str += "SESANS:          %s\n" % str(self.isSesans)
         _str += "Instrument:      %s\n" % str(self.instrument)
         _str += "%s\n" % str(self.sample)
@@ -736,14 +698,21 @@
         return self._perform_union(other)
 
-class SESANSData1D(plottable_sesans1D, DataInfo):
-    """
-    SESANS 1D data class
-    """
-    x_unit = 'nm'
-    y_unit = 'pol'
-
-    def __init__(self, x=None, y=None, lam=None, dx=None, dy=None, dlam=None):
+class Data1D(plottable_1D, DataInfo):
+    """
+    1D data class
+    """
+    def __init__(self, x=None, y=None, dx=None, dy=None, lam=None, dlam=None, isSesans=None):
         DataInfo.__init__(self)
-        plottable_sesans1D.__init__(self, x, y, lam, dx, dy, dlam)
+        plottable_1D.__init__(self, x, y, dx, dy,None, None, lam, dlam)
+        self.isSesans = isSesans
+        try:
+            if self.isSesans: # the data is SESANS
+                self.x_unit = 'A'
+                self.y_unit = 'pol'
+            elif not self.isSesans: # the data is SANS
+                self.x_unit = '1/A'
+                self.y_unit = '1/cm'
+        except: # the data is not recognized/supported, and the user is notified
+            raise(TypeError, 'data not recognized, check documentation for supported 1D data formats')
 
     def __str__(self):
@@ -759,60 +728,4 @@
         return _str
 
-    def clone_without_data(self, length=0, clone=None):
-        """
-        Clone the current object, without copying the data (which
-        will be filled out by a subsequent operation).
-        The data arrays will be initialized to zero.
-
-        :param length: length of the data array to be initialized
-        :param clone: if provided, the data will be copied to clone
-        """
-        from copy import deepcopy
-        if clone is None or not issubclass(clone.__class__, Data1D):
-            x = numpy.zeros(length)
-            dx = numpy.zeros(length)
-            y = numpy.zeros(length)
-            dy = numpy.zeros(length)
-            clone = Data1D(x, y, dx=dx, dy=dy)
-
-        clone.title = self.title
-        clone.run = self.run
-        clone.filename = self.filename
-        clone.instrument = self.instrument
-        clone.notes = deepcopy(self.notes)
-        clone.process = deepcopy(self.process)
-        clone.detector = deepcopy(self.detector)
-        clone.sample = deepcopy(self.sample)
-        clone.source = deepcopy(self.source)
-        clone.collimation = deepcopy(self.collimation)
-        clone.trans_spectrum = deepcopy(self.trans_spectrum)
-        clone.meta_data = deepcopy(self.meta_data)
-        clone.errors = deepcopy(self.errors)
-
-        return clone
-
-class Data1D(plottable_1D, DataInfo):
-    """
-    1D data class
-    """
-    x_unit = '1/A'
-    y_unit = '1/cm'
-
-    def __init__(self, x, y, dx=None, dy=None):
-        DataInfo.__init__(self)
-        plottable_1D.__init__(self, x, y, dx, dy)
-
-    def __str__(self):
-        """
-        Nice printout
-        """
-        _str = "%s\n" % DataInfo.__str__(self)
-        _str += "Data:\n"
-        _str += "   Type:         %s\n" % self.__class__.__name__
-        _str += "   X-axis:       %s\t[%s]\n" % (self._xaxis, self._xunit)
-        _str += "   Y-axis:       %s\t[%s]\n" % (self._yaxis, self._yunit)
-        _str += "   Length:       %g\n" % len(self.x)
-        return _str
-
     def is_slit_smeared(self):
         """
@@ -843,5 +756,7 @@
             y = numpy.zeros(length)
             dy = numpy.zeros(length)
-            clone = Data1D(x, y, dx=dx, dy=dy)
+            lam = numpy.zeros(length)
+            dlam = numpy.zeros(length)
+            clone = Data1D(x, y, lam=lam, dx=dx, dy=dy, dlam=dlam)
 
         clone.title = self.title
@@ -1018,13 +933,16 @@
     ## Vector of Q-values at the center of each bin in y
     y_bins = None
+    ## No 2D SESANS data as of yet. Always set it to False
+    isSesans = False
 
     def __init__(self, data=None, err_data=None, qx_data=None,
                  qy_data=None, q_data=None, mask=None,
                  dqx_data=None, dqy_data=None):
-        self.y_bins = []
-        self.x_bins = []
         DataInfo.__init__(self)
         plottable_2D.__init__(self, data, err_data, qx_data,
                               qy_data, q_data, mask, dqx_data, dqy_data)
+        self.y_bins = []
+        self.x_bins = []
+
         if len(self.detector) > 0:
             raise RuntimeError, "Data2D: Detector bank already filled at init"
@@ -1265,4 +1183,5 @@
     final_dataset.xmin = data.xmin
     final_dataset.ymin = data.ymin
+    final_dataset.isSesans = datainfo.isSesans
     final_dataset.title = datainfo.title
     final_dataset.run = datainfo.run
Index: src/sas/sascalc/dataloader/readers/cansas_constants.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_constants.py	(revision 250fec92ea66b0770da33360a90f022e1d674072)
+++ src/sas/sascalc/dataloader/readers/cansas_constants.py	(revision ad4632c3bee7cc6b6d8987a3088e925b98cf41ab)
@@ -133,4 +133,6 @@
                "variable" : None,
                "children" : {"Idata" : SASDATA_IDATA,
+                             "Sesans": {"storeas": "content"},
+                             "zacceptance": {"storeas": "float"},
                              "<any>" : ANY
                             }
Index: src/sas/sascalc/dataloader/readers/cansas_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision bcabf4e59bfdf2b9bf9651d0b19f9da3055d5773)
+++ src/sas/sascalc/dataloader/readers/cansas_reader.py	(revision c221349bffb81e7d2d9ea29d4fc752f92190c7cc)
@@ -261,10 +261,20 @@
                 # I and Q - 1D data
                 elif tagname == 'I' and isinstance(self.current_dataset, plottable_1D):
-                    self.current_dataset.yaxis("Intensity", unit)
+                    unit_list = unit.split("|")
+                    if len(unit_list) > 1:
+                        self.current_dataset.yaxis(unit_list[0].strip(),
+                                                   unit_list[1].strip())
+                    else:
+                        self.current_dataset.yaxis("Intensity", unit)
                     self.current_dataset.y = np.append(self.current_dataset.y, data_point)
                 elif tagname == 'Idev' and isinstance(self.current_dataset, plottable_1D):
                     self.current_dataset.dy = np.append(self.current_dataset.dy, data_point)
                 elif tagname == 'Q':
-                    self.current_dataset.xaxis("Q", unit)
+                    unit_list = unit.split("|")
+                    if len(unit_list) > 1:
+                        self.current_dataset.xaxis(unit_list[0].strip(),
+                                                   unit_list[1].strip())
+                    else:
+                        self.current_dataset.xaxis("Q", unit)
                     self.current_dataset.x = np.append(self.current_dataset.x, data_point)
                 elif tagname == 'Qdev':
@@ -278,4 +288,8 @@
                 elif tagname == 'Shadowfactor':
                     pass
+                elif tagname == 'Sesans':
+                    self.current_datainfo.isSesans = bool(data_point)
+                elif tagname == 'zacceptance':
+                    self.current_datainfo.sample.zacceptance = (data_point, unit)
 
                 # I and Qx, Qy - 2D data
@@ -1020,20 +1034,27 @@
             node.append(point)
             self.write_node(point, "Q", datainfo.x[i],
-                            {'unit': datainfo.x_unit})
+                            {'unit': datainfo._xaxis + " | " + datainfo._xunit})
             if len(datainfo.y) >= i:
                 self.write_node(point, "I", datainfo.y[i],
-                                {'unit': datainfo.y_unit})
+                                {'unit': datainfo._yaxis + " | " + datainfo._yunit})
             if datainfo.dy is not None and len(datainfo.dy) > i:
                 self.write_node(point, "Idev", datainfo.dy[i],
-                                {'unit': datainfo.y_unit})
+                                {'unit': datainfo._yaxis + " | " + datainfo._yunit})
             if datainfo.dx is not None and len(datainfo.dx) > i:
                 self.write_node(point, "Qdev", datainfo.dx[i],
-                                {'unit': datainfo.x_unit})
+                                {'unit': datainfo._xaxis + " | " + datainfo._xunit})
             if datainfo.dxw is not None and len(datainfo.dxw) > i:
                 self.write_node(point, "dQw", datainfo.dxw[i],
-                                {'unit': datainfo.x_unit})
+                                {'unit': datainfo._xaxis + " | " + datainfo._xunit})
             if datainfo.dxl is not None and len(datainfo.dxl) > i:
                 self.write_node(point, "dQl", datainfo.dxl[i],
-                                {'unit': datainfo.x_unit})
+                                {'unit': datainfo._xaxis + " | " + datainfo._xunit})
+        if datainfo.isSesans:
+            sesans = self.create_element("Sesans")
+            sesans.text = str(datainfo.isSesans)
+            node.append(sesans)
+            self.write_node(node, "zacceptance", datainfo.sample.zacceptance[0],
+                             {'unit': datainfo.sample.zacceptance[1]})
+
 
     def _write_data_2d(self, datainfo, entry_node):
Index: src/sas/sascalc/dataloader/readers/sesans_reader.py
===================================================================
--- src/sas/sascalc/dataloader/readers/sesans_reader.py	(revision 95253581a7278bcefffb1c4770afed962b126cd7)
+++ src/sas/sascalc/dataloader/readers/sesans_reader.py	(revision 95253581a7278bcefffb1c4770afed962b126cd7)
@@ -8,5 +8,5 @@
 import numpy
 import os
-from sas.sascalc.dataloader.data_info import SESANSData1D
+from sas.sascalc.dataloader.data_info import Data1D
 
 # Check whether we have a converter available
@@ -59,14 +59,5 @@
                     raise  RuntimeError, "sesans_reader: cannot open %s" % path
                 buff = input_f.read()
-#                print buff
                 lines = buff.splitlines()
-#                print lines
-                #Jae could not find python universal line spliter:
-                #keep the below for now
-                # some ascii data has \r line separator,
-                # try it when the data is on only one long line
-#                if len(lines) < 2 :
-#                    lines = buff.split('\r')
-                 
                 x  = numpy.zeros(0)
                 y  = numpy.zeros(0)
@@ -83,24 +74,7 @@
                 tdlam = numpy.zeros(0)
                 tdx = numpy.zeros(0)
-#                print "all good"
-                output = SESANSData1D(x=x, y=y, lam=lam, dy=dy, dx=dx, dlam=dlam)
-#                print output                
+                output = Data1D(x=x, y=y, lam=lam, dy=dy, dx=dx, dlam=dlam, isSesans=True)
                 self.filename = output.filename = basename
 
-#                #Initialize counters for data lines and header lines.
-#                is_data = False  # Has more than 5 lines
-#                # More than "5" lines of data is considered as actual
-#                # data unless that is the only data
-#                mum_data_lines = 5
-#                # To count # of current data candidate lines
-#                i = -1
-#                # To count total # of previous data candidate lines
-#                i1 = -1
-#                # To count # of header lines
-#                j = -1
-#                # Helps to count # of header lines
-#                j1 = -1
-#                #minimum required number of columns of data; ( <= 4).
-#                lentoks = 2
                 paramnames=[]
                 paramvals=[]
@@ -111,6 +85,5 @@
                 Pvals=[]
                 dPvals=[]
-#                print x
-#                print zvals
+
                 for line in lines:
                     # Initial try for CSV (split on ,)
@@ -122,9 +95,9 @@
                     if len(toks)>5:
                         zvals.append(toks[0])
-                        dzvals.append(toks[1])
-                        lamvals.append(toks[2])
-                        dlamvals.append(toks[3])
-                        Pvals.append(toks[4])
-                        dPvals.append(toks[5])
+                        dzvals.append(toks[3])
+                        lamvals.append(toks[4])
+                        dlamvals.append(toks[5])
+                        Pvals.append(toks[1])
+                        dPvals.append(toks[2])
                     else:
                         continue
@@ -140,6 +113,8 @@
                 default_z_unit = "A"
                 data_conv_P = None
-                default_p_unit = " "
+                default_p_unit = " " # Adjust unit for axis (L^-3)
                 lam_unit = lam_header[1].replace("[","").replace("]","")
+                if lam_unit == 'AA':
+                    lam_unit = 'A'
                 varheader=[zvals[0],dzvals[0],lamvals[0],dlamvals[0],Pvals[0],dPvals[0]]
                 valrange=range(1, len(zvals))
@@ -161,22 +136,24 @@
                 output.x, output.x_unit = self._unit_conversion(x, lam_unit, default_z_unit)
                 output.y = y
+                output.y_unit = r'\AA^{-2} cm^{-1}'  # output y_unit added
                 output.dx, output.dx_unit = self._unit_conversion(dx, lam_unit, default_z_unit)
                 output.dy = dy
                 output.lam, output.lam_unit = self._unit_conversion(lam, lam_unit, default_z_unit)
                 output.dlam, output.dlam_unit = self._unit_conversion(dlam, lam_unit, default_z_unit)
+                
+                output.xaxis(r"\rm{z}", output.x_unit)
+                output.yaxis(r"\rm{ln(P)/(t \lambda^2)}", output.y_unit)  # Adjust label to ln P/(lam^2 t), remove lam column refs
 
-                output.xaxis(r"\rm{z}", output.x_unit)
-                output.yaxis(r"\rm{P/P0}", output.y_unit)
                 # Store loading process information
                 output.meta_data['loader'] = self.type_name
-                output.sample.thickness = float(paramvals[6])
+                #output.sample.thickness = float(paramvals[6])
                 output.sample.name = paramvals[1]
                 output.sample.ID = paramvals[0]
                 zaccept_unit_split = paramnames[7].split("[")
                 zaccept_unit = zaccept_unit_split[1].replace("]","")
-                if zaccept_unit.strip() == r'\AA^-1':
+                if zaccept_unit.strip() == r'\AA^-1' or zaccept_unit.strip() == r'\A^-1':
                     zaccept_unit = "1/A"
                 output.sample.zacceptance=(float(paramvals[7]),zaccept_unit)
-                output.vars=varheader
+                output.vars = varheader
 
                 if len(output.x) < 1:
Index: src/sas/sascalc/fit/AbstractFitEngine.py
===================================================================
--- src/sas/sascalc/fit/AbstractFitEngine.py	(revision d3911e3cf881d888113c59010d5c63db40c0181b)
+++ src/sas/sascalc/fit/AbstractFitEngine.py	(revision a9f579c8400c480f42c42445e1ff4dab09a6baa4)
@@ -131,5 +131,5 @@
         a way to get residuals from data.
     """
-    def __init__(self, x, y, dx=None, dy=None, smearer=None, data=None):
+    def __init__(self, x, y, dx=None, dy=None, smearer=None, data=None, lam=None, dlam=None):
         """
             :param smearer: is an object of class QSmearer or SlitSmearer
@@ -152,5 +152,5 @@
                 
         """
-        Data1D.__init__(self, x=x, y=y, dx=dx, dy=dy)
+        Data1D.__init__(self, x=x, y=y, dx=dx, dy=dy, lam=lam, dlam=dlam)
         self.num_points = len(x)
         self.sas_data = data
Index: src/sas/sasgui/guiframe/CategoryInstaller.py
===================================================================
--- src/sas/sasgui/guiframe/CategoryInstaller.py	(revision 212bfc297ca102b648c949f030d3d06a4c569fa3)
+++ src/sas/sasgui/guiframe/CategoryInstaller.py	(revision ddbac6633a1e7ec42b99bb39f46b9889ccf26084)
@@ -123,5 +123,6 @@
         compile it and install
         :param homefile: Override the default home directory
-        :param model_list: List of model names except customized models
+        :param model_list: List of model names except those in Plugin Models
+               which are user supplied.
         """
         _model_dict = { model.name: model for model in model_list}
Index: src/sas/sasgui/guiframe/dataFitting.py
===================================================================
--- src/sas/sasgui/guiframe/dataFitting.py	(revision 345e7e4a8c6f5977c8c07032553b5ab00bdf837d)
+++ src/sas/sasgui/guiframe/dataFitting.py	(revision 68adf86632754e28ed4e1600ebe337656f349a2b)
@@ -17,5 +17,6 @@
     """
     """
-    def __init__(self, x=None, y=None, dx=None, dy=None):
+
+    def __init__(self, x=None, y=None, dx=None, dy=None, lam=None, dlam=None, isSesans=False):
         """
         """
@@ -24,6 +25,8 @@
         if y is None:
             y = []
-        PlotData1D.__init__(self, x, y, dx, dy)
-        LoadData1D.__init__(self, x, y, dx, dy)
+        self.isSesans = isSesans
+        PlotData1D.__init__(self, x, y, dx, dy, lam, dlam)
+        LoadData1D.__init__(self, x, y, dx, dy, lam, dlam, isSesans)
+
         self.id = None
         self.list_group_id = []
@@ -32,5 +35,9 @@
         self.path = None
         self.xtransform = None
+        if self.isSesans:
+            self.xtransform = "x"
         self.ytransform = None
+        if self.isSesans:
+            self.ytransform = "y"
         self.title = ""
         self.scale = None
@@ -68,5 +75,5 @@
         # First, check the data compatibility
         dy, dy_other = self._validity_check(other)
-        result = Data1D(x=[], y=[], dx=None, dy=None)
+        result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=None)
         result.clone_without_data(length=len(self.x), clone=self)
         result.copy_from_datainfo(data1d=self)
@@ -115,7 +122,11 @@
         # First, check the data compatibility
         self._validity_check_union(other)
-        result = Data1D(x=[], y=[], dx=None, dy=None)
+        result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=None)
         tot_length = len(self.x) + len(other.x)
         result = self.clone_without_data(length=tot_length, clone=result)
+        if self.dlam == None or other.dlam is None:
+            result.dlam = None
+        else:
+            result.dlam = numpy.zeros(tot_length)
         if self.dy == None or other.dy is None:
             result.dy = None
@@ -141,4 +152,9 @@
         result.y = numpy.append(self.y, other.y)
         result.y = result.y[ind]
+        result.lam = numpy.append(self.lam, other.lam)
+        result.lam = result.lam[ind]
+        if result.dlam != None:
+            result.dlam = numpy.append(self.dlam, other.dlam)
+            result.dlam = result.dlam[ind]
         if result.dy != None:
             result.dy = numpy.append(self.dy, other.dy)
@@ -260,7 +276,11 @@
         # First, check the data compatibility
         self._validity_check_union(other)
-        result = Data1D(x=[], y=[], dx=None, dy=None)
+        result = Data1D(x=[], y=[], lam=[], dx=None, dy=None, dlam=[])
         tot_length = len(self.x)+len(other.x)
         result.clone_without_data(length=tot_length, clone=self)
+        if self.dlam == None or other.dlam is None:
+            result.dlam = None
+        else:
+            result.dlam = numpy.zeros(tot_length)
         if self.dy == None or other.dy is None:
             result.dy = None
@@ -285,4 +305,6 @@
         result.y = numpy.append(self.y, other.y)
         result.y = result.y[ind]
+        result.lam = numpy.append(self.lam, other.lam)
+        result.lam = result.lam[ind]
         if result.dy != None:
             result.dy = numpy.append(self.dy, other.dy)
Index: src/sas/sasgui/guiframe/data_manager.py
===================================================================
--- src/sas/sasgui/guiframe/data_manager.py	(revision 345e7e4a8c6f5977c8c07032553b5ab00bdf837d)
+++ src/sas/sasgui/guiframe/data_manager.py	(revision 2ffe241a82548f1c3017267ebe33cb91ce512e31)
@@ -61,8 +61,14 @@
         
         if issubclass(Data2D, data.__class__):
-            new_plot = Data2D(image=None, err_image=None) 
-        else: 
-            new_plot = Data1D(x=[], y=[], dx=None, dy=None)
-           
+            new_plot = Data2D(image=None, err_image=None) # For now, isSesans for 2D data is always false
+        else:
+            new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None, isSesans=data.isSesans)
+
+
+        #elif data.meta_data['loader'] == 'SESANS':
+        #    new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None, isSesans=True)
+        #else:
+        #    new_plot = Data1D(x=[], y=[], dx=None, dy=None, lam=None, dlam=None) #SESANS check???
+
         new_plot.copy_from_datainfo(data)
         data.clone_without_data(clone=new_plot)
Index: src/sas/sasgui/perspectives/calculator/model_editor.py
===================================================================
--- src/sas/sasgui/perspectives/calculator/model_editor.py	(revision a08b89bdf5a13632196725c27a97760f06d09e9c)
+++ src/sas/sasgui/perspectives/calculator/model_editor.py	(revision ddbac6633a1e7ec42b99bb39f46b9889ccf26084)
@@ -5,9 +5,9 @@
 function of y (usually the intensity).  It also provides a drop down of
 standard available math functions.  Finally a full python editor panel for
-complete customizatin is provided.
-
-:TODO the writiong of the file and name checking (and maybe some other
-funtions?) should be moved to a computational module which could be called
-fropm a python script.  Basically one just needs to pass the name,
+complete customization is provided.
+
+:TODO the writing of the file and name checking (and maybe some other
+functions?) should be moved to a computational module which could be called
+from a python script.  Basically one just needs to pass the name,
 description text and function text (or in the case of the composite editor
 the names of the first and second model and the operator to be used).
@@ -61,5 +61,5 @@
     """
     Dialog for easy custom composite models.  Provides a wx.Dialog panel
-    to choose two existing models (including pre-existing custom models which
+    to choose two existing models (including pre-existing Plugin Models which
     may themselves be composite models) as well as an operation on those models
     (add or multiply) the resulting model will add a scale parameter for summed
@@ -380,5 +380,5 @@
             color = 'blue'
         except:
-            msg = "Easy Custom Sum/Multipy: Error occurred..."
+            msg = "Easy Sum/Multipy Plugin: Error occurred..."
             info = 'Error'
             color = 'red'
@@ -501,5 +501,5 @@
         self.factor = factor
         self._operator = operator
-        self.explanation = "  Custom Model = %s %s (model1 %s model2)\n" % \
+        self.explanation = "  Plugin Model = %s %s (model1 %s model2)\n" % \
                            (self.factor, f_oper, self._operator)
         self.explanationctr.SetLabel(self.explanation)
@@ -617,5 +617,5 @@
 class EditorPanel(wx.ScrolledWindow):
     """
-    Custom model function editor
+    Simple Plugin Model function editor
     """
     def __init__(self, parent, base, path, title, *args, **kwds):
@@ -652,5 +652,7 @@
         self.msg_sizer = None
         self.warning = ""
-        self._description = "New Custom Model"
+        #This does not seem to be used anywhere so commenting out for now
+        #    -- PDB 2/26/17 
+        #self._description = "New Plugin Model"
         self.function_tcl = None
         self.math_combo = None
@@ -991,5 +993,5 @@
         else:
             self._notes = result
-            msg = "Successful! Please look for %s in Customized Models."%name
+            msg = "Successful! Please look for %s in Plugin Models."%name
             msg += "  " + self._notes
             info = 'Info'
@@ -1138,5 +1140,5 @@
     def on_help(self, event):
         """
-        Bring up the Custom Model Editor Documentation whenever
+        Bring up the New Plugin Model Editor Documentation whenever
         the HELP button is clicked.
 
@@ -1190,5 +1192,5 @@
         #self.Destroy()
 
-## Templates for custom models
+## Templates for plugin models
 
 CUSTOM_TEMPLATE = """
Index: src/sas/sasgui/perspectives/calculator/pyconsole.py
===================================================================
--- src/sas/sasgui/perspectives/calculator/pyconsole.py	(revision d472e86b1c34df53a9ab5a44426b8256aaa39d4d)
+++ src/sas/sasgui/perspectives/calculator/pyconsole.py	(revision ddbac6633a1e7ec42b99bb39f46b9889ccf26084)
@@ -302,5 +302,5 @@
         success = show_model_output(self, fname)
 
-        # Update custom model list in fitpage combobox
+        # Update plugin model list in fitpage combobox
         if success and self._manager != None and self.panel != None:
             self._manager.set_edit_menu_helper(self.parent)
Index: src/sas/sasgui/perspectives/fitting/basepage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/basepage.py	(revision 9e0aa69abc3080680008f6c3525d79d3fb3ba4e9)
+++ src/sas/sasgui/perspectives/fitting/basepage.py	(revision 7a5aedda76976d4f6d7b04abfca1d59d2455dd6d)
@@ -53,7 +53,9 @@
     ON_MAC = True
 
+CUSTOM_MODEL = 'Plugin Models'
+
 class BasicPage(ScrolledPanel, PanelBase):
     """
-    This class provide general structure of  fitpanel page
+    This class provide general structure of the fitpanel page
     """
     # Internal name for the AUI manager
@@ -677,7 +679,7 @@
     def _copy_info(self, flag):
         """
-        Send event dpemding on flag
-
-        : Param flag: flag that distinguish event
+        Send event depending on flag
+
+        : Param flag: flag that distinguishes the event
         """
         # messages depending on the flag
@@ -1119,5 +1121,5 @@
         :precondition: the page is already drawn or created
 
-        :postcondition: the state of the underlying data change as well as the
+        :postcondition: the state of the underlying data changes as well as the
             state of the graphic interface
         """
@@ -1167,5 +1169,5 @@
         self._show_combox(None)
         from models import PLUGIN_NAME_BASE
-        if self.categorybox.GetValue() == 'Customized Models' \
+        if self.categorybox.GetValue() == CUSTOM_MODEL \
                 and PLUGIN_NAME_BASE not in state.formfactorcombobox:
             state.formfactorcombobox = \
@@ -1335,5 +1337,5 @@
     def _selectDlg(self):
         """
-        open a dialog file to selected the customized dispersity
+        open a dialog file to select the customized polydispersity function
         """
         if self.parent is not None:
@@ -1760,5 +1762,5 @@
     def _set_multfactor_combobox(self, multiplicity=10):
         """
-        Set comboBox for muitfactor of CoreMultiShellModel
+        Set comboBox for multitfactor of CoreMultiShellModel
         :param multiplicit: no. of multi-functionality
         """
@@ -1798,5 +1800,5 @@
         Fill panel's combo box according to the type of model selected
         """
-        custom_model = 'Customized Models'
+
         mod_cat = self.categorybox.GetStringSelection()
         self.structurebox.SetSelection(0)
@@ -1807,5 +1809,5 @@
         m_list = []
         try:
-            if mod_cat == custom_model:
+            if mod_cat == CUSTOM_MODEL:
                 for model in self.model_list_box[mod_cat]:
                     m_list.append(self.model_dict[model.name])
@@ -3453,5 +3455,5 @@
         fills out the category list box
         """
-        uncat_str = 'Customized Models'
+        uncat_str = 'Plugin Models'
         self._read_category_info()
 
@@ -3482,5 +3484,5 @@
         self.model_box.Clear()
 
-        if category == 'Customized Models':
+        if category == 'Plugin Models':
             for model in self.model_list_box[category]:
                 str_m = str(model).split(".")[0]
Index: src/sas/sasgui/perspectives/fitting/fitpage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/fitpage.py	(revision 2d568f649389db3d59ceb4e0e7c433010da67d64)
+++ src/sas/sasgui/perspectives/fitting/fitpage.py	(revision 2d568f649389db3d59ceb4e0e7c433010da67d64)
@@ -31,5 +31,5 @@
 SMEAR_SIZE_L = 0.00
 SMEAR_SIZE_H = 0.00
-
+CUSTOM_MODEL = 'Plugin Models'
 
 class FitPage(BasicPage):
@@ -1246,5 +1246,5 @@
             wx.PostEvent(self.parent, new_event)
             # update list of plugins if new plugin is available
-            custom_model = 'Customized Models'
+            custom_model = CUSTOM_MODEL
             mod_cat = self.categorybox.GetStringSelection()
             if mod_cat == custom_model:
Index: src/sas/sasgui/perspectives/fitting/fitting.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/fitting.py	(revision 73cbeec4f3f2dfd3c530e5782984529dc2c133b2)
+++ src/sas/sasgui/perspectives/fitting/fitting.py	(revision ddbac6633a1e7ec42b99bb39f46b9889ccf26084)
@@ -225,7 +225,6 @@
 
         self.id_edit = wx.NewId()
-        editmodel_help = "Edit customized model sample file"
         self.menu1.AppendMenu(self.id_edit, "Plugin Model Operations",
-                              self.edit_model_menu, editmodel_help)
+                              self.edit_model_menu)
         #create  menubar items
         return [(self.menu1, self.sub_menu)]
@@ -260,6 +259,6 @@
             self.update_custom_combo()
             if os.path.isfile(p_path):
-                msg = "Sorry! Could not be able to delete the default "
-                msg += "custom model... \n"
+                msg = "Sorry! unable to delete the default "
+                msg += "plugin model... \n"
                 msg += "Please manually remove the files (.py, .pyc) "
                 msg += "in the 'plugin_models' folder \n"
@@ -274,5 +273,5 @@
                     if item.GetLabel() == label:
                         self.edit_menu.DeleteItem(item)
-                        msg = "The custom model, %s, has been deleted." % label
+                        msg = "The plugin model, %s, has been deleted." % label
                         evt = StatusEvent(status=msg, type='stop', info='info')
                         wx.PostEvent(self.parent, evt)
@@ -331,5 +330,5 @@
             temp = self.fit_panel.reset_pmodel_list()
             if temp:
-                # Set the new custom model list for all fit pages
+                # Set the new plugin model list for all fit pages
                 for uid, page in self.fit_panel.opened_pages.iteritems():
                     if hasattr(page, "formfactorbox"):
@@ -1965,5 +1964,6 @@
                 ## then kill itself but cannot.  Paul Kienzle came up with
                 ## this fix to prevent threads from stepping on each other
-                ## which was causing a simple custom model to crash Sasview.
+                ## which was causing a simple custom plugin model to crash
+                ##Sasview.
                 ## We still don't know why the fit sometimes lauched a second
                 ## thread -- something which should also be investigated.
Index: src/sas/sasgui/perspectives/fitting/media/fitting_help.rst
===================================================================
--- src/sas/sasgui/perspectives/fitting/media/fitting_help.rst	(revision 26c8be33b9ea774c36c0d8fe18b190e6d1cfb90f)
+++ src/sas/sasgui/perspectives/fitting/media/fitting_help.rst	(revision 5295cf5164af9572978a04500767b155d0356342)
@@ -34,5 +34,7 @@
 *  in *Single* fit mode - individual data sets are fitted independently one-by-one
 
-*  in *Simultaneous* fit mode - multiple data sets are fitted simultaneously to the *same* model with/without constrained parameters (this might be useful, for example, if you have measured the same sample at different contrasts)
+*  in *Simultaneous* fit mode - multiple data sets are fitted simultaneously to
+   the *same* model with/without constrained parameters (this might be useful,
+   for example, if you have measured the same sample at different contrasts)
 
 *  in *Batch* fit mode - multiple data sets are fitted sequentially to the *same* model (this might be useful, for example, if you have performed a kinetic or time-resolved experiment and have *lots* of data sets!)
@@ -43,11 +45,17 @@
 -----------------
 
-By default, the models in SasView are grouped into five categories
-
-*  *Shapes* - models describing 'objects' (spheres, cylinders, etc)
+The models in SasView are grouped into categories. By default these consist of:
+
+*  *Cylinder* - cylindrical shapes (disc, right cylinder, cylinder with endcaps
+   etc)
+*  *Ellipsoid* - ellipsoidal shapes (oblate,prolate, core shell, etc)
+*  *Parellelepiped* - as the name implies
+*  *Sphere* - sheroidal shapes (sphere, core multishell, vesicle, etc)
+*  *Lamellae* - lamellar shapes (lamellar, core shell lamellar, stacked
+   lamellar, etc)
 *  *Shape-Independent* - models describing structure in terms of density correlation functions, fractals, peaks, power laws, etc
-*  *Customized Models* - SasView- or User-created (non-library) Python models
-*  *Uncategorised* - other models (for reflectivity, etc)
+*  *Paracrystal* - semi ordered structures (bcc, fcc, etc)
 *  *Structure Factor* - S(Q) models
+*  *Plugin Models* - User-created (custom/non-library) Python models
 
 Use the *Category* drop-down menu to chose a category of model, then select
@@ -84,7 +92,7 @@
 .. image:: cat_fig0.bmp
 
-The categorization of all models except the customized models can be reassigned,
-added to, and removed using *Category Manager*. Models can also be hidden from view
-in the drop-down menus.
+The categorization of all models except the user supplied Plugin Models can be
+reassigned, added to, and removed using *Category Manager*. Models can also be
+hidden from view in the drop-down menus.
 
 .. image:: cat_fig1.bmp
@@ -93,7 +101,7 @@
 ^^^^^^^^^^^^^^^^^
 
-To change category, highlight a model in the list by left-clicking on its entry and
-then click the *Modify* button. Use the *Change Category* panel that appears to make
-the required changes.
+To change category, highlight a model in the list by left-clicking on its entry
+and then click the *Modify* button. Use the *Change Category* panel that appears
+to make the required changes.
 
 .. image:: cat_fig2.bmp
@@ -106,7 +114,7 @@
 ^^^^^^^^^^^^^^^^^^^^^
 
-Use the *Enable All / Disable All* buttons and the check boxes beside each model to
-select the models to show/hide. To apply the selection, click *Ok*. Otherwise click
-*Cancel*.
+Use the *Enable All / Disable All* buttons and the check boxes beside each model
+to select the models to show/hide. To apply the selection, click *Ok*. Otherwise
+click *Cancel*.
 
 *NB: It may be necessary to change to a different category and then back again*
@@ -118,5 +126,6 @@
 ---------------
 
-For a complete list of all the library models available in SasView, see the `Model Documentation <../../../index.html>`_ .
+For a complete list of all the library models available in SasView, see
+the `Model Documentation <../../../index.html>`_ .
 
 It is also possible to add your own models.
@@ -131,7 +140,11 @@
 There are essentially three ways to generate new fitting models for SasView:
 
-* Using the SasView :ref:`New_Plugin_Model` helper dialog (best for beginners and/or relatively simple models)
-* By copying/editing an existing model (this can include models generated by the *New Plugin Model* dialog) in the :ref:`Python_shell` or :ref:`Advanced_Plugin_Editor` (suitable for all use cases)
-* By writing a model from scratch outside of SasView (only recommended for code monkeys!)
+*  Using the SasView :ref:`New_Plugin_Model` helper dialog (best for beginners
+   and/or relatively simple models)
+*  By copying/editing an existing model (this can include models generated by
+   the New Plugin Model* dialog) in the :ref:`Python_shell` or 
+   :ref:`Advanced_Plugin_Editor` (suitable for all use cases)
+*  By writing a model from scratch outside of SasView (only recommended for code
+   monkeys!)
 
 Please read the guidance on :ref:`Writing_a_Plugin` before proceeding.
@@ -163,6 +176,6 @@
 ^^^^^^^^^^^^^^^^
 
-Relatively straightforward models can be programmed directly from the SasView GUI 
-using the *New Plugin Model Function*.
+Relatively straightforward models can be programmed directly from the SasView
+GUI using the *New Plugin Model Function*.
 
 .. image:: new_model.bmp
@@ -175,7 +188,7 @@
 *checked*\ .
 
-Also note that the 'Fit Parameters' have been split into two sections: those which 
-can be polydisperse (shape and orientation parameters) and those which are not
-(eg, scattering length densities).
+Also note that the 'Fit Parameters' have been split into two sections: those
+which can be polydisperse (shape and orientation parameters) and those which are
+not (eg, scattering length densities).
 
 A model file generated by this option can be viewed and further modified using
@@ -187,11 +200,11 @@
 .. image:: sum_model.bmp
 
-This option creates a custom model of the form::
-
-     Custom Model = scale_factor \* {(scale_1 \* model_1) \+ (scale_2 \* model_2)} \+ background
+This option creates a custom Plugin Model of the form::
+
+     Plugin Model = scale_factor * {(scale_1 * model_1) +/- (scale_2 * model_2)} + background
 
 or::
 
-     Custom Model = scale_factor \* model_1 \* model_2 \+ background
+     Plugin Model = scale_factor * model_1 /* model_2 + background
 
 In the *Easy Sum/Multi Editor* give the new model a function name and brief
@@ -232,10 +245,11 @@
 Simply highlight the plugin model to be removed. The operation is final!!!
 
-*NB: Plugin models shipped with SasView cannot be removed in this way.*
+*NB: Models shipped with SasView cannot be removed in this way.*
 
 Load Plugin Models
 ^^^^^^^^^^^^^^^^^^
 
-This option loads (or re-loads) all models present in the *~\\.sasview\\plugin_models* folder.
+This option loads (or re-loads) all models present in the
+*~\\.sasview\\plugin_models* folder.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
@@ -400,6 +414,6 @@
 :ref:`Assessing_Fit_Quality`.
 
-*NB: If you need to use a customized model, you must ensure that model is available*
-*first (see* :ref:`Adding_your_own_models` *).*
+*NB: If you need to use a custom Plugin Model, you must ensure that model is
+available first (see* :ref:`Adding_your_own_models` *).*
 
 Method
@@ -484,8 +498,8 @@
 If multiple data sets are in one file, load just that file. *Unselect All Data*, then
 select a single initial data set to be fitted. Fit that selected data set as described
-above under :ref:`Single_Fit_Mode` .
-
-*NB: If you need to use a customized model, you must ensure that model is available*
-*first (see* :ref:`Adding_your_own_models` *).*
+above under :ref:`Single_Fit_Mode`.
+
+*NB: If you need to use a custom Plugin Model, you must ensure that model is
+available first (see* :ref:`Adding_your_own_models` *).*
 
 Method
Index: src/sas/sasgui/perspectives/fitting/media/plugin.rst
===================================================================
--- src/sas/sasgui/perspectives/fitting/media/plugin.rst	(revision ca6cbc1cb491a7c62055c86b9919549b87b000bc)
+++ src/sas/sasgui/perspectives/fitting/media/plugin.rst	(revision 5295cf5164af9572978a04500767b155d0356342)
@@ -27,5 +27,5 @@
 
 the next time SasView is started it will compile the plugin and add
-it to the list of *Customized Models* in a FitPage.
+it to the list of *Plugin Models* in a FitPage.
 
 SasView models can be of three types:
Index: src/sas/sasgui/perspectives/fitting/models.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/models.py	(revision 0de74afcaf1a275ffd2e71099f9e17e398dcc39a)
+++ src/sas/sasgui/perspectives/fitting/models.py	(revision e92a35222de59b469e74be44064685ec4edc7c19)
@@ -325,5 +325,5 @@
                     self.plugins.append(plug)
                     self.model_dictionary[name] = plug
-            self.model_combobox.set_list("Customized Models", self.plugins)
+            self.model_combobox.set_list("Plugin Models", self.plugins)
             return self.model_combobox.get_list()
         else:
@@ -346,5 +346,5 @@
             self.model_dictionary[name] = plug
 
-        self.model_combobox.reset_list("Customized Models", self.plugins)
+        self.model_combobox.reset_list("Plugin Models", self.plugins)
         return self.model_combobox.get_list()
 
@@ -389,5 +389,5 @@
 #                                     self.shape_indep_list)
         self.model_combobox.set_list("Structure Factors", self.struct_list)
-        self.model_combobox.set_list("Customized Models", self.plugins)
+        self.model_combobox.set_list("Plugin Models", self.plugins)
         self.model_combobox.set_list("P(Q)*S(Q)", self.multiplication_factor)
         self.model_combobox.set_list("multiplication",
Index: src/sas/sasgui/perspectives/fitting/pagestate.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/pagestate.py	(revision 6d2b50b26b2535cfebc0b483dc898cea48fb49fe)
+++ src/sas/sasgui/perspectives/fitting/pagestate.py	(revision 7160131266189ab2ccf927b6fde2648ec04b8260)
@@ -33,7 +33,11 @@
 from sas.sascalc.dataloader.data_info import Data2D, Collimation, Detector
 from sas.sascalc.dataloader.data_info import Process, Aperture
+
 # Information to read/write state as xml
 FITTING_NODE_NAME = 'fitting_plug_in'
 CANSAS_NS = "cansas1d/1.0"
+
+CUSTOM_MODEL = 'Plugin Models'
+CUSTOM_MODEL_OLD = 'Customized Models'
 
 LIST_OF_DATA_ATTRIBUTES = [["is_data", "is_data", "bool"],
@@ -366,4 +370,6 @@
         :return: None
         """
+        if self.categorycombobox == CUSTOM_MODEL_OLD:
+            self.categorycombobox = CUSTOM_MODEL
         if self.formfactorcombobox == '':
             FIRST_FORM = {
@@ -378,5 +384,5 @@
                 'Sphere' : 'adsorbed_layer',
                 'Structure Factor' : 'hardsphere',
-                'Customized Models' : ''
+                CUSTOM_MODEL : ''
             }
             if self.categorycombobox == '':
Index: src/sas/sasgui/plottools/plottables.py
===================================================================
--- src/sas/sasgui/plottools/plottables.py	(revision 345e7e4a8c6f5977c8c07032553b5ab00bdf837d)
+++ src/sas/sasgui/plottools/plottables.py	(revision a9f579c8400c480f42c42445e1ff4dab09a6baa4)
@@ -1023,5 +1023,5 @@
     """
 
-    def __init__(self, x, y, dx=None, dy=None):
+    def __init__(self, x, y, dx=None, dy=None, lam=None, dlam=None):
         """
         Draw points specified by x[i],y[i] in the current color/symbol.
@@ -1037,6 +1037,8 @@
         self.x = x
         self.y = y
+        self.lam = lam
         self.dx = dx
         self.dy = dy
+        self.dlam = dlam
         self.source = None
         self.detector = None
