Index: src/sas/qtgui/MainWindow/GuiManager.py
===================================================================
--- src/sas/qtgui/MainWindow/GuiManager.py	(revision 01ef3f797e8d4032a84fb98c0186de9326036df9)
+++ src/sas/qtgui/MainWindow/GuiManager.py	(revision 3b8cc00520d905f403798a463444af479d8bdd87)
@@ -687,9 +687,7 @@
         """
         """
-        print("Open simple add / multiply editor")
-        # Add Simple Add / Multiple Editor
+        # Add Simple Add/Multiply Editor
         self.add_mult_editor = AddMultEditor(self)
         self.add_mult_editor.show()
-        # pass
 
     #============ ANALYSIS =================
Index: src/sas/qtgui/Utilities/AddMultEditor.py
===================================================================
--- src/sas/qtgui/Utilities/AddMultEditor.py	(revision 01ef3f797e8d4032a84fb98c0186de9326036df9)
+++ src/sas/qtgui/Utilities/AddMultEditor.py	(revision 3b8cc00520d905f403798a463444af479d8bdd87)
@@ -45,9 +45,9 @@
        (add or multiply) the resulting model will add a scale parameter and a
        background parameter.
-       The user also gives a brief help for the model in a description box and
-       must provide a unique name which is verified as unique before the new
+       The user can also give a brief help for the model in the description box and
+       must provide a unique name which is verified before the new model is saved.
     """
     def __init__(self, parent=None):
-        super(AddMultEditor, self).__init__()
+        super(AddMultEditor, self).__init__(parent._parent)
 
         self.parent = parent
@@ -57,4 +57,5 @@
         #  uncheck self.chkOverwrite
         self.chkOverwrite.setChecked(False)
+        self.canOverwriteName = False
 
         # Disabled Apply button until input of valid output plugin name
@@ -117,5 +118,5 @@
         # or when overwriting not allowed
         self.txtName.editingFinished.connect(self.onNameCheck)
-        self.chkOverwrite.stateChanged.connect(self.onNameCheck)
+        self.chkOverwrite.stateChanged.connect(self.onOverwrite)
 
         self.buttonBox.button(QtWidgets.QDialogButtonBox.Apply).clicked.connect(self.onApply)
@@ -126,4 +127,10 @@
         self.cbOperator.currentIndexChanged.connect(self.onOperatorChange)
 
+    def onOverwrite(self):
+        """
+        Modify state on checkbox change
+        """
+        self.canOverwriteName = self.chkOverwrite.isChecked()
+
     def onNameCheck(self):
         """
@@ -138,5 +145,5 @@
         filename = title + '.py'
 
-        if self.chkOverwrite.isChecked():
+        if self.canOverwriteName:
             # allow overwriting -> only valid name needs to be checked
             # (done with validator in __init__ above)
@@ -170,6 +177,4 @@
             QtWidgets.QDialogButtonBox.Apply).setEnabled(self.good_name)
 
-        return self.good_name
-
     def onOperatorChange(self, index):
         """ Respond to operator combo box changes """
@@ -182,7 +187,11 @@
         """ Validity check, save model to file """
 
-        # if name OK write file and test
-        self.buttonBox.button(
-            QtWidgets.QDialogButtonBox.Apply).setEnabled(False)
+        # Set the button enablement, so no double clicks can be made
+        self.buttonBox.button(QtWidgets.QDialogButtonBox.Apply).setEnabled(False)
+
+        # Check the name/overwrite combination again, in case we managed to confuse the UI
+        self.onNameCheck()
+        if not self.good_name:
+            return
 
         self.write_new_model_to_file(self.plugin_filename,
@@ -191,10 +200,21 @@
                                      self.cbOperator.currentText())
 
-        success = self.checkModel(self.plugin_filename)
-
-        if success:
-            # Update list of models in FittingWidget and AddMultEditor
-            self.parent.communicate.customModelDirectoryChanged.emit()
-            self.updateModels()
+        success = GuiUtils.checkModel(self.plugin_filename)
+
+        if not success:
+            return
+
+        # Update list of models in FittingWidget and AddMultEditor
+        self.parent.communicate.customModelDirectoryChanged.emit()
+        # Re-read the model list so the new model is included
+        self.list_models = self.readModels()
+        self.updateModels()
+
+        # Notify the user
+        title = self.txtName.text().lstrip().rstrip()
+        msg = "Custom model "+title + " successfully created."
+        self.parent.communicate.statusBarUpdateSignal.emit(msg)
+        logging.info(msg)
+
 
     def write_new_model_to_file(self, fname, model1_name, model2_name, operator):
@@ -221,26 +241,11 @@
             out_f.write(output)
 
-    # same version as in TabbedModelEditor
-    @classmethod
-    def checkModel(cls, path):
-        """ Check that the model saved in file 'path' can run. """
-
-        # try running the model
-        from sasmodels.sasview_model import load_custom_model
-        Model = load_custom_model(path)
-        model = Model()
-        q = np.array([0.01, 0.1])
-        _ = model.evalDistribution(q)
-        qx, qy = np.array([0.01, 0.01]), np.array([0.1, 0.1])
-        _ = model.evalDistribution([qx, qy])
-        # check the model's unit tests run
-        from sasmodels.model_test import run_one
-        # TODO see comments in TabbedModelEditor
-        # result = run_one(path)
-        result = True  # to be commented out
-        return result
-
     def updateModels(self):
         """ Update contents of comboboxes with new plugin models """
+
+        # Keep pointers to the current indices so we can show the comboboxes with
+        # original selection
+        model_1 = self.cbModel1.currentText()
+        model_2 = self.cbModel2.currentText()
 
         self.cbModel1.blockSignals(True)
@@ -257,4 +262,8 @@
         self.cbModel2.addItems(model_list)
 
+        # Scroll back to the user chosen models
+        self.cbModel1.setCurrentIndex(self.cbModel1.findText(model_1))
+        self.cbModel2.setCurrentIndex(self.cbModel2.findText(model_2))
+
     def onHelp(self):
         """ Display related help section """
Index: src/sas/qtgui/Utilities/GuiUtils.py
===================================================================
--- src/sas/qtgui/Utilities/GuiUtils.py	(revision bb5706840305bc345992475c635799b76405488a)
+++ src/sas/qtgui/Utilities/GuiUtils.py	(revision 3b8cc00520d905f403798a463444af479d8bdd87)
@@ -10,4 +10,6 @@
 import webbrowser
 import urllib.parse
+
+import numpy as np
 
 warnings.simplefilter("ignore")
@@ -926,4 +928,28 @@
         input = input.replace(",", "")
 
+def checkModel(path):
+    """
+    Check that the model save in file 'path' can run.
+    """
+    # try running the model
+    from sasmodels.sasview_model import load_custom_model
+    Model = load_custom_model(path)
+    model = Model()
+    q =  np.array([0.01, 0.1])
+    _ = model.evalDistribution(q)
+    qx, qy =  np.array([0.01, 0.01]), np.array([0.1, 0.1])
+    _ = model.evalDistribution([qx, qy])
+
+    # check the model's unit tests run
+    from sasmodels.model_test import run_one
+    # TestSuite module in Qt5 now deletes tests in the suite after running,
+    # so suite[0] in run_one() in sasmodels/model_test.py will contain [None] and
+    # test.info.tests will raise.
+    # Not sure how to change the behaviour here, most likely sasmodels will have to
+    # be modified
+    result = run_one(path)
+
+    return result
+
 
 def enum(*sequential, **named):
Index: src/sas/qtgui/Utilities/PluginDefinition.py
===================================================================
--- src/sas/qtgui/Utilities/PluginDefinition.py	(revision 8b480d271418f2fa35e0597730c97807da3140d6)
+++ src/sas/qtgui/Utilities/PluginDefinition.py	(revision 3b8cc00520d905f403798a463444af479d8bdd87)
@@ -58,6 +58,4 @@
 
         # Validators
-        #rx = QtCore.QRegExp(r'^[\w,\s-]+$')
-        #rx = QtCore.QRegExp("[a-z-A-Z_]+")
         rx = QtCore.QRegExp("^[A-Za-z0-9_]*$")
 
Index: src/sas/qtgui/Utilities/PluginManager.py
===================================================================
--- src/sas/qtgui/Utilities/PluginManager.py	(revision 8b480d271418f2fa35e0597730c97807da3140d6)
+++ src/sas/qtgui/Utilities/PluginManager.py	(revision 3b8cc00520d905f403798a463444af479d8bdd87)
@@ -19,5 +19,5 @@
     """
     def __init__(self, parent=None):
-        super(PluginManager, self).__init__()
+        super(PluginManager, self).__init__(parent._parent)
         self.setupUi(self)
 
Index: src/sas/qtgui/Utilities/TabbedModelEditor.py
===================================================================
--- src/sas/qtgui/Utilities/TabbedModelEditor.py	(revision 3790f7fca48b8c6a203f8b2edcf944d422d7f003)
+++ src/sas/qtgui/Utilities/TabbedModelEditor.py	(revision 3b8cc00520d905f403798a463444af479d8bdd87)
@@ -11,4 +11,5 @@
 from sas.sascalc.fit import models
 
+import sas.qtgui.Utilities.GuiUtils as GuiUtils
 from sas.qtgui.Utilities.UI.TabbedModelEditor import Ui_TabbedModelEditor
 from sas.qtgui.Utilities.PluginDefinition import PluginDefinition
@@ -23,5 +24,5 @@
     # Signals for intertab communication plugin -> editor
     def __init__(self, parent=None, edit_only=False):
-        super(TabbedModelEditor, self).__init__()
+        super(TabbedModelEditor, self).__init__(parent._parent)
 
         self.parent = parent
@@ -238,5 +239,5 @@
         # Run the model test in sasmodels
         try:
-            _ = self.checkModel(full_path)
+            _ = GuiUtils.checkModel(full_path)
         except Exception as ex:
             msg = "Error building model: "+ str(ex)
@@ -405,29 +406,4 @@
 
     @classmethod
-    def checkModel(cls, path):
-        """
-        Check that the model save in file 'path' can run.
-        """
-        # try running the model
-        from sasmodels.sasview_model import load_custom_model
-        Model = load_custom_model(path)
-        model = Model()
-        q =  np.array([0.01, 0.1])
-        _ = model.evalDistribution(q)
-        qx, qy =  np.array([0.01, 0.01]), np.array([0.1, 0.1])
-        _ = model.evalDistribution([qx, qy])
-
-        # check the model's unit tests run
-        from sasmodels.model_test import run_one
-        # TestSuite module in Qt5 now deletes tests in the suite after running,
-        # so suite[0] in run_one() in sasmodels/model_test.py will contain [None] and
-        # test.info.tests will raise.
-        # Not sure how to change the behaviour here, most likely sasmodels will have to
-        # be modified
-        result = run_one(path)
-
-        return result
-
-    @classmethod
     def getParamHelper(cls, param_str):
         """
