Index: sasmodels/core.py
===================================================================
--- sasmodels/core.py	(revision 39cc3be463702abd9eb83c30be5fe58c404e6e49)
+++ sasmodels/core.py	(revision 08809662f33b5a7a3b6c32bfad8ddb2f77681c59)
@@ -183,5 +183,5 @@
     value = values.get(parameter.name, parameter.default)
     if parameter.type not in ('volume', 'orientation'):
-        return [value], []
+        return np.array([value]), np.array([1.0])
     relative = parameter.type == 'volume'
     limits = parameter.limits
@@ -208,5 +208,5 @@
     return value, weight
 
-def call_kernel(kernel, values, cutoff=0, mono=False):
+def call_kernel(kernel, pars, cutoff=0, mono=False):
     """
     Call *kernel* returned from :func:`make_kernel` with parameters *pars*.
@@ -221,17 +221,23 @@
     *mono* is True if polydispersity should be set to none on all parameters.
     """
-    if mono or True:
-        pars = np.array([values.get(p.name, p.default)
-                         for p in kernel.info['parameters']],
-                        dtype=kernel.dtype)
-        weights = np.array([1.0], dtype=kernel.dtype)
+    if mono:
+        values = [pars.get(p.name, p.default) for p in kernel.info['parameters']]
+        weights = [1.0]*len(values)
+    else:
+        wv_pairs = [get_weights(p, pars) for p in kernel.info['parameters']]
+        weights, values = [v for v in zip(*wv_pairs)]
+
+    #TODO: This is what we thought to do if max([len(w) for w in weights]) > 1:
+    if max([w for w in weights]) > 1:
+        details = generate.poly_details(kernel.info, weights)
+    else:
         details = kernel.info['mono_details']
-        return kernel(details,  weights, pars, cutoff)
-    else:
-        pairs = [get_weights(p, values) for p in kernel.info['parameters']]
-        weights, pars = [v for v in zip(*pairs)]
-        details = generate.poly_details(kernel.info, weights, pars)
-        weights, pars = [np.hstack(v) for v in (weights, pars)]
-        return kernel(details, weights, pars, cutoff)
+
+    weights, values = [np.hstack(v) for v in (weights, values)]
+
+    weights = weights.astype(dtype=kernel.dtype)
+    values = values.astype(dtype=kernel.dtype)
+
+    return kernel(details, weights, values, cutoff)
 
 def call_ER_VR(model_info, vol_pars):
Index: sasmodels/generate.py
===================================================================
--- sasmodels/generate.py	(revision a6f9577d78dbd6233f8ac5c41ba27cca81cfb6a2)
+++ sasmodels/generate.py	(revision 08809662f33b5a7a3b6c32bfad8ddb2f77681c59)
@@ -693,12 +693,17 @@
     # Note: the reversing view, x[::-1], does not require a copy
     pd_length = np.array([len(w) for w in weights])
+    print (pd_length)
     pd_offset = np.cumsum(np.hstack((0, pd_length)))
     pd_isvol = np.array([p.type=='volume' for p in pars])
     idx = np.argsort(pd_length)[::-1][:max_pd]
-    pd_stride = np.cumprod(np.hstack((1, np.maximum(pd_length[idx][:-1],1))))
-    par_offsets = np.cumsum(np.hstack((2, np.maximum(pd_length, 1))))[:-1]
-    theta_par = model_info['theta_par']
-    if theta_par >= 0 and pd_length[theta_par] <= 1:
-        theta_par = -1
+    print (idx)
+    pd_stride = np.cumprod(np.hstack((1, pd_length[idx][:-1])))
+    par_offsets = np.cumsum(np.hstack((2, pd_length)))[:-1]
+
+    theta_par = -1
+    if 'theta_par' in model_info:
+        theta_par = model_info['theta_par']
+        if theta_par >= 0 and pd_length[theta_par] <= 1:
+            theta_par = -1
 
     details = np.empty(constants_offset + 3, 'int32')
Index: sasmodels/kerneldll.py
===================================================================
--- sasmodels/kerneldll.py	(revision 39cc3be463702abd9eb83c30be5fe58c404e6e49)
+++ sasmodels/kerneldll.py	(revision 08809662f33b5a7a3b6c32bfad8ddb2f77681c59)
@@ -271,8 +271,12 @@
         #weights = np.asarray(weights, dtype=real)
         #values = np.asarray(values, dtype=real)
+        #TODO: How can I access max_pd and is this the way to do it?
+        #max_pd = model_info['max_pd']
+        max_pd = 1
         args = [
             self.q_input.nq, # nq
+            #TODO: pd_start will need to be changed
             0, # pd_start
-            1, # pd_stop
+            details[3*max_pd:4*max_pd], # pd_stop pd_stride[MAX_PD]
             details.ctypes.data, # problem
             weights.ctypes.data,  # weights
