Index: example/oriented_sesans.py
===================================================================
--- example/oriented_sesans.py	(revision 2cdc35b9c3dcac265c15de2e96a382526a4f45b8)
+++ example/oriented_sesans.py	(revision 2cdc35b9c3dcac265c15de2e96a382526a4f45b8)
@@ -0,0 +1,32 @@
+from bumps.names import *
+
+from sasmodels.data import load_data
+from sasmodels.core import load_model
+from sasmodels.bumps_model import Model, Experiment
+
+# Spherical particle data, not ellipsoids
+data = load_data('../../sasview/sasview/test/sesans_data/sphere2micron.ses')
+data.oriented = True
+
+kernel = load_model("ellipsoid")
+
+model = Model(
+    kernel,
+    scale=0.08, background=0,
+    sld=.291, sld_solvent=7.105,
+    radius_polar=10000, radius_polar_pd=0.222296, radius_polar_pd_n=0,
+    radius_equatorial=2600, radius_equatorial_pd=0.28, radius_equatorial_pd_n=0,
+    theta=60, theta_pd=0, theta_pd_n=0,
+    phi=60, phi_pd=0, phi_pd_n=0,
+    )
+
+# SET THE FITTING PARAMETERS
+model.radius_polar.range(1000, 100000)
+model.radius_equatorial.range(1000, 100000)
+model.theta.range(0, 90)
+model.phi.range(0, 180)
+model.background.range(0,1000)
+model.scale.range(0, 10)
+
+M = Experiment(data=data, model=model)
+problem = FitProblem(M)
Index: example/unoriented_sesans.py
===================================================================
--- example/unoriented_sesans.py	(revision 2cdc35b9c3dcac265c15de2e96a382526a4f45b8)
+++ example/unoriented_sesans.py	(revision 2cdc35b9c3dcac265c15de2e96a382526a4f45b8)
@@ -0,0 +1,26 @@
+from bumps.names import *
+
+from sasmodels.data import load_data
+from sasmodels.core import load_model
+from sasmodels.bumps_model import Model, Experiment
+
+# Spherical particle data, not ellipsoids
+data = load_data('../../sasview/sasview/test/sesans_data/sphere2micron.ses')
+kernel = load_model("sphere*hardsphere")
+
+model = Model(
+    kernel,
+    scale=0.08, background=0,
+    sld=.291, sld_solvent=7.105,
+    radius=10000, radius_pd=0.222296, radius_pd_n=0,
+    volfraction=0.2,
+    )
+
+# SET THE FITTING PARAMETERS
+model.radius.range(1000, 100000)
+model.volfraction.range(0, 1)
+model.background.range(0, 1000)
+model.scale.range(0, 10)
+
+M = Experiment(data=data, model=model)
+problem = FitProblem(M)
Index: sasmodels/direct_model.py
===================================================================
--- sasmodels/direct_model.py	(revision a769b5498ef3f5b7e8381de3d1a999a46950a84b)
+++ sasmodels/direct_model.py	(revision 2cdc35b9c3dcac265c15de2e96a382526a4f45b8)
@@ -202,14 +202,21 @@
 
         if self.data_type == 'sesans':
-            q = sesans.make_q(data.sample.zacceptance, data.Rmax)
-            index = slice(None, None)
-            res = None
-            if data.y is not None:
-                Iq, dIq = data.y, data.dy
+            from sas.sascalc.data_util.nxsunit import Converter
+            qmax, qunits = data.sample.zacceptance
+            SElength = Converter(data._xunit)(data.x, "A")
+            zaccept = Converter(qunits)(qmax, "1/A"),
+            Rmax = 10000000
+            index = slice(None, None)  # equivalent to index [:]
+            Iq = data.y[index]
+            dIq = data.dy[index]
+            oriented = getattr(data, 'oriented', False)
+            if oriented:
+                res = sesans.OrientedSesansTransform(data.x[index], SElength, zaccept, Rmax)
+                # Oriented sesans transform produces q_calc = [qx, qy]
+                q_vectors = res.q_calc
             else:
-                Iq, dIq = None, None
-            #self._theory = np.zeros_like(q)
-            q_vectors = [q]
-            q_mono = sesans.make_all_q(data)
+                res = sesans.SesansTransform(data.x[index], SElength, zaccept, Rmax)
+                # Unoriented sesans transform produces q_calc = q
+                q_vectors = [res.q_calc]
         elif self.data_type == 'Iqxy':
             #if not model.info.parameters.has_2d:
@@ -230,5 +237,4 @@
             #self._theory = np.zeros_like(self.Iq)
             q_vectors = res.q_calc
-            q_mono = []
         elif self.data_type == 'Iq':
             index = (data.x >= data.qmin) & (data.x <= data.qmax)
@@ -255,5 +261,4 @@
             #self._theory = np.zeros_like(self.Iq)
             q_vectors = [res.q_calc]
-            q_mono = []
         elif self.data_type == 'Iq-oriented':
             index = (data.x >= data.qmin) & (data.x <= data.qmax)
@@ -272,5 +277,4 @@
                                       qy_width=data.dxl[index])
             q_vectors = res.q_calc
-            q_mono = []
         else:
             raise ValueError("Unknown data type") # never gets here
@@ -279,5 +283,4 @@
         # so we can save/restore state
         self._kernel_inputs = q_vectors
-        self._kernel_mono_inputs = q_mono
         self._kernel = None
         self.Iq, self.dIq, self.index = Iq, dIq, index
@@ -306,7 +309,4 @@
         if self._kernel is None:
             self._kernel = self._model.make_kernel(self._kernel_inputs)
-            self._kernel_mono = (
-                self._model.make_kernel(self._kernel_mono_inputs)
-                if self._kernel_mono_inputs else None)
 
         Iq_calc = call_kernel(self._kernel, pars, cutoff=cutoff)
@@ -316,17 +316,10 @@
         # TODO: refactor so we don't store the result in the model
         self.Iq_calc = None
-        if self.data_type == 'sesans':
-            Iq_mono = (call_kernel(self._kernel_mono, pars, mono=True)
-                       if self._kernel_mono_inputs else None)
-            result = sesans.transform(self._data,
-                                      self._kernel_inputs[0], Iq_calc,
-                                      self._kernel_mono_inputs, Iq_mono)
-        else:
-            result = self.resolution.apply(Iq_calc)
-            if hasattr(self.resolution, 'nx'):
-                self.Iq_calc = (
-                    self.resolution.qx_calc, self.resolution.qy_calc,
-                    np.reshape(Iq_calc, (self.resolution.ny, self.resolution.nx))
-                )
+        result = self.resolution.apply(Iq_calc)
+        if hasattr(self.resolution, 'nx'):
+            self.Iq_calc = (
+                self.resolution.qx_calc, self.resolution.qy_calc,
+                np.reshape(Iq_calc, (self.resolution.ny, self.resolution.nx))
+            )
         return result
 
Index: sasmodels/sesans.py
===================================================================
--- sasmodels/sesans.py	(revision 7c1cce33768834960ded2d38104d915782069119)
+++ sasmodels/sesans.py	(revision 2cdc35b9c3dcac265c15de2e96a382526a4f45b8)
@@ -45,6 +45,4 @@
         #import logging; logging.info("creating SESANS transform")
         self.q = z
-        # isoriented flag determines whether data is from an oriented sample or
-        # not, should be a selection variable upon entering SESANS data.
         self._set_hankel(SElength, zaccept, Rmax)
 
@@ -105,6 +103,4 @@
         #import logging; logging.info("creating SESANS transform")
         self.q = z
-        # isoriented flag determines whether data is from an oriented sample or
-        # not, should be a selection variable upon entering SESANS data.
         self._set_cosmat(SElength, zaccept, Rmax)
 
@@ -113,5 +109,5 @@
         Iq = np.reshape(Iq, self._Iq_shape)
         G0 = self._cos0 * np.sum(Iq) * dq
-        G = np.sum(np.dot(Iq, self._cosmat.T), axis=1) * dq
+        G = np.sum(np.dot(Iq, self._cosmat), axis=0) * dq
         P = G - G0
         return P
@@ -125,4 +121,5 @@
         q_max = 2 * pi / (SElength[1] - SElength[0])
         q_min = 0.1 * 2 * pi / (np.size(SElength) * SElength[-1])
+        q_min *= 100
 
         q = np.arange(q_min, q_max, q_min, dtype='float32')
@@ -130,5 +127,5 @@
 
         cos0 = np.float32(dq / (2 * pi))
-        cosmat = np.float32(dq / (2 * pi)) * np.cos(q[:, None] * SE[None, :])
+        cosmat = np.float32(dq / (2 * pi)) * np.cos(q[:, None] * SElength[None, :])
 
         qx, qy = np.meshgrid(q, q)
