Index: src/sas/sasgui/guiframe/CategoryInstaller.py
===================================================================
--- src/sas/sasgui/guiframe/CategoryInstaller.py	(revision 235f514ba93b57fa63e44309f182acef0b98bb55)
+++ src/sas/sasgui/guiframe/CategoryInstaller.py	(revision 65f39301a9c81af2f10a086dec2a40fcaf25a0bc)
@@ -19,5 +19,5 @@
 logger = logging.getLogger(__name__)
 
-class CategoryInstaller:
+class CategoryInstaller(object):
     """
     Class for making sure all category stuff is installed
@@ -34,14 +34,6 @@
         returns the dir where installed_models.txt should be
         """
-        import sas.sascalc.dataloader.readers
-        return sas.sascalc.dataloader.readers.get_data_path()
-
-    @staticmethod
-    def _get_models_py_dir():
-        """
-        returns the dir where models.py should be
-        """
-        import sas.sasgui.perspectives.fitting.models
-        return sas.sasgui.perspectives.fitting.models.get_model_python_path()
+        from sas.sascalc.dataloader.readers import get_data_path
+        return get_data_path()
 
     @staticmethod
@@ -85,5 +77,5 @@
         by_model_dict = defaultdict(list)
         model_enabled_dict = defaultdict(bool)
-        
+
         for category in master_category_dict:
             for (model, enabled) in master_category_dict[category]:
@@ -96,5 +88,5 @@
     def _regenerate_master_dict(by_model_dict, model_enabled_dict):
         """
-        regenerates master_category_dict from by_model_dict 
+        regenerates master_category_dict from by_model_dict
         and model_enabled_dict
         returns the master category dictionary
@@ -128,5 +120,5 @@
                which are user supplied.
         """
-        _model_dict = { model.name: model for model in model_list}
+        _model_dict = {model.name: model for model in model_list}
         _model_list = _model_dict.keys()
 
@@ -150,9 +142,9 @@
                 model_name, enabled = master_category_dict[cat][ind]
                 if model_name not in _model_list:
-                    del_name = True 
+                    del_name = True
                     try:
                         by_model_dict.pop(model_name)
                         model_enabled_dict.pop(model_name)
-                    except:
+                    except Exception:
                         logger.error("CategoryInstaller: %s", sys.exc_value)
                 else:
@@ -160,6 +152,8 @@
         if del_name or (len(add_list) > 0):
             for model in add_list:
-                model_enabled_dict[model]= True
-                if _model_dict[model].category is None or len(str(_model_dict[model].category.capitalize())) == 0:
+                model_enabled_dict[model] = True
+                # TODO: should be:  not _model_dict[model].category
+                if (_model_dict[model].category is None
+                        or len(str(_model_dict[model].category.capitalize())) == 0):
                     by_model_dict[model].append('Uncategorized')
                 else:
Index: src/sas/sasgui/perspectives/calculator/model_editor.py
===================================================================
--- src/sas/sasgui/perspectives/calculator/model_editor.py	(revision a1b8fee73528559155793dd74cda07d0c32e9d72)
+++ src/sas/sasgui/perspectives/calculator/model_editor.py	(revision 65f39301a9c81af2f10a086dec2a40fcaf25a0bc)
@@ -657,5 +657,5 @@
         self.warning = ""
         #This does not seem to be used anywhere so commenting out for now
-        #    -- PDB 2/26/17 
+        #    -- PDB 2/26/17
         #self._description = "New Plugin Model"
         self.function_tcl = None
@@ -740,5 +740,5 @@
         self.param_sizer.AddMany([(param_txt, 0, wx.LEFT, 10),
                                   (self.param_tcl, 1, wx.EXPAND | wx.ALL, 10)])
-        
+
         # Parameters with polydispersity
         pd_param_txt = wx.StaticText(self, -1, 'Fit Parameters requiring ' + \
@@ -755,5 +755,5 @@
         self.pd_param_tcl.setDisplayLineNumbers(True)
         self.pd_param_tcl.SetToolTipString(pd_param_tip)
-        
+
         self.param_sizer.AddMany([(pd_param_txt, 0, wx.LEFT, 10),
                                   (self.pd_param_tcl, 1, wx.EXPAND | wx.ALL, 10)])
@@ -1030,12 +1030,12 @@
         if has_scipy:
             lines.insert(0, 'import scipy')
-        
-        # Think about 2D later        
+
+        # Think about 2D later
         #self.is_2d = func_str.count("#self.ndim = 2")
         #line_2d = ''
         #if self.is_2d:
         #    line_2d = CUSTOM_2D_TEMP.split('\n')
-        
-        # Also think about test later        
+
+        # Also think about test later
         #line_test = TEST_TEMPLATE.split('\n')
         #local_params = ''
@@ -1043,5 +1043,5 @@
         spaces4  = ' '*4
         spaces13 = ' '*13
-        spaces16 = ' '*16     
+        spaces16 = ' '*16
         param_names = []    # to store parameter names
         has_scipy = func_str.count("scipy.")
@@ -1055,9 +1055,9 @@
             out_f.write(line + '\n')
             if line.count('#name'):
-                out_f.write('name = "%s" \n' % name)               
+                out_f.write('name = "%s" \n' % name)
             elif line.count('#title'):
-                out_f.write('title = "User model for %s"\n' % name)               
+                out_f.write('title = "User model for %s"\n' % name)
             elif line.count('#description'):
-                out_f.write('description = "%s"\n' % desc_str)               
+                out_f.write('description = "%s"\n' % desc_str)
             elif line.count('#parameters'):
                 out_f.write('parameters = [ \n')
@@ -1075,5 +1075,5 @@
                         out_f.write("%s['%s', '', %s, [-numpy.inf, numpy.inf], 'volume', ''],\n" % (spaces16, pname, pvalue))
                 out_f.write('%s]\n' % spaces13)
-            
+
         # No form_volume or ER available in simple model editor
         out_f.write('def form_volume(*arg): \n')
@@ -1082,5 +1082,5 @@
         out_f.write('def ER(*arg): \n')
         out_f.write('    return 1.0 \n')
-        
+
         # function to compute
         out_f.write('\n')
@@ -1091,7 +1091,7 @@
         for func_line in func_str.split('\n'):
             out_f.write('%s%s\n' % (spaces4, func_line))
-        
+
         Iqxy_string = 'return Iq(numpy.sqrt(x**2+y**2) '
-            
+
         out_f.write('\n')
         out_f.write('def Iqxy(x, y ')
@@ -1204,5 +1204,5 @@
 import numpy
 
-#name 
+#name
 
 #title
@@ -1210,5 +1210,5 @@
 #description
 
-#parameters 
+#parameters
 
 """
@@ -1590,5 +1590,4 @@
 
 if __name__ == "__main__":
-#    app = wx.PySimpleApp()
     main_app = wx.App()
     main_frame = TextDialog(id=1, model_list=["SphereModel", "CylinderModel"],
@@ -1596,9 +1595,2 @@
     main_frame.ShowModal()
     main_app.MainLoop()
-
-#if __name__ == "__main__":
-#    from sas.sasgui.perspectives.fitting import models
-#    dir_path = models.find_plugins_dir()
-#    app = wx.App()
-#    window = EditorWindow(parent=None, base=None, path=dir_path, title="Editor")
-#    app.MainLoop()
Index: src/sas/sasgui/perspectives/fitting/basepage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/basepage.py	(revision ba8d326f0f4ceb55c77296a9b5af8bd013c7dd92)
+++ src/sas/sasgui/perspectives/fitting/basepage.py	(revision 65f39301a9c81af2f10a086dec2a40fcaf25a0bc)
@@ -19,9 +19,12 @@
 from wx.lib.scrolledpanel import ScrolledPanel
 
+from sasmodels.sasview_model import MultiplicationModel
 from sasmodels.weights import MODELS as POLYDISPERSITY_MODELS
+from sasmodels.weights import GaussianDispersion
 
 from sas.sascalc.dataloader.data_info import Detector
 from sas.sascalc.dataloader.data_info import Source
 from sas.sascalc.fit.pagestate import PageState
+from sas.sascalc.fit.models import PLUGIN_NAME_BASE
 
 from sas.sasgui.guiframe.panel_base import PanelBase
@@ -38,5 +41,6 @@
 from sas.sasgui.guiframe.documentation_window import DocumentationWindow
 
-from sas.sasgui.perspectives.fitting.report_dialog import ReportDialog
+from .report_dialog import ReportDialog
+from .utils import get_weight
 
 logger = logging.getLogger(__name__)
@@ -1214,5 +1218,4 @@
         self.categorybox.Select(category_pos)
         self._show_combox(None)
-        from models import PLUGIN_NAME_BASE
         if self.categorybox.GetValue() == CUSTOM_MODEL \
                 and PLUGIN_NAME_BASE not in state.formfactorcombobox:
@@ -1752,5 +1755,4 @@
                     temp_smear = self.current_smearer
             # compute weight for the current data
-            from sas.sasgui.perspectives.fitting.utils import get_weight
             flag = self.get_weight_flag()
             weight = get_weight(data=self.data, is2d=self._is_2D(), flag=flag)
@@ -1778,5 +1780,4 @@
 
         from sas.sasgui.plottools import Data1D as pf_data1d
-        # from sas.sasgui.perspectives.theory.profile_dialog import SLDPanel
         from sas.sasgui.guiframe.local_perspectives.plotting.profile_dialog \
             import SLDPanel
@@ -2074,5 +2075,4 @@
 
         if struct_factor is not None:
-            from sasmodels.sasview_model import MultiplicationModel
             self.model = MultiplicationModel(form_factor(self.multi_factor),
                                              struct_factor())
@@ -2396,6 +2396,4 @@
         self.weights = {}
 
-        # from sas.models.dispersion_models import GaussianDispersion
-        from sasmodels.weights import GaussianDispersion
         if not self.disp_cb_dict:
             self.sizer4_4.Clear(True)
Index: src/sas/sasgui/perspectives/fitting/fitpanel.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/fitpanel.py	(revision 67b0a99ce9f69a9dfef035e8e4a06588c9f1602f)
+++ src/sas/sasgui/perspectives/fitting/fitpanel.py	(revision 65f39301a9c81af2f10a086dec2a40fcaf25a0bc)
@@ -9,11 +9,17 @@
 from wx.aui import AuiNotebook as nb
 
+from sas.sascalc.fit.models import ModelManager
+
 from sas.sasgui.guiframe.panel_base import PanelBase
 from sas.sasgui.guiframe.events import PanelOnFocusEvent, StatusEvent
 from sas.sasgui.guiframe.dataFitting import check_data_validity
-from sas.sasgui.perspectives.fitting.simfitpage import SimultaneousFitPage
-
-import basepage
-import models
+
+
+from . import basepage
+from .fitpage import FitPage
+from .simfitpage import SimultaneousFitPage
+from .batchfitpage import BatchFitPage
+from .fitting_widgets import BatchDataDialog
+
 _BOX_WIDTH = 80
 
@@ -46,5 +52,5 @@
         self.event_owner = None
         # dictionary of miodel {model class name, model class}
-        self.menu_mng = models.ModelManager()
+        self.menu_mng = ModelManager()
         self.model_list_box = self.menu_mng.get_model_list()
         # pageClosedEvent = nb.EVT_FLATNOTEBOOK_PAGE_CLOSING
@@ -310,5 +316,4 @@
         Add the simultaneous fit page
         """
-        from simfitpage import SimultaneousFitPage
         page_finder = self._manager.get_page_finder()
         if caption == "Const & Simul Fit":
@@ -338,5 +343,4 @@
         """
         if self.batch_on:
-            from batchfitpage import BatchFitPage
             panel = BatchFitPage(parent=self)
             self.batch_page_index += 1
@@ -345,5 +349,4 @@
         else:
             # Increment index of fit page
-            from fitpage import FitPage
             panel = FitPage(parent=self)
             self.fit_page_index += 1
@@ -443,6 +446,4 @@
         if data_1d_list and data_2d_list:
             # need to warning the user that this batch is a special case
-            from sas.sasgui.perspectives.fitting.fitting_widgets import \
-                BatchDataDialog
             dlg = BatchDataDialog(self)
             if dlg.ShowModal() == wx.ID_OK:
Index: src/sas/sasgui/perspectives/fitting/model_thread.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/model_thread.py	(revision ba8d326f0f4ceb55c77296a9b5af8bd013c7dd92)
+++ src/sas/sasgui/perspectives/fitting/model_thread.py	(revision 65f39301a9c81af2f10a086dec2a40fcaf25a0bc)
@@ -4,6 +4,8 @@
 
 import time
+import math
+
 import numpy as np
-import math
+
 from sas.sascalc.data_util.calcthread import CalcThread
 from sas.sascalc.fit.MultiplicationModel import MultiplicationModel
@@ -240,11 +242,11 @@
     class CalcCommandline:
         def __init__(self, n=20000):
-            #print thread.get_ident()
-            from sas.models.CylinderModel import CylinderModel
-
-            model = CylinderModel()
-
-
-            print model.runXY([0.01, 0.02])
+            #print(thread.get_ident())
+
+            from sasmodels.sasview_model import _make_standard_model
+            cylinder = _make_standard_model('cylinder')
+            model = cylinder()
+
+            print(model.runXY([0.01, 0.02]))
 
             qmax = 0.01
@@ -255,10 +257,9 @@
             y = numpy.arange(-qmax, qmax+qstep*0.01, qstep)
 
-
             calc_thread_2D = Calc2D(x, y, None, model.clone(),None,
                                     -qmax, qmax,qstep,
-                                            completefn=self.complete,
-                                            updatefn=self.update ,
-                                            yieldtime=0.0)
+                                    completefn=self.complete,
+                                    updatefn=self.update ,
+                                    yieldtime=0.0)
 
             calc_thread_2D.queue()
@@ -269,8 +270,8 @@
 
         def update(self,output):
-            print "update"
+            print("update")
 
         def complete(self, image, data, model, elapsed, qmin, qmax,index, qstep ):
-            print "complete"
+            print("complete")
             self.done = True
 
Index: src/sas/sasgui/perspectives/fitting/models.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/models.py	(revision ba8d326f0f4ceb55c77296a9b5af8bd013c7dd92)
+++ 	(revision )
@@ -1,457 +1,0 @@
-"""
-    Utilities to manage models
-"""
-from __future__ import print_function
-
-import traceback
-import os
-import sys
-import os.path
-# Time is needed by the log method
-import time
-import datetime
-import logging
-import py_compile
-import shutil
-# Explicitly import from the pluginmodel module so that py2exe
-# places it in the distribution. The Model1DPlugin class is used
-# as the base class of plug-in models.
-from sas.sascalc.fit.pluginmodel import Model1DPlugin
-from sas.sasgui.guiframe.CategoryInstaller import CategoryInstaller
-from sasmodels.sasview_model import load_custom_model, load_standard_models
-
-logger = logging.getLogger(__name__)
-
-
-PLUGIN_DIR = 'plugin_models'
-PLUGIN_LOG = os.path.join(os.path.expanduser("~"), '.sasview', PLUGIN_DIR,
-                          "plugins.log")
-PLUGIN_NAME_BASE = '[plug-in] '
-
-def get_model_python_path():
-    """
-    Returns the python path for a model
-    """
-    return os.path.dirname(__file__)
-
-
-def plugin_log(message):
-    """
-    Log a message in a file located in the user's home directory
-    """
-    out = open(PLUGIN_LOG, 'a')
-    now = time.time()
-    stamp = datetime.datetime.fromtimestamp(now).strftime('%Y-%m-%d %H:%M:%S')
-    out.write("%s: %s\n" % (stamp, message))
-    out.close()
-
-
-def _check_plugin(model, name):
-    """
-    Do some checking before model adding plugins in the list
-
-    :param model: class model to add into the plugin list
-    :param name:name of the module plugin
-
-    :return model: model if valid model or None if not valid
-
-    """
-    #Check if the plugin is of type Model1DPlugin
-    if not issubclass(model, Model1DPlugin):
-        msg = "Plugin %s must be of type Model1DPlugin \n" % str(name)
-        plugin_log(msg)
-        return None
-    if model.__name__ != "Model":
-        msg = "Plugin %s class name must be Model \n" % str(name)
-        plugin_log(msg)
-        return None
-    try:
-        new_instance = model()
-    except Exception:
-        msg = "Plugin %s error in __init__ \n\t: %s %s\n" % (str(name),
-                                                             str(sys.exc_type),
-                                                             sys.exc_info()[1])
-        plugin_log(msg)
-        return None
-
-    if hasattr(new_instance, "function"):
-        try:
-            value = new_instance.function()
-        except Exception:
-            msg = "Plugin %s: error writing function \n\t :%s %s\n " % \
-                    (str(name), str(sys.exc_type), sys.exc_info()[1])
-            plugin_log(msg)
-            return None
-    else:
-        msg = "Plugin  %s needs a method called function \n" % str(name)
-        plugin_log(msg)
-        return None
-    return model
-
-
-def find_plugins_dir():
-    """
-    Find path of the plugins directory.
-    The plugin directory is located in the user's home directory.
-    """
-    dir = os.path.join(os.path.expanduser("~"), '.sasview', PLUGIN_DIR)
-
-    # If the plugin directory doesn't exist, create it
-    if not os.path.isdir(dir):
-        os.makedirs(dir)
-
-    # Find paths needed
-    # TODO: remove unneeded try/except block
-    try:
-        # For source
-        if os.path.isdir(os.path.dirname(__file__)):
-            p_dir = os.path.join(os.path.dirname(__file__), PLUGIN_DIR)
-        else:
-            raise
-    except Exception:
-        # Check for data path next to exe/zip file.
-        #Look for maximum n_dir up of the current dir to find plugins dir
-        n_dir = 12
-        p_dir = None
-        f_dir = os.path.join(os.path.dirname(__file__))
-        for i in range(n_dir):
-            if i > 1:
-                f_dir, _ = os.path.split(f_dir)
-            plugin_path = os.path.join(f_dir, PLUGIN_DIR)
-            if os.path.isdir(plugin_path):
-                p_dir = plugin_path
-                break
-        if not p_dir:
-            raise
-    # Place example user models as needed
-    if os.path.isdir(p_dir):
-        for file in os.listdir(p_dir):
-            file_path = os.path.join(p_dir, file)
-            if os.path.isfile(file_path):
-                if file.split(".")[-1] == 'py' and\
-                    file.split(".")[0] != '__init__':
-                    if not os.path.isfile(os.path.join(dir, file)):
-                        shutil.copy(file_path, dir)
-
-    return dir
-
-
-class ReportProblem:
-    """
-    Class to check for problems with specific values
-    """
-    def __nonzero__(self):
-        type, value, tb = sys.exc_info()
-        if type is not None and issubclass(type, py_compile.PyCompileError):
-            print("Problem with", repr(value))
-            raise type, value, tb
-        return 1
-
-report_problem = ReportProblem()
-
-
-def compile_file(dir):
-    """
-    Compile a py file
-    """
-    try:
-        import compileall
-        compileall.compile_dir(dir=dir, ddir=dir, force=0,
-                               quiet=report_problem)
-    except Exception:
-        return sys.exc_info()[1]
-    return None
-
-
-def _find_models():
-    """
-    Find custom models
-    """
-    # List of plugin objects
-    directory = find_plugins_dir()
-    # Go through files in plug-in directory
-    if not os.path.isdir(directory):
-        msg = "SasView couldn't locate Model plugin folder %r." % directory
-        logger.warning(msg)
-        return {}
-
-    plugin_log("looking for models in: %s" % str(directory))
-    # compile_file(directory)  #always recompile the folder plugin
-    logger.info("plugin model dir: %s", str(directory))
-
-    plugins = {}
-    for filename in os.listdir(directory):
-        name, ext = os.path.splitext(filename)
-        if ext == '.py' and not name == '__init__':
-            path = os.path.abspath(os.path.join(directory, filename))
-            try:
-                model = load_custom_model(path)
-                model.name = PLUGIN_NAME_BASE + model.name
-                plugins[model.name] = model
-            except Exception:
-                msg = traceback.format_exc()
-                msg += "\nwhile accessing model in %r" % path
-                plugin_log(msg)
-                logger.warning("Failed to load plugin %r. See %s for details",
-                               path, PLUGIN_LOG)
-
-    return plugins
-
-
-class ModelList(object):
-    """
-    Contains dictionary of model and their type
-    """
-    def __init__(self):
-        """
-        """
-        self.mydict = {}
-
-    def set_list(self, name, mylist):
-        """
-        :param name: the type of the list
-        :param mylist: the list to add
-
-        """
-        if name not in self.mydict.keys():
-            self.reset_list(name, mylist)
-
-    def reset_list(self, name, mylist):
-        """
-        :param name: the type of the list
-        :param mylist: the list to add
-        """
-        self.mydict[name] = mylist
-
-    def get_list(self):
-        """
-        return all the list stored in a dictionary object
-        """
-        return self.mydict
-
-
-class ModelManagerBase(object):
-    """
-    Base class for the model manager
-    """
-    ## external dict for models
-    model_combobox = ModelList()
-    ## Dictionary of form factor models
-    form_factor_dict = {}
-    ## dictionary of structure factor models
-    struct_factor_dict = {}
-    ##list of structure factors
-    struct_list = []
-    ##list of model allowing multiplication by a structure factor
-    multiplication_factor = []
-    ##list of multifunctional shapes (i.e. that have user defined number of levels
-    multi_func_list = []
-    ## list of added models -- currently python models found in the plugin dir.
-    plugins = []
-    ## Event owner (guiframe)
-    event_owner = None
-    last_time_dir_modified = 0
-
-    def __init__(self):
-        self.model_dictionary = {}
-        self.stored_plugins = {}
-        self._getModelList()
-
-    def findModels(self):
-        """
-        find  plugin model in directory of plugin .recompile all file
-        in the directory if file were modified
-        """
-        temp = {}
-        if self.is_changed():
-            return  _find_models()
-        logger.info("plugin model : %s", str(temp))
-        return temp
-
-    def _getModelList(self):
-        """
-        List of models we want to make available by default
-        for this application
-
-        :return: the next free event ID following the new menu events
-
-        """
-
-        # regular model names only
-        self.model_name_list = []
-
-        #Build list automagically from sasmodels package
-        for model in load_standard_models():
-            self.model_dictionary[model.name] = model
-            if model.is_structure_factor:
-                self.struct_list.append(model)
-            if model.is_form_factor:
-                self.multiplication_factor.append(model)
-            if model.is_multiplicity_model:
-                self.multi_func_list.append(model)
-            else:
-                self.model_name_list.append(model.name)
-
-        #Looking for plugins
-        self.stored_plugins = self.findModels()
-        self.plugins = self.stored_plugins.values()
-        for name, plug in self.stored_plugins.iteritems():
-            self.model_dictionary[name] = plug
-
-        self._get_multifunc_models()
-
-        return 0
-
-    def is_changed(self):
-        """
-        check the last time the plugin dir has changed and return true
-        is the directory was modified else return false
-        """
-        is_modified = False
-        plugin_dir = find_plugins_dir()
-        if os.path.isdir(plugin_dir):
-            temp = os.path.getmtime(plugin_dir)
-            if  self.last_time_dir_modified != temp:
-                is_modified = True
-                self.last_time_dir_modified = temp
-
-        return is_modified
-
-    def update(self):
-        """
-        return a dictionary of model if
-        new models were added else return empty dictionary
-        """
-        new_plugins = self.findModels()
-        if len(new_plugins) > 0:
-            for name, plug in  new_plugins.iteritems():
-                if name not in self.stored_plugins.keys():
-                    self.stored_plugins[name] = plug
-                    self.plugins.append(plug)
-                    self.model_dictionary[name] = plug
-            self.model_combobox.set_list("Plugin Models", self.plugins)
-            return self.model_combobox.get_list()
-        else:
-            return {}
-
-    def plugins_reset(self):
-        """
-        return a dictionary of model
-        """
-        self.plugins = []
-        new_plugins = _find_models()
-        for name, plug in  new_plugins.iteritems():
-            for stored_name, stored_plug in self.stored_plugins.iteritems():
-                if name == stored_name:
-                    del self.stored_plugins[name]
-                    del self.model_dictionary[name]
-                    break
-            self.stored_plugins[name] = plug
-            self.plugins.append(plug)
-            self.model_dictionary[name] = plug
-
-        self.model_combobox.reset_list("Plugin Models", self.plugins)
-        return self.model_combobox.get_list()
-
-    def _on_model(self, evt):
-        """
-        React to a model menu event
-
-        :param event: wx menu event
-
-        """
-        if int(evt.GetId()) in self.form_factor_dict.keys():
-            from sasmodels.sasview_model import MultiplicationModel
-            self.model_dictionary[MultiplicationModel.__name__] = MultiplicationModel
-            model1, model2 = self.form_factor_dict[int(evt.GetId())]
-            model = MultiplicationModel(model1, model2)
-        else:
-            model = self.struct_factor_dict[str(evt.GetId())]()
-
-
-    def _get_multifunc_models(self):
-        """
-        Get the multifunctional models
-        """
-        items = [item for item in self.plugins if item.is_multiplicity_model]
-        self.multi_func_list = items
-
-    def get_model_list(self):
-        """
-        return dictionary of models for fitpanel use
-
-        """
-        ## Model_list now only contains attribute lists not category list.
-        ## Eventually this should be in one master list -- read in category
-        ## list then pull those models that exist and get attributes then add
-        ## to list ..and if model does not exist remove from list as now
-        ## and update json file.
-        ##
-        ## -PDB   April 26, 2014
-
-#        self.model_combobox.set_list("Shapes", self.shape_list)
-#        self.model_combobox.set_list("Shape-Independent",
-#                                     self.shape_indep_list)
-        self.model_combobox.set_list("Structure Factors", self.struct_list)
-        self.model_combobox.set_list("Plugin Models", self.plugins)
-        self.model_combobox.set_list("P(Q)*S(Q)", self.multiplication_factor)
-        self.model_combobox.set_list("multiplication",
-                                     self.multiplication_factor)
-        self.model_combobox.set_list("Multi-Functions", self.multi_func_list)
-        return self.model_combobox.get_list()
-
-    def get_model_name_list(self):
-        """
-        return regular model name list
-        """
-        return self.model_name_list
-
-    def get_model_dictionary(self):
-        """
-        return dictionary linking model names to objects
-        """
-        return self.model_dictionary
-
-
-class ModelManager(object):
-    """
-    implement model
-    """
-    __modelmanager = ModelManagerBase()
-    cat_model_list = [__modelmanager.model_dictionary[model_name] for model_name \
-                      in __modelmanager.model_dictionary.keys() \
-                      if model_name not in __modelmanager.stored_plugins.keys()]
-
-    CategoryInstaller.check_install(model_list=cat_model_list)
-    def findModels(self):
-        return self.__modelmanager.findModels()
-
-    def _getModelList(self):
-        return self.__modelmanager._getModelList()
-
-    def is_changed(self):
-        return self.__modelmanager.is_changed()
-
-    def update(self):
-        return self.__modelmanager.update()
-
-    def plugins_reset(self):
-        return self.__modelmanager.plugins_reset()
-
-    def populate_menu(self, modelmenu, event_owner):
-        return self.__modelmanager.populate_menu(modelmenu, event_owner)
-
-    def _on_model(self, evt):
-        return self.__modelmanager._on_model(evt)
-
-    def _get_multifunc_models(self):
-        return self.__modelmanager._get_multifunc_models()
-
-    def get_model_list(self):
-        return self.__modelmanager.get_model_list()
-
-    def get_model_name_list(self):
-        return self.__modelmanager.get_model_name_list()
-
-    def get_model_dictionary(self):
-        return self.__modelmanager.get_model_dictionary()
