Index: sasmodels/gpu.py
===================================================================
--- sasmodels/gpu.py	(revision ce27e213b076822e24ff35e97da5c4dd53eb45b0)
+++ sasmodels/gpu.py	(revision 1780d5917f12726485d1b9b4d0343ac8454b6e34)
@@ -270,4 +270,5 @@
         loops_N = [np.uint32(len(p[0])) for p in pd_pars]
 
+        #import sys; print >>sys.stderr,"opencl eval",pars
         #print "opencl eval",pars
         if len(loops) > MAX_LOOPS:
Index: sasmodels/models/cylinder_clone.c
===================================================================
--- sasmodels/models/cylinder_clone.c	(revision ce27e213b076822e24ff35e97da5c4dd53eb45b0)
+++ sasmodels/models/cylinder_clone.c	(revision 1780d5917f12726485d1b9b4d0343ac8454b6e34)
@@ -209,4 +209,4 @@
     // The additional volume factor is for polydisperse volume normalization.
     const real s = (sldCyl - sldSolv) * form_volume(radius, length);
-    return REAL(1.0e8) * form * s * s; // * correction;
-}
+    return REAL(4.0e8) * form * s * s; // * correction;
+}
Index: sasmodels/sasview_model.py
===================================================================
--- sasmodels/sasview_model.py	(revision ce27e213b076822e24ff35e97da5c4dd53eb45b0)
+++ sasmodels/sasview_model.py	(revision 1780d5917f12726485d1b9b4d0343ac8454b6e34)
@@ -4,14 +4,12 @@
 import numpy as np
 
-def make_class(name, class_name=None):
+def make_class(name, class_name=None, dtype='single'):
     from .core import opencl_model
     if class_name is None:
         class_name = "".join(part.capitalize() for part in name.split('_')+['model'])
-    model =  opencl_model(name)
+    model =  opencl_model(name, dtype=dtype)
     class ConstructedModel(SasviewModel):
         kernel = model
         def __init__(self, multfactor=1):
-            if self.kernel is None:
-                self.__class__.kernel = opencl_model(name)
             SasviewModel.__init__(self, self.kernel)
     ConstructedModel.__name__ = class_name
@@ -46,5 +44,5 @@
                 'width': 0,
                 'npts': 35,
-                'nsigma': 3,
+                'nsigmas': 3,
                 'type': 'gaussian',
             }
@@ -160,12 +158,10 @@
         Return a list of all available parameters for the model
         """
-        list = []
-
-        for item in self.dispersion.keys():
-            for p in self.dispersion[item].keys():
-                if p not in ['type']:
-                    list.append('%s.%s' % (item.lower(), p.lower()))
-
-        return list
+        # TODO: fix test so that parameter order doesn't matter
+        ret = ['%s.%s'%(d.lower(), p)
+               for d in self._model.info['partype']['pd-2d']
+               for p in ('npts', 'nsigmas', 'width')]
+        #print ret
+        return ret
 
     def clone(self):
@@ -295,5 +291,21 @@
         :param dispersion: dispersion object of type Dispersion
         """
-        if parameter.lower() in (s.name.lower() for s in self.params.keys()):
+        if parameter.lower() in (s.lower() for s in self.params.keys()):
+            # TODO: Store the disperser object directly in the model.
+            # The current method of creating one on the fly whenever it is
+            # needed is kind of funky.
+            # Note: can't seem to get disperser parameters from sasview
+            # (1) Could create a sasview model that has not yet # been
+            # converted, assign the disperser to one of its polydisperse
+            # parameters, then retrieve the disperser parameters from the
+            # sasview model.  (2) Could write a disperser parameter retriever
+            # in sasview.  (3) Could modify sasview to use sasmodels.weights
+            # dispersers.
+            # For now, rely on the fact that the sasview only ever uses
+            # new dispersers in the set_dispersion call and create a new
+            # one instead of trying to assign parameters.
+            from . import weights
+            disperser = weights.dispersers[dispersion.__class__.__name__]
+            dispersion = weights.models[disperser]()
             self.dispersion[parameter] = dispersion.get_pars()
         else:
@@ -321,5 +333,6 @@
         dis = self.dispersion[par]
         v,w = weights.get_weights(
-            dis['type'], dis['npts'], dis['width'], dis['nsigma'],
+            dis['type'], dis['npts'], dis['width'], dis['nsigmas'],
             self.params[par], limits[par], par in relative)
         return v,w/w.max()
+
Index: sasmodels/weights.py
===================================================================
--- sasmodels/weights.py	(revision ce27e213b076822e24ff35e97da5c4dd53eb45b0)
+++ sasmodels/weights.py	(revision 1780d5917f12726485d1b9b4d0343ac8454b6e34)
@@ -38,5 +38,4 @@
         For orientation parameters use absolute.
         """
-        npts, width, nsigmas = self.npts, self.width, self.nsigmas
         sigma = self.width * center if relative else self.width
         if sigma == 0:
@@ -122,7 +121,13 @@
 ))
 
-def get_weights(disperser, n, width, nsigma, value, limits, relative):
+
+def get_weights(disperser, n, width, nsigmas, value, limits, relative):
     cls = models[disperser]
-    obj = cls(n, width, nsigma)
+    obj = cls(n, width, nsigmas)
     v,w = obj.get_weights(value, limits[0], limits[1], relative)
     return v,w
+
+# Hack to allow sasview dispersion objects to interoperate with sasmodels
+dispersers = dict((v.__name__,k) for k,v in models.items())
+dispersers['DispersionModel'] = RectangleDispersion.type
+
