Index: sasmodels/compare.py
===================================================================
--- sasmodels/compare.py	(revision bd7630de7da8bd67aa24b8fc036b2dcc1bc72a16)
+++ sasmodels/compare.py	(revision b6dab593c79746782c4a219575cdab3d003ba1f4)
@@ -1151,5 +1151,5 @@
         'rel_err'   : True,
         'explore'   : False,
-        'use_demo'  : True,
+        'use_demo'  : False,
         'zero'      : False,
         'html'      : False,
Index: sasmodels/generate.py
===================================================================
--- sasmodels/generate.py	(revision 6e45516f19370dc8d3a8ff3fa00959f6e27d9e19)
+++ sasmodels/generate.py	(revision b6dab593c79746782c4a219575cdab3d003ba1f4)
@@ -968,5 +968,6 @@
         pars = model_info.parameters.kernel_parameters
     else:
-        pars = model_info.parameters.COMMON + model_info.parameters.kernel_parameters
+        pars = (model_info.parameters.common_parameters
+                + model_info.parameters.kernel_parameters)
     partable = make_partable(pars)
     subst = dict(id=model_info.id.replace('_', '-'),
Index: sasmodels/modelinfo.py
===================================================================
--- sasmodels/modelinfo.py	(revision 7b9e4ddca7ad3551d8fe3696d2afe75b0018599e)
+++ sasmodels/modelinfo.py	(revision b6dab593c79746782c4a219575cdab3d003ba1f4)
@@ -405,4 +405,8 @@
       parameters counted as n individual parameters p1, p2, ...
 
+    * *common_parameters* is the list of common parameters, with a unique
+      copy for each model so that structure factors can have a default
+      background of 0.0.
+
     * *call_parameters* is the complete list of parameters to the kernel,
       including scale and background, with vector parameters recorded as
@@ -417,9 +421,12 @@
     parameters don't use vector notation, and instead use p1, p2, ...
     """
-    # scale and background are implicit parameters
-    COMMON = [Parameter(*p) for p in COMMON_PARAMETERS]
-
     def __init__(self, parameters):
         # type: (List[Parameter]) -> None
+
+        # scale and background are implicit parameters
+        # Need them to be unique to each model in case they have different
+        # properties, such as default=0.0 for structure factor backgrounds.
+        self.common_parameters = [Parameter(*p) for p in COMMON_PARAMETERS]
+
         self.kernel_parameters = parameters
         self._set_vector_lengths()
@@ -570,5 +577,5 @@
     def _get_call_parameters(self):
         # type: () -> List[Parameter]
-        full_list = self.COMMON[:]
+        full_list = self.common_parameters[:]
         for p in self.kernel_parameters:
             if p.length == 1:
@@ -673,5 +680,5 @@
 
         # Gather the user parameters in order
-        result = control + self.COMMON
+        result = control + self.common_parameters
         for p in self.kernel_parameters:
             if not is2d and p.type in ('orientation', 'magnetic'):
@@ -772,7 +779,22 @@
         return kernel_module.model_info
     info = ModelInfo()
+
+    # Build the parameter table
     #print("make parameter table", kernel_module.parameters)
     parameters = make_parameter_table(getattr(kernel_module, 'parameters', []))
+
+    # background defaults to zero for structure factor models
+    structure_factor = getattr(kernel_module, 'structure_factor', False)
+    if structure_factor:
+        # Make sure background is the second common parameter
+        assert COMMON_PARAMETERS[1][0] == "background"
+        parameters.common_parameters[1].default = 0.0
+
+    # TODO: remove demo parameters
+    # The plots in the docs are generated from the model default values.
+    # Sascomp set parameters from the command line, and so doesn't need
+    # demo values for testing.
     demo = expand_pars(parameters, getattr(kernel_module, 'demo', None))
+
     filename = abspath(kernel_module.__file__).replace('.pyc', '.py')
     kernel_id = splitext(basename(filename))[0]
@@ -791,5 +813,5 @@
     info.docs = kernel_module.__doc__
     info.category = getattr(kernel_module, 'category', None)
-    info.structure_factor = getattr(kernel_module, 'structure_factor', False)
+    info.structure_factor = structure_factor
     info.profile_axes = getattr(kernel_module, 'profile_axes', ['x', 'y'])
     info.source = getattr(kernel_module, 'source', [])
Index: sasmodels/models/hardsphere.py
===================================================================
--- sasmodels/models/hardsphere.py	(revision 2d81cfe3be42579d563407fb9275b7b516fee234)
+++ sasmodels/models/hardsphere.py	(revision b6dab593c79746782c4a219575cdab3d003ba1f4)
@@ -171,6 +171,4 @@
 # VR defaults to 1.0
 
-demo = dict(radius_effective=200, volfraction=0.2,
-            radius_effective_pd=0.1, radius_effective_pd_n=40)
 # Q=0.001 is in the Taylor series, low Q part, so add Q=0.1,
 # assuming double precision sasview is correct
