Index: sasmodels/mixture.py
===================================================================
--- sasmodels/mixture.py	(revision 15c80af4414c35749bdc01df46d248dfddd485d3)
+++ sasmodels/mixture.py	(revision b171acdab344b2827f9bdca29d66411c2484991f)
@@ -34,5 +34,4 @@
     # Build new parameter list
     combined_pars = []
-    control = None
 
     all_parts = copy(parts)
@@ -117,6 +116,4 @@
                 p.length_control = prefix + p.length_control
             combined_pars.append(p)
-            if p.is_control and control is None:
-                control = p.id
     parameters = ParameterTable(combined_pars)
     parameters.max_pd = sum(part.parameters.max_pd for part in parts)
@@ -132,5 +129,4 @@
     model_info = ModelInfo()
     model_info.id = operation.join(part.id for part in parts)
-    model_info.control = control
     model_info.operation = operation
     model_info.name = '(' + operation.join(part.name for part in parts) + ')'
Index: sasmodels/modelinfo.py
===================================================================
--- sasmodels/modelinfo.py	(revision bd547d022d7afce0c8a39ebfc0c2551bc9339186)
+++ sasmodels/modelinfo.py	(revision b171acdab344b2827f9bdca29d66411c2484991f)
@@ -291,5 +291,24 @@
     example, might be used to set the value of a shape parameter.
 
-    These values are set by :func:`make_parameter_table` and
+    Control parameters are used for variant models such as :ref:`rpa` which
+    have different cases with different parameters, as well as models
+    like :ref:`spherical_sld` with its user defined number of shells.
+    The control parameter should appear in the parameter table along with the
+    parameters it is is controlling.  For variant models, use *[CASES]* in
+    place of the parameter limits Within the parameter definition table,
+    with case names such as::
+
+         CASES = ["diblock copolymer", "triblock copolymer", ...]
+
+    This should give *limits=[[case1, case2, ...]]*, but the model loader
+    translates it to *limits=[0, len(CASES)-1]*, and adds *choices=CASES* to
+    the :class:`Parameter` definition. Note that models can use a list of
+    cases as a parameter without it being a control parameter.  Either way,
+    the parameter is sent to the model evaluator as *float(choice_num)*,
+    where choices are numbered from 0. :meth:`ModelInfo.get_hidden_parameters`
+    will determine which parameers to display.
+
+    The class contructor should not be called directly, but instead the
+    parameter table is built using :func:`make_parameter_table` and
     :func:`parse_parameter` therein.
     """
@@ -813,9 +832,4 @@
     info.single = getattr(kernel_module, 'single', not callable(info.Iq))
     info.random = getattr(kernel_module, 'random', None)
-
-    # multiplicity info
-    control_pars = [p.id for p in parameters.kernel_parameters if p.is_control]
-    default_control = control_pars[0] if control_pars else None
-    info.control = getattr(kernel_module, 'control', default_control)
     info.hidden = getattr(kernel_module, 'hidden', None) # type: ignore
 
@@ -872,16 +886,4 @@
     #: *sphere*hardsphere* or *cylinder+sphere*.
     composition = None      # type: Optional[Tuple[str, List[ModelInfo]]]
-    #: Name of the control parameter for a variant model such as :ref:`rpa`.
-    #: The *control* parameter should appear in the parameter table, with
-    #: limits defined as *[CASES]*, for case names such as
-    #: *CASES = ["diblock copolymer", "triblock copolymer", ...]*.
-    #: This should give *limits=[[case1, case2, ...]]*, but the
-    #: model loader translates this to *limits=[0, len(CASES)-1]*, and adds
-    #: *choices=CASES* to the :class:`Parameter` definition. Note that
-    #: models can use a list of cases as a parameter without it being a
-    #: control parameter.  Either way, the parameter is sent to the model
-    #: evaluator as *float(choice_num)*, where choices are numbered from 0.
-    #: See also :attr:`hidden`.
-    control = None          # type: str
     #: Different variants require different parameters.  In order to show
     #: just the parameters needed for the variant selected by :attr:`control`,
Index: sasmodels/product.py
===================================================================
--- sasmodels/product.py	(revision 2d81cfe3be42579d563407fb9275b7b516fee234)
+++ sasmodels/product.py	(revision b171acdab344b2827f9bdca29d66411c2484991f)
@@ -103,5 +103,4 @@
     # Remember the component info blocks so we can build the model
     model_info.composition = ('product', [p_info, s_info])
-    model_info.control = p_info.control
     model_info.hidden = p_info.hidden
     if getattr(p_info, 'profile', None) is not None:
Index: sasmodels/sasview_model.py
===================================================================
--- sasmodels/sasview_model.py	(revision a4f1a73be1e90dfd9e4088cd4b158df12b39b726)
+++ sasmodels/sasview_model.py	(revision b171acdab344b2827f9bdca29d66411c2484991f)
@@ -253,9 +253,12 @@
 
     # Process multiplicity
+    control_pars = [p.id for p in model_info.parameters.kernel_parameters
+                    if p.is_control]
+    control = control_pars[0] if control_pars else None
     non_fittable = []  # type: List[str]
     xlabel = model_info.profile_axes[0] if model_info.profile is not None else ""
     variants = MultiplicityInfo(0, "", [], xlabel)
     for p in model_info.parameters.kernel_parameters:
-        if p.name == model_info.control:
+        if p.id == control:
             non_fittable.append(p.name)
             variants = MultiplicityInfo(
@@ -800,5 +803,5 @@
         """
         if par.name not in self.params:
-            if par.name == self.multiplicity_info.control:
+            if par.id == self.multiplicity_info.control:
                 return self.multiplicity, [self.multiplicity], [1.0]
             else:
