This is an automated email from the ASF dual-hosted git repository.

asf-gitbox-commits pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit b4a0d93cfba5c552ca705193e2b95731981840fe
Author: Andrus Adamchik <[email protected]>
AuthorDate: Tue May 5 18:08:01 2026 -0400

    Modeler cleanup
    
    actions cleanup
---
 .../cayenne/modeler/generic/GenericButtonUI.java   |  8 ++--
 .../modeler/service/action/GlobalActions.java      |  9 ++--
 .../AppAction.java}                                | 13 ++----
 .../org/apache/cayenne/modeler/ui/MainMenuBar.java |  2 +-
 .../cayenne/modeler/ui/action/AboutAction.java     |  5 +-
 .../modeler/ui/action/BaseViewEntityAction.java    | 10 ++--
 ...{ProjectAction.java => CloseProjectAction.java} | 53 +++++++---------------
 .../modeler/ui/action/CollapseTreeAction.java      |  9 ++--
 .../ui/action/ConfigurePreferencesAction.java      | 11 ++---
 .../cayenne/modeler/ui/action/CopyAction.java      | 13 ++----
 .../modeler/ui/action/CopyAttributeAction.java     |  6 +--
 .../ui/action/CopyCallbackMethodAction.java        |  6 +--
 .../ui/action/CopyProcedureParameterAction.java    |  2 +-
 .../modeler/ui/action/CopyRelationshipAction.java  |  2 +-
 .../modeler/ui/action/CreateAttributeAction.java   |  5 +-
 .../ui/action/CreateCallbackMethodAction.java      |  5 +-
 .../modeler/ui/action/CreateDataMapAction.java     |  5 +-
 .../modeler/ui/action/CreateDbEntityAction.java    |  5 +-
 .../modeler/ui/action/CreateEmbeddableAction.java  |  5 +-
 .../modeler/ui/action/CreateNodeAction.java        |  5 +-
 .../modeler/ui/action/CreateObjEntityAction.java   |  5 +-
 .../modeler/ui/action/CreateProcedureAction.java   |  5 +-
 .../ui/action/CreateProcedureParameterAction.java  |  5 +-
 .../modeler/ui/action/CreateQueryAction.java       |  5 +-
 .../ui/action/CreateRelationshipAction.java        |  7 +--
 .../cayenne/modeler/ui/action/CutAction.java       |  9 ++--
 .../modeler/ui/action/CutAttributeAction.java      |  2 +-
 .../modeler/ui/action/CutCallbackMethodAction.java |  2 +-
 .../ui/action/CutProcedureParameterAction.java     |  2 +-
 .../modeler/ui/action/CutRelationshipAction.java   |  2 +-
 .../modeler/ui/action/DBConnectionAwareAction.java |  5 +-
 .../ui/action/DbEntityCounterpartAction.java       |  2 +-
 .../modeler/ui/action/DbEntitySyncAction.java      |  7 +--
 .../modeler/ui/action/DocumentationAction.java     |  5 +-
 .../cayenne/modeler/ui/action/ExitAction.java      | 17 +++----
 .../cayenne/modeler/ui/action/FilterAction.java    |  5 +-
 .../cayenne/modeler/ui/action/FindAction.java      |  5 +-
 .../modeler/ui/action/GenerateDBAction.java        |  5 +-
 .../modeler/ui/action/ImportDataMapAction.java     |  5 +-
 .../modeler/ui/action/ImportEOModelAction.java     |  5 +-
 .../ui/action/InferRelationshipsAction.java        |  5 +-
 .../modeler/ui/action/LinkDataMapAction.java       |  5 +-
 .../modeler/ui/action/LinkDataMapsAction.java      |  5 +-
 .../cayenne/modeler/ui/action/NavigateAction.java  |  7 +--
 .../modeler/ui/action/NavigateBackwardAction.java  |  2 +-
 .../modeler/ui/action/NavigateForwardAction.java   |  2 +-
 .../modeler/ui/action/NewProjectAction.java        |  9 ++--
 .../ui/action/ObjEntityCounterpartAction.java      |  2 +-
 .../modeler/ui/action/ObjEntitySyncAction.java     |  7 +--
 .../ui/action/ObjEntityToSuperEntityAction.java    |  2 +-
 .../modeler/ui/action/OpenProjectAction.java       | 18 ++++----
 .../cayenne/modeler/ui/action/PasteAction.java     | 12 ++---
 .../cayenne/modeler/ui/action/ProjectOpener.java   |  1 -
 .../cayenne/modeler/ui/action/RedoAction.java      |  5 +-
 .../cayenne/modeler/ui/action/RemoveAction.java    |  7 +--
 .../cayenne/modeler/ui/action/RevertAction.java    |  5 +-
 .../cayenne/modeler/ui/action/SaveAsAction.java    |  5 +-
 .../modeler/ui/action/ShowLogConsoleAction.java    |  5 +-
 .../ui/action/ShowValidationConfigAction.java      |  5 +-
 .../cayenne/modeler/ui/action/UndoAction.java      |  5 +-
 .../ui/action/UpdateValidationConfigAction.java    |  7 +--
 .../cayenne/modeler/ui/action/ValidateAction.java  |  5 +-
 .../cayenne/modeler/ui/logconsole/LogConsole.java  |  8 ++--
 .../ui/preferences/more/MorePrefsPanel.java        |  5 +-
 .../graph/action/EntityDisplayAction.java          | 12 ++---
 .../graph/action/RebuildGraphAction.java           |  6 +--
 .../datadomain/graph/action/SaveAsImageAction.java |  6 +--
 .../graph/action/ShowGraphEntityAction.java        |  6 +--
 .../datadomain/graph/action/ZoomInAction.java      |  6 +--
 .../datadomain/graph/action/ZoomOutAction.java     |  6 +--
 .../editor/datamap/dbimport/DbImportView.java      | 10 ++--
 .../editor/datamap/dbimport/SourceTargetPanel.java | 10 ++--
 .../datamap/dbimport/action/AddCatalogAction.java  |  2 +-
 .../dbimport/action/AddIncludeTableAction.java     |  2 +-
 .../dbimport/action/AddPatternParamAction.java     |  2 +-
 .../datamap/dbimport/action/AddSchemaAction.java   |  2 +-
 .../datamap/dbimport/action/DbImportActions.java   |  4 +-
 .../datamap/dbimport/action/DeleteNodeAction.java  |  2 +-
 .../dbimport/action/DragAndDropNodeAction.java     |  2 +-
 .../datamap/dbimport/action/EditNodeAction.java    |  2 +-
 .../dbimport/action/MoveImportNodeAction.java      |  6 +--
 .../datamap/dbimport/action/SortNodesAction.java   |  2 +-
 .../dbimport/action/TreeManipulationAction.java    | 10 ++--
 .../properties/DbEntityPropertiesView.java         |  4 +-
 .../callbacks/ObjEntityCallbacksView.java          |  4 +-
 .../properties/ObjEntityPropertiesView.java        |  4 +-
 .../editor/procedure/ProcedureParameterTab.java    |  6 +--
 .../query/selectquery/SelectQueryOrderingTab.java  |  6 +--
 .../query/selectquery/SelectQueryPrefetchTab.java  |  6 +--
 .../query/sqltemplate/SQLTemplatePrefetchTab.java  |  6 +--
 .../modeler/ui/project/tree/ProjectTree.java       |  4 +-
 91 files changed, 275 insertions(+), 286 deletions(-)

diff --git 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java
 
b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java
index eb441907b..5fb9b5685 100644
--- 
a/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java
+++ 
b/modeler/cayenne-modeler-generic-ext/src/main/java/org/apache/cayenne/modeler/generic/GenericButtonUI.java
@@ -30,7 +30,7 @@ import javax.swing.JComponent;
 import javax.swing.border.Border;
 import javax.swing.plaf.ComponentUI;
 
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 /**
  * @since 4.0
@@ -73,7 +73,7 @@ public class GenericButtonUI extends 
com.jgoodies.looks.plastic.PlasticButtonUI
     public void installDefaults(final AbstractButton b) {
         super.installDefaults(b);
         b.putClientProperty("Plastic.is3D", Boolean.FALSE);
-        if(b instanceof ModelerAbstractAction.CayenneToolbarButton) {
+        if(b instanceof AppAction.CayenneToolbarButton) {
             b.addMouseListener(new MouseAdapter() {
                 @Override
                 public void mouseEntered(MouseEvent e) {
@@ -89,7 +89,7 @@ public class GenericButtonUI extends 
com.jgoodies.looks.plastic.PlasticButtonUI
 
     @Override
     public void update(Graphics g, JComponent c) {
-        if(c instanceof ModelerAbstractAction.CayenneToolbarButton) {
+        if(c instanceof AppAction.CayenneToolbarButton) {
             AbstractButton b = (AbstractButton)c;
             if(!b.isEnabled()) {
                 b.setBorder(DISABLED_BORDER);
@@ -107,7 +107,7 @@ public class GenericButtonUI extends 
com.jgoodies.looks.plastic.PlasticButtonUI
         if ( b.isContentAreaFilled() ) {
             Dimension size = b.getSize();
             g.setColor(getSelectColor());
-            if(b instanceof ModelerAbstractAction.CayenneToolbarButton) {
+            if(b instanceof AppAction.CayenneToolbarButton) {
                 // don't paint outer border area
                 g.fillRect(1, 1, size.width - 2, size.height - 2);
             } else {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/action/GlobalActions.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/action/GlobalActions.java
index 9e6f56a0b..d3e0cb4fb 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/action/GlobalActions.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/service/action/GlobalActions.java
@@ -22,6 +22,7 @@ import 
org.apache.cayenne.configuration.ConfigurationNameMapper;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.action.*;
 import 
org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.ShowGraphEntityAction;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
@@ -71,7 +72,7 @@ public class GlobalActions {
         projectActions = new HashSet<>();
         projectActions.addAll(Arrays.asList(
                 RevertAction.class.getName(),
-                ProjectAction.class.getName(),
+                CloseProjectAction.class.getName(),
                 ValidateAction.class.getName(),
                 SaveAsAction.class.getName(),
                 FindAction.class.getName(),
@@ -149,7 +150,7 @@ public class GlobalActions {
 
         this.actionMap = new HashMap<>(40);
 
-        registerAction(new ProjectAction(application));
+        registerAction(new CloseProjectAction(application));
         registerAction(new NewProjectAction(application)).setAlwaysOn(true);
         registerAction(new OpenProjectAction(application)).setAlwaysOn(true);
         registerAction(new ImportDataMapAction(application, nameMapper));
@@ -233,7 +234,7 @@ public class GlobalActions {
         registerAction(new DisableValidationInspectionAction(application));
     }
 
-    private ModelerAbstractAction registerAction(ModelerAbstractAction action) 
{
+    private AppAction registerAction(AppAction action) {
         actionMap.put(action.getClass().getName(), action);
         return action;
     }
@@ -300,7 +301,7 @@ public class GlobalActions {
 
         updateActions("Selected Objects");
 
-        ModelerAbstractAction cutAction = getAction(CutAction.class);
+        AppAction cutAction = getAction(CutAction.class);
         boolean canCopy = true; // cut/copy can be performed if selected 
objects are on
         // the same level
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ModelerAbstractAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppAction.java
similarity index 94%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ModelerAbstractAction.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppAction.java
index aaa91b57d..06598128f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ModelerAbstractAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppAction.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 
 
-package org.apache.cayenne.modeler.ui.action;
+package org.apache.cayenne.modeler.toolkit;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
@@ -35,16 +35,16 @@ import java.awt.event.ActionEvent;
  * Superclass of CayenneModeler actions that implements support for some 
common functionality, exception handling,
  * etc.
  */
-public abstract class ModelerAbstractAction extends AbstractAction {
+public abstract class AppAction extends AbstractAction {
 
     protected final Application app;
     protected boolean alwaysOn;
 
-    protected ModelerAbstractAction(String name, Application app) {
-        this(name, app, name);
+    protected AppAction(Application app, String name) {
+        this(app, name, name);
     }
 
-    protected ModelerAbstractAction(String name, Application app, String 
shortDescription) {
+    protected AppAction(Application app, String name, String shortDescription) 
{
         super(name);
         super.putValue(Action.DEFAULT, name);
 
@@ -130,9 +130,6 @@ public abstract class ModelerAbstractAction extends 
AbstractAction {
         return false;
     }
 
-    /**
-     * Returns the current {@link ProjectSession}.
-     */
     public ProjectSession getProjectSession() {
         return app.getFrame().getProjectSession();
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
index 4f294c17b..5a66176e2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainMenuBar.java
@@ -62,7 +62,7 @@ class MainMenuBar extends JMenuBar {
 
         fileMenu.add(actions.getAction(NewProjectAction.class).buildMenu());
         fileMenu.add(actions.getAction(OpenProjectAction.class).buildMenu());
-        fileMenu.add(actions.getAction(ProjectAction.class).buildMenu());
+        fileMenu.add(actions.getAction(CloseProjectAction.class).buildMenu());
         fileMenu.add(actions.getAction(ImportDataMapAction.class).buildMenu());
         fileMenu.addSeparator();
         fileMenu.add(actions.getAction(SaveAction.class).buildMenu());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/AboutAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/AboutAction.java
index edf208b96..44cad653f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/AboutAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/AboutAction.java
@@ -20,14 +20,15 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.about.AboutFrame;
 
 import java.awt.event.ActionEvent;
 
-public class AboutAction extends ModelerAbstractAction {
+public class AboutAction extends AppAction {
 
     public AboutAction(Application application) {
-        super("About CayenneModeler", application);
+        super(application, "About CayenneModeler");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/BaseViewEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/BaseViewEntityAction.java
index ea47c20ed..030a2148a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/BaseViewEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/BaseViewEntityAction.java
@@ -26,23 +26,21 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
 import org.apache.cayenne.modeler.ui.project.tree.ProjectTreeModel;
 
 import javax.swing.tree.TreePath;
 import java.awt.event.ActionEvent;
 
-public abstract class BaseViewEntityAction extends ModelerAbstractAction {
+public abstract class BaseViewEntityAction extends AppAction {
 
     abstract protected Entity<?, ?, ?> getEntity();
 
-    public BaseViewEntityAction(String name, Application application) {
-        super(name, application);
+    public BaseViewEntityAction(Application application, String name) {
+        super(application, name);
     }
 
-    /**
-     * @see ModelerAbstractAction#performAction(ActionEvent)
-     */
     @Override
     public void performAction(ActionEvent e) {
         viewEntity();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CloseProjectAction.java
similarity index 68%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectAction.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CloseProjectAction.java
index 87f18f5a3..0889b56b6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CloseProjectAction.java
@@ -21,47 +21,34 @@ package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.unsavedchanges.UnsavedChangesDialog;
 
 import java.awt.event.ActionEvent;
 
 
-public class ProjectAction extends ModelerAbstractAction {
+public class CloseProjectAction extends AppAction {
 
-    public static String getActionName() {
-        return "Close Project";
+    public CloseProjectAction(Application application) {
+        super(application, "Close Project");
     }
 
-    public ProjectAction(Application application) {
-        super(getActionName(), application);
-    }
-
-    /**
-     * Constructor for ProjectAction.
-     *
-     * @param name
-     */
-    public ProjectAction(String name, Application application) {
-        super(name, application);
-    }
-
-    /**
-     * Closes current project.
-     */
+    @Override
     public void performAction(ActionEvent e) {
-        closeProject(true);
+        closeProject(app, true);
     }
 
     /**
      * Returns true if successfully closed project, false otherwise.
      */
-    public boolean closeProject(boolean checkUnsaved) {
+    public static boolean closeProject(Application app, boolean checkUnsaved) {
         // check if there is a project...
-        if (getProjectSession() == null || getProjectSession().project() == 
null) {
+        ProjectSession session = app.getFrame().getProjectSession();
+        if (session == null || session.project() == null) {
             return true;
         }
 
-        if (checkUnsaved && !checkSaveOnClose()) {
+        if (checkUnsaved && !checkSaveOnClose(true, app)) {
             return false;
         }
 
@@ -74,8 +61,8 @@ public class ProjectAction extends ModelerAbstractAction {
     /**
      * Returns false if cancel closing the window, true otherwise.
      */
-    public boolean checkSaveOnClose() {
-        ProjectSession session = getProjectSession();
+    public static boolean checkSaveOnClose(Object source, Application app) {
+        ProjectSession session = app.getFrame().getProjectSession();
         if (session != null && session.isDirty()) {
             UnsavedChangesDialog dialog = new 
UnsavedChangesDialog(app.getFrame());
             dialog.show();
@@ -86,27 +73,19 @@ public class ProjectAction extends ModelerAbstractAction {
             } else if (dialog.shouldSave()) {
                 // save changes and close
                 ActionEvent e = new ActionEvent(
-                        this,
+                        source,
                         ActionEvent.ACTION_PERFORMED,
                         "SaveAll");
                 app
                         .getActionManager()
                         .getAction(SaveAction.class)
                         .actionPerformed(e);
-                if (session.isDirty()) {
-                    // save was canceled... do not close
-                    return false;
-                }
+
+                // save was canceled... do not close
+                return !session.isDirty();
             }
         }
 
         return true;
     }
-
-    /**
-     * Always returns true.
-     */
-    public boolean enableForPath(Object object) {
-        return true;
-    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CollapseTreeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CollapseTreeAction.java
index 79440e601..9359c0429 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CollapseTreeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CollapseTreeAction.java
@@ -19,23 +19,20 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import java.awt.event.ActionEvent;
 
-public class CollapseTreeAction extends ModelerAbstractAction {
+public class CollapseTreeAction extends AppAction {
     private final static String COLLAPSE = "collapse";
 
-    public static String getActionName() {
-        return "Collapse tree";
-    }
-
     @Override
     public String getIconName() {
         return "icon-tree-collapse.png";
     }
 
     public CollapseTreeAction(Application application) {
-        super(getActionName(), application);
+        super(application, "Collapse tree");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ConfigurePreferencesAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ConfigurePreferencesAction.java
index cf0341ba0..ec68c22b5 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ConfigurePreferencesAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ConfigurePreferencesAction.java
@@ -20,19 +20,16 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.preferences.PreferenceDialog;
 
 import java.awt.event.ActionEvent;
 
 
-public class ConfigurePreferencesAction extends ModelerAbstractAction {
+public class ConfigurePreferencesAction extends AppAction {
 
-    public static String getActionName() {
-        return "Preferences";
-    }
-
-    public ConfigurePreferencesAction(Application application) {
-        super(getActionName(), application);
+    public ConfigurePreferencesAction(Application app) {
+        super(app, "Preferences");
     }
 
     public void performAction(ActionEvent e) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAction.java
index f7a5c5e59..ab731a730 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAction.java
@@ -33,6 +33,7 @@ import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 import org.apache.cayenne.modeler.toolkit.copypaste.CMTransferable;
 
@@ -45,24 +46,20 @@ import java.awt.event.KeyEvent;
 /**
  * Action for copying entities, queries etc. into system buffer
  */
-public class CopyAction extends ModelerAbstractAction {
-
-    public static String getActionName() {
-        return "Copy";
-    }
+public class CopyAction extends AppAction {
 
     /**
      * Constructor for CopyAction
      */
     public CopyAction(Application application) {
-        this(getActionName(), application);
+        this(application, "Copy");
     }
 
     /**
      * Constructor for descendants
      */
-    protected CopyAction(String name, Application application) {
-        super(name, application);
+    protected CopyAction(Application application, String name) {
+        super(application, name);
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeAction.java
index 77fbc0f5b..8f0a1923a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyAttributeAction.java
@@ -18,14 +18,14 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.action;
 
-import java.util.Arrays;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
 
+import java.util.Arrays;
+
 /**
  * Action for copying attribute(s)
  */
@@ -47,7 +47,7 @@ public class CopyAttributeAction extends CopyAction 
implements MultipleObjectsAc
     }
 
     public CopyAttributeAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyCallbackMethodAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyCallbackMethodAction.java
index 109b5e46b..14d62154b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyCallbackMethodAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyCallbackMethodAction.java
@@ -18,13 +18,13 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.action;
 
-import java.util.Arrays;
-
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
 
+import java.util.Arrays;
+
 public class CopyCallbackMethodAction extends CopyAction implements 
MultipleObjectsAction {
 
     private final static String ACTION_NAME = "Copy Callback Method";
@@ -43,7 +43,7 @@ public class CopyCallbackMethodAction extends CopyAction 
implements MultipleObje
     }
 
     public CopyCallbackMethodAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyProcedureParameterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyProcedureParameterAction.java
index 83dbe3049..a463d2ef5 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyProcedureParameterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyProcedureParameterAction.java
@@ -45,7 +45,7 @@ public class CopyProcedureParameterAction extends CopyAction 
implements Multiple
     }
 
     public CopyProcedureParameterAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyRelationshipAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyRelationshipAction.java
index ffdd79ef6..526d1e98f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyRelationshipAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CopyRelationshipAction.java
@@ -46,7 +46,7 @@ public class CopyRelationshipAction extends CopyAction 
implements MultipleObject
     }
 
     public CopyRelationshipAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
index 1756d826a..99ad1a671 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateAttributeAction.java
@@ -40,13 +40,14 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.event.display.DbAttributeDisplayEvent;
 import 
org.apache.cayenne.modeler.event.display.EmbeddableAttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjAttributeDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateAttributeUndoableEdit;
 import org.apache.cayenne.modeler.undo.CreateEmbAttributeUndoableEdit;
 
 import java.awt.event.ActionEvent;
 
 
-public class CreateAttributeAction extends ModelerAbstractAction {
+public class CreateAttributeAction extends AppAction {
 
     static void fireEmbeddableAttributeEvent(Object src, ProjectSession 
session, Embeddable embeddable, EmbeddableAttribute attr) {
 
@@ -88,7 +89,7 @@ public class CreateAttributeAction extends 
ModelerAbstractAction {
     }
 
     public CreateAttributeAction(Application application) {
-        super("Create Attribute", application);
+        super(application, "Create Attribute");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
index 1e0d2d0dc..13e670fd0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateCallbackMethodAction.java
@@ -22,6 +22,7 @@ import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.CallbackMap;
 import org.apache.cayenne.map.LifecycleEvent;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 import org.apache.cayenne.modeler.event.model.CallbackMethodEvent;
 import org.apache.cayenne.modeler.undo.CreateCallbackMethodUndoableEdit;
@@ -32,10 +33,10 @@ import java.awt.event.ActionEvent;
 /**
  * Action class for creating callback methods on ObjEntity
  */
-public class CreateCallbackMethodAction extends ModelerAbstractAction {
+public class CreateCallbackMethodAction extends AppAction {
 
     public CreateCallbackMethodAction(Application application) {
-        super("Create callback method", application);
+        super(application, "Create callback method");
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
index b981c3f98..5b90a21f0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDataMapAction.java
@@ -29,6 +29,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
 import org.apache.cayenne.modeler.event.model.DataMapEvent;
 import org.apache.cayenne.modeler.event.model.DataNodeEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateDataMapUndoableEdit;
 
 import java.awt.event.ActionEvent;
@@ -36,7 +37,7 @@ import java.awt.event.ActionEvent;
 /**
  * Action that creates new DataMap in the project.
  */
-public class CreateDataMapAction extends ModelerAbstractAction {
+public class CreateDataMapAction extends AppAction {
     
     public static void onMapCreated(Object src, ProjectSession session, 
DataMap map) {
 
@@ -57,7 +58,7 @@ public class CreateDataMapAction extends 
ModelerAbstractAction {
     }
 
     public CreateDataMapAction(Application application) {
-        super("Create DataMap", application);
+        super(application, "Create DataMap");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
index 66e3122d1..52737f2f4 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateDbEntityAction.java
@@ -29,11 +29,12 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayEvent;
 import org.apache.cayenne.modeler.event.model.DbEntityEvent;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateDbEntityUndoableEdit;
 
 import java.awt.event.ActionEvent;
 
-public class CreateDbEntityAction extends ModelerAbstractAction {
+public class CreateDbEntityAction extends AppAction {
 
     static void onDbEntityCreated(Object src, ProjectSession session, DbEntity 
entity) {
         session.fireDbEntityEvent(DbEntityEvent.ofAdd(src, entity));
@@ -48,7 +49,7 @@ public class CreateDbEntityAction extends 
ModelerAbstractAction {
     }
 
     public CreateDbEntityAction(Application application) {
-        super("Create DbEntity", application);
+        super(application, "Create DbEntity");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
index 3cd7f15bf..3761c7603 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateEmbeddableAction.java
@@ -28,11 +28,12 @@ import 
org.apache.cayenne.modeler.event.model.EmbeddableEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateEmbeddableUndoableEdit;
 
 import java.awt.event.ActionEvent;
 
-public class CreateEmbeddableAction extends ModelerAbstractAction {
+public class CreateEmbeddableAction extends AppAction {
 
     static void fireEmbeddableEvent(
             Object src,
@@ -54,7 +55,7 @@ public class CreateEmbeddableAction extends 
ModelerAbstractAction {
     }
 
     public CreateEmbeddableAction(Application application) {
-        super("Create Embeddable", application);
+        super(application, "Create Embeddable");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
index 8b3dc710a..f7fb5127b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateNodeAction.java
@@ -30,11 +30,12 @@ import 
org.apache.cayenne.configuration.runtime.XMLPoolingDataSourceFactory;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.display.DataNodeDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateNodeUndoableEdit;
 
 import java.awt.event.ActionEvent;
 
-public class CreateNodeAction extends ModelerAbstractAction {
+public class CreateNodeAction extends AppAction {
 
     public static void createDataNode(Object src, ProjectSession session, 
DataNodeDescriptor node) {
         DataChannelDescriptor domain = (DataChannelDescriptor) 
session.project().getRootNode();
@@ -44,7 +45,7 @@ public class CreateNodeAction extends ModelerAbstractAction {
     }
 
     public CreateNodeAction(Application application) {
-        super("Create DataNode", application);
+        super(application, "Create DataNode");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
index ad8d25b41..a42765085 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateObjEntityAction.java
@@ -32,12 +32,13 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
 import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateObjEntityUndoableEdit;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 
 import java.awt.event.ActionEvent;
 
-public class CreateObjEntityAction extends ModelerAbstractAction {
+public class CreateObjEntityAction extends AppAction {
 
     static void onObjEntityCreated(
             Object src,
@@ -56,7 +57,7 @@ public class CreateObjEntityAction extends 
ModelerAbstractAction {
     }
 
     public CreateObjEntityAction(Application application) {
-        super("Create ObjEntity", application);
+        super(application, "Create ObjEntity");
     }
 
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
index 37606498c..96e3e1a45 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureAction.java
@@ -28,6 +28,7 @@ import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateProcedureUndoableEdit;
 
 import java.awt.event.ActionEvent;
@@ -35,7 +36,7 @@ import java.awt.event.ActionEvent;
 /**
  * Action class to create a new stored procedure mapping.
  */
-public class CreateProcedureAction extends ModelerAbstractAction {
+public class CreateProcedureAction extends AppAction {
 
     /**
      * Fires events when a procedure was added
@@ -52,7 +53,7 @@ public class CreateProcedureAction extends 
ModelerAbstractAction {
     }
 
     public CreateProcedureAction(Application application) {
-        super("Create Stored Procedure", application);
+        super(application, "Create Stored Procedure");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
index accab1938..d6519ff0a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateProcedureParameterAction.java
@@ -28,14 +28,15 @@ import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CreateProcedureParameterUndoableEdit;
 
 import java.awt.event.ActionEvent;
 
-public class CreateProcedureParameterAction extends ModelerAbstractAction {
+public class CreateProcedureParameterAction extends AppAction {
 
     public CreateProcedureParameterAction(Application application) {
-        super("Create Parameter", application);
+        super(application, "Create Parameter");
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateQueryAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateQueryAction.java
index c092b7592..999b39760 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateQueryAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateQueryAction.java
@@ -25,15 +25,16 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.project.querytype.QueryTypeDialog;
 import org.apache.cayenne.modeler.event.display.QueryDisplayEvent;
 
 import java.awt.event.ActionEvent;
 
-public class CreateQueryAction extends ModelerAbstractAction {
+public class CreateQueryAction extends AppAction {
 
     public CreateQueryAction(Application application) {
-        super("Create Query", application);
+        super(application, "Create Query");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
index 7fb3c57b3..972a8f2eb 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CreateRelationshipAction.java
@@ -31,6 +31,7 @@ import 
org.apache.cayenne.modeler.event.model.ObjRelationshipEvent;
 import org.apache.cayenne.modeler.event.model.DbRelationshipEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.dbrelationship.DbRelationshipDialog;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.relinfo.ObjRelationshipInfoDialog;
 import org.apache.cayenne.modeler.event.display.DbRelationshipDisplayEvent;
@@ -39,7 +40,7 @@ import org.apache.cayenne.util.DeleteRuleUpdater;
 
 import java.awt.event.ActionEvent;
 
-public class CreateRelationshipAction extends ModelerAbstractAction {
+public class CreateRelationshipAction extends AppAction {
 
     /**
      * Fires events when a obj rel was added
@@ -69,7 +70,7 @@ public class CreateRelationshipAction extends 
ModelerAbstractAction {
     }
 
     public CreateRelationshipAction(Application application) {
-        super("Create Relationship", application);
+        super(application, "Create Relationship");
     }
 
     @Override
@@ -78,7 +79,7 @@ public class CreateRelationshipAction extends 
ModelerAbstractAction {
     }
 
     /**
-     * @see ModelerAbstractAction#performAction(ActionEvent)
+     * @see AppAction#performAction(ActionEvent)
      */
     @Override
     public void performAction(ActionEvent e) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAction.java
index 68e16189d..16c8b92e0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAction.java
@@ -20,6 +20,7 @@ package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import javax.swing.*;
 import java.awt.*;
@@ -29,14 +30,14 @@ import java.awt.event.KeyEvent;
 /**
  * Action for cutting entities, queries etc.
  */
-public class CutAction extends ModelerAbstractAction {
+public class CutAction extends AppAction {
 
     public CutAction(Application application) {
-        this("Cut", application);
+        this(application, "Cut");
     }
 
-    protected CutAction(String name, Application application) {
-        super(name, application);
+    protected CutAction(Application application, String name) {
+        super(application, name);
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeAction.java
index 826ae47a7..f49123f5b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutAttributeAction.java
@@ -46,7 +46,7 @@ public class CutAttributeAction extends CutAction implements 
MultipleObjectsActi
     }
 
     public CutAttributeAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutCallbackMethodAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutCallbackMethodAction.java
index 68a56d7fb..6e8dc2e21 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutCallbackMethodAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutCallbackMethodAction.java
@@ -41,7 +41,7 @@ public class CutCallbackMethodAction extends CutAction 
implements MultipleObject
     }
 
     public CutCallbackMethodAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutProcedureParameterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutProcedureParameterAction.java
index 5515fefdc..d7c8ec835 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutProcedureParameterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutProcedureParameterAction.java
@@ -41,7 +41,7 @@ public class CutProcedureParameterAction extends CutAction 
implements MultipleOb
     }
 
     public CutProcedureParameterAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutRelationshipAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutRelationshipAction.java
index c5d31e7e0..2df93daad 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutRelationshipAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/CutRelationshipAction.java
@@ -41,7 +41,7 @@ public class CutRelationshipAction extends CutAction 
implements MultipleObjectsA
     }
 
     public CutRelationshipAction(Application application) {
-        super(ACTION_NAME, application);
+        super(application, ACTION_NAME);
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
index c86f64bc6..6d016f474 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DBConnectionAwareAction.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.datasource.DataSourceDialog;
 import org.apache.cayenne.modeler.dbconnector.DBConnector;
 import org.apache.cayenne.modeler.pref.DataMapPrefs;
@@ -29,10 +30,10 @@ import org.apache.cayenne.modeler.pref.DataMapPrefs;
  * Base action that provides DBConnectionInfo for the current DataMap or calls 
{@link DataSourceDialog} dialog to
  * create one.
  */
-public abstract class DBConnectionAwareAction extends ModelerAbstractAction {
+public abstract class DBConnectionAwareAction extends AppAction {
 
     public DBConnectionAwareAction(String name, Application application) {
-        super(name, application);
+        super(application, name);
     }
 
     protected DBConnector getConnector(String title, DataMap dataMap) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntityCounterpartAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntityCounterpartAction.java
index 698630865..8699f536a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntityCounterpartAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntityCounterpartAction.java
@@ -28,7 +28,7 @@ import java.util.Iterator;
 public class DbEntityCounterpartAction extends BaseViewEntityAction {
 
     public DbEntityCounterpartAction(Application application) {
-        super("View related ObjEntity", application);
+        super(application, "View related ObjEntity");
     }
 
     public String getIconName() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
index 8d49cfcd8..929b1e5ce 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DbEntitySyncAction.java
@@ -29,6 +29,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.entitysync.EntitySyncDialog;
 import org.apache.cayenne.modeler.undo.DbEntitySyncUndoableEdit;
 
@@ -42,10 +43,10 @@ import java.util.Collection;
  * Action that synchronizes all ObjEntities with the current state of the
  * selected DbEntity.
  */
-public class DbEntitySyncAction extends ModelerAbstractAction {
+public class DbEntitySyncAction extends AppAction {
 
     public DbEntitySyncAction(Application application) {
-        super("Sync Dependent ObjEntities with DbEntity", application);
+        super(application, "Sync Dependent ObjEntities with DbEntity");
     }
 
     @Override
@@ -58,7 +59,7 @@ public class DbEntitySyncAction extends ModelerAbstractAction 
{
     }
 
     /**
-     * @see ModelerAbstractAction#performAction(ActionEvent)
+     * @see AppAction#performAction(ActionEvent)
      */
     public void performAction(ActionEvent e) {
         syncDbEntity();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DocumentationAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DocumentationAction.java
index ef757d37d..79da844cc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DocumentationAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/DocumentationAction.java
@@ -22,17 +22,18 @@ package org.apache.cayenne.modeler.ui.action;
 import java.awt.event.ActionEvent;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.toolkit.UrlOpener;
 import org.apache.cayenne.util.LocalizedStringsHandler;
 
-public class DocumentationAction extends ModelerAbstractAction {
+public class DocumentationAction extends AppAction {
 
     public static String getActionName() {
         return "Documentation";
     }
 
     public DocumentationAction(Application application) {
-        super(getActionName(), application);
+        super(application, getActionName());
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ExitAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ExitAction.java
index 7be563c8b..8fc713f73 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ExitAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ExitAction.java
@@ -22,28 +22,23 @@ package org.apache.cayenne.modeler.ui.action;
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.log.ModelerLogFactory;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import java.awt.event.ActionEvent;
 
-public class ExitAction extends ProjectAction {
+public class ExitAction extends AppAction {
 
-    public static String getActionName() {
-        return "Exit";
-    }
-
-    /**
-     * Constructor for ExitAction.
-     */
     public ExitAction(Application application) {
-        super(getActionName(), application);
+        super(application, "Exit");
     }
 
+    @Override
     public void performAction(ActionEvent e) {
         exit();
     }
 
     public boolean exit() {
-        if (!checkSaveOnClose()) {
+        if (!CloseProjectAction.checkSaveOnClose(this, app)) {
             return false;
         }
 
@@ -51,7 +46,6 @@ public class ExitAction extends ProjectAction {
         // fall back to System.out instead of pushing into a torn-down Swing 
console
         ModelerLogFactory.setAppender(null);
 
-        // goodbye
         System.exit(0);
         return true;
     }
@@ -59,6 +53,7 @@ public class ExitAction extends ProjectAction {
     /**
      * Always returns true.
      */
+    @Override
     public boolean enableForPath(ConfigurationNode object) {
         return true;
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FilterAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FilterAction.java
index 4a1f0a6d7..4dc1a9c9e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FilterAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FilterAction.java
@@ -19,19 +19,20 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.project.tree.treefilter.TreeFilterPopup;
 
 import javax.swing.*;
 import java.awt.event.ActionEvent;
 
-public class FilterAction extends ModelerAbstractAction {
+public class FilterAction extends AppAction {
 
     public static String getActionName() {
         return "Filter tree";
     }
 
     public FilterAction(Application application) {
-        super(getActionName(), application);
+        super(application, getActionName());
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FindAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FindAction.java
index 9b1cf2bbd..e420d0061 100755
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FindAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/FindAction.java
@@ -52,6 +52,7 @@ import 
org.apache.cayenne.modeler.event.display.ObjRelationshipDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ProcedureDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ProcedureParameterDisplayEvent;
 import org.apache.cayenne.modeler.event.display.QueryDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.find.FindDialog;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
@@ -71,7 +72,7 @@ import java.util.Map;
 import java.util.Objects;
 import java.util.regex.Pattern;
 
-public class FindAction extends ModelerAbstractAction {
+public class FindAction extends AppAction {
 
     /**
      * Result sort priority based on result type
@@ -99,7 +100,7 @@ public class FindAction extends ModelerAbstractAction {
     }
 
     public FindAction(Application application) {
-        super("Find", application);
+        super(application, "Find");
     }
 
     /**
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateDBAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateDBAction.java
index abf42df34..907844c81 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateDBAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/GenerateDBAction.java
@@ -22,6 +22,7 @@ package org.apache.cayenne.modeler.ui.action;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.dbgen.DBGeneratorOptionsDialog;
 import org.apache.cayenne.project.Project;
 
@@ -32,14 +33,14 @@ import java.util.Collection;
 /**
  * Action that generates database tables from a DataMap.
  */
-public class GenerateDBAction extends ModelerAbstractAction {
+public class GenerateDBAction extends AppAction {
 
     public static String getActionName() {
         return "Generate Database Schema";
     }
 
     public GenerateDBAction(Application application) {
-        super(getActionName(), application);
+        super(application, getActionName());
     }
 
     public void performAction(ActionEvent e) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
index ccce1025f..17eaa814b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportDataMapAction.java
@@ -26,6 +26,7 @@ import org.apache.cayenne.configuration.DataMapLoader;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.toolkit.filechooser.CMFileChooserPrefs;
 import org.apache.cayenne.modeler.util.FileFilters;
 import org.apache.cayenne.resource.Resource;
@@ -43,14 +44,14 @@ import java.net.URL;
  * Modeler action that imports a DataMap into a project from an arbitrary
  * location.
  */
-public class ImportDataMapAction extends ModelerAbstractAction {
+public class ImportDataMapAction extends AppAction {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ImportDataMapAction.class);
 
     private final ConfigurationNameMapper nameMapper;
 
     public ImportDataMapAction(Application application, 
ConfigurationNameMapper nameMapper) {
-        super(getActionName(), application);
+        super(application, getActionName());
         this.nameMapper = nameMapper;
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
index c96cd56e0..acf091316 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ImportEOModelAction.java
@@ -51,6 +51,7 @@ import 
org.apache.cayenne.modeler.event.display.DataMapDisplayEvent;
 import org.apache.cayenne.modeler.event.display.DataNodeDisplayEvent;
 import org.apache.cayenne.modeler.event.model.DataNodeEvent;
 import org.apache.cayenne.modeler.event.model.QueryEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.toolkit.filechooser.CMFileChooserPrefs;
 import org.apache.cayenne.modeler.ui.errors.ErrorsController;
 import org.apache.cayenne.modeler.project.ProjectSession;
@@ -74,7 +75,7 @@ import java.util.Map;
  * Action handler for WebObjects EOModel import function.
  *
  */
-public class ImportEOModelAction extends ModelerAbstractAction {
+public class ImportEOModelAction extends AppAction {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(ImportEOModelAction.class);
 
@@ -84,7 +85,7 @@ public class ImportEOModelAction extends 
ModelerAbstractAction {
     private JFileChooser eoModelChooser;
 
     public ImportEOModelAction(Application application) {
-        super("Import EOModel", application);
+        super(application, "Import EOModel");
 
         this.adaptersByEofPlugin = new HashMap<>();
         adaptersByEofPlugin.put("com.webobjects.jdbcadaptor.SybasePlugIn", 
SybaseAdapter.class.getName());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/InferRelationshipsAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/InferRelationshipsAction.java
index 6fc0b8d4e..377855a67 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/InferRelationshipsAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/InferRelationshipsAction.java
@@ -20,14 +20,15 @@ package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.autorelationship.InferRelationshipsDialog;
 
 import java.awt.event.ActionEvent;
 
-public class InferRelationshipsAction extends ModelerAbstractAction {
+public class InferRelationshipsAction extends AppAction {
 
     public InferRelationshipsAction(Application application) {
-        super("Infer Relationships", application);
+        super(application, "Infer Relationships");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapAction.java
index 0ff53ff47..7c138e93d 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapAction.java
@@ -24,16 +24,17 @@ import org.apache.cayenne.modeler.event.model.DataNodeEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.LinkDataMapUndoableEdit;
 
 import java.awt.event.ActionEvent;
 import java.util.ArrayList;
 import java.util.Collection;
 
-public class LinkDataMapAction extends ModelerAbstractAction {
+public class LinkDataMapAction extends AppAction {
 
     public LinkDataMapAction(Application application) {
-        super("Link DataMap", application);
+        super(application, "Link DataMap");
     }
 
     public void linkDataMap(DataMap map, DataNodeDescriptor node) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapsAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapsAction.java
index a9624ff53..fbc6dbea5 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapsAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/LinkDataMapsAction.java
@@ -24,16 +24,17 @@ import org.apache.cayenne.modeler.event.model.DataNodeEvent;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.LinkDataMapsUndoableEdit;
 
 import java.awt.event.ActionEvent;
 import java.util.ArrayList;
 import java.util.Collection;
 
-public class LinkDataMapsAction extends ModelerAbstractAction {
+public class LinkDataMapsAction extends AppAction {
     
     public LinkDataMapsAction(Application application) {
-        super("Link unlinked DataMaps", application);
+        super(application, "Link unlinked DataMaps");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateAction.java
index 808fcf9f5..b30c17209 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateAction.java
@@ -21,13 +21,14 @@ package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import java.awt.event.ActionEvent;
 
-public abstract class NavigateAction extends ModelerAbstractAction {
+public abstract class NavigateAction extends AppAction {
 
-    protected NavigateAction(String name, Application application) {
-        super(name, application);
+    protected NavigateAction(Application application, String name) {
+        super(application, name);
     }
 
     protected abstract void navigate(ProjectSession session);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateBackwardAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateBackwardAction.java
index c74ad964c..e739d1f73 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateBackwardAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateBackwardAction.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 public class NavigateBackwardAction extends NavigateAction {
 
     public NavigateBackwardAction(Application application) {
-        super("Move Backward", application);
+        super(application, "Move Backward");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateForwardAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateForwardAction.java
index 72e386f2b..076117ec7 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateForwardAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NavigateForwardAction.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 public class NavigateForwardAction extends NavigateAction {
 
     public NavigateForwardAction(Application application) {
-        super("Move Forward", application);
+        super(application, "Move Forward");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
index ad955ad55..68d63d0c2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/NewProjectAction.java
@@ -23,8 +23,9 @@ import org.apache.cayenne.configuration.ConfigurationTree;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.dbsync.naming.NameBuilder;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.MainFrame;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
+import org.apache.cayenne.modeler.ui.MainFrame;
 import org.apache.cayenne.project.Project;
 
 import javax.swing.*;
@@ -32,10 +33,10 @@ import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
-public class NewProjectAction extends ProjectAction {
+public class NewProjectAction extends AppAction {
 
     public NewProjectAction(Application application) {
-        super("New Project", application);
+        super(application, "New Project");
     }
 
     @Override
@@ -53,7 +54,7 @@ public class NewProjectAction extends ProjectAction {
 
         MainFrame controller = app.getFrame();
         // Save and close (if needed) currently open project.
-        if (getCurrentProject() != null && !closeProject(true)) {
+        if (getCurrentProject() != null && 
!CloseProjectAction.closeProject(app, true)) {
             return;
         }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityCounterpartAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityCounterpartAction.java
index 726bb9c09..26758b965 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityCounterpartAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityCounterpartAction.java
@@ -30,7 +30,7 @@ public class ObjEntityCounterpartAction extends 
BaseViewEntityAction {
     }
 
     public ObjEntityCounterpartAction(Application application) {
-        super(getActionName(), application);
+        super(application, getActionName());
     }
 
     public String getIconName() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
index 9e453a2b4..626f777fe 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntitySyncAction.java
@@ -25,6 +25,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.entitysync.EntitySyncDialog;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
 
@@ -38,14 +39,14 @@ import java.awt.event.KeyEvent;
  * DbEntity.
  *
  */
-public class ObjEntitySyncAction extends ModelerAbstractAction {
+public class ObjEntitySyncAction extends AppAction {
 
     public static String getActionName() {
         return "Sync ObjEntity with DbEntity";
     }
 
     public ObjEntitySyncAction(Application application) {
-        super(getActionName(), application);
+        super(application, getActionName());
     }
 
     public String getIconName() {
@@ -57,7 +58,7 @@ public class ObjEntitySyncAction extends 
ModelerAbstractAction {
     }
 
     /**
-     * @see ModelerAbstractAction#performAction(ActionEvent)
+     * @see AppAction#performAction(ActionEvent)
      */
     public void performAction(ActionEvent e) {
         syncObjEntity();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityToSuperEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityToSuperEntityAction.java
index d61ed381e..bab355163 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityToSuperEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ObjEntityToSuperEntityAction.java
@@ -29,7 +29,7 @@ public class ObjEntityToSuperEntityAction extends 
BaseViewEntityAction {
     }
 
     public ObjEntityToSuperEntityAction(Application application) {
-        super(getActionName(), application);
+        super(application, getActionName());
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
index 8d9228aec..5cae3f7a9 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/OpenProjectAction.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.MainFrame;
 import org.apache.cayenne.modeler.ui.errors.ErrorsController;
 import org.apache.cayenne.project.Project;
@@ -43,7 +44,7 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-public class OpenProjectAction extends ProjectAction {
+public class OpenProjectAction extends AppAction {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(OpenProjectAction.class);
 
@@ -63,12 +64,9 @@ public class OpenProjectAction extends ProjectAction {
 
     private final ProjectOpener fileChooser;
 
-    public static String getActionName() {
-        return "Open Project";
-    }
 
     public OpenProjectAction(Application application) {
-        super(getActionName(), application);
+        super(application, "Open Project");
         this.fileChooser = new ProjectOpener();
         resetClipboard();
     }
@@ -87,7 +85,7 @@ public class OpenProjectAction extends ProjectAction {
     public void performAction(ActionEvent e) {
 
         // Save and close (if needed) currently open project.
-        if (getProjectSession() != null && !checkSaveOnClose()) {
+        if (getProjectSession() != null && 
!CloseProjectAction.checkSaveOnClose(this, app)) {
             return;
         }
 
@@ -118,7 +116,7 @@ public class OpenProjectAction extends ProjectAction {
 
         if (f != null) {
             // by now if the project is unsaved, this has been a user choice...
-            if (getProjectSession() != null && !closeProject(false)) {
+            if (getProjectSession() != null && 
!CloseProjectAction.closeProject(app, false)) {
                 return;
             }
 
@@ -160,21 +158,21 @@ public class OpenProjectAction extends ProjectAction {
                             "Open the project in the older Modeler " + 
modelerVersion
                                     + " to do an intermediate upgrade\nbefore 
you can upgrade to latest version.",
                             "Can't Upgrade Project", 
JOptionPane.ERROR_MESSAGE);
-                    closeProject(false);
+                    CloseProjectAction.closeProject(app, false);
                     return;
 
                 case DOWNGRADE_NEEDED:
                     JOptionPane.showMessageDialog(app.getFrame(),
                             "Can't open project - it was created using a newer 
version of the Modeler",
                             "Can't Open Project", JOptionPane.ERROR_MESSAGE);
-                    closeProject(false);
+                    CloseProjectAction.closeProject(app, false);
                     return;
 
                 case UPGRADE_NEEDED:
                     if (processUpgrades()) {
                         rootSource = upgradeService.upgradeProject(rootSource);
                     } else {
-                        closeProject(false);
+                        CloseProjectAction.closeProject(app, false);
                         return;
                     }
                     break;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
index 5533fe20b..6bee4c6cd 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/PasteAction.java
@@ -37,6 +37,7 @@ import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.errors.ErrorsController;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.project.querytype.QueryTypeDialog;
@@ -62,7 +63,7 @@ import java.util.Map;
 /**
  * Action for pasting entities, queries etc. from the system buffer
  */
-public class PasteAction extends ModelerAbstractAction implements 
FlavorListener {
+public class PasteAction extends AppAction implements FlavorListener {
 
     private static final String COPY_PATTERN = "copy of %s (%d)";
 
@@ -70,17 +71,12 @@ public class PasteAction extends ModelerAbstractAction 
implements FlavorListener
      * Constructor for PasteAction
      */
     public PasteAction(Application application) {
-        super(getActionName(), application);
+        super(application, "Paste");
 
-        // add listener, so that button state would update event if clipboard 
was filled
-        // by other app
+        // add listener, so that button state would update event if clipboard 
was filled by other app
         
Toolkit.getDefaultToolkit().getSystemClipboard().addFlavorListener(this);
     }
 
-    public static String getActionName() {
-        return "Paste";
-    }
-
     @Override
     public String getIconName() {
         return "icon-paste.png";
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
index d652d5e51..66715fd8f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ProjectOpener.java
@@ -37,7 +37,6 @@ import java.util.List;
 
 /**
  * File chooser panel used to select a directory to store project files.
- *
  */
 class ProjectOpener extends JFileChooser {
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RedoAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RedoAction.java
index ce0873a7a..b1cef059d 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RedoAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RedoAction.java
@@ -26,8 +26,9 @@ import java.awt.event.KeyEvent;
 import javax.swing.KeyStroke;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
-public class RedoAction extends ModelerAbstractAction {
+public class RedoAction extends AppAction {
 
     @Override
     public void setEnabled(boolean b) {
@@ -46,7 +47,7 @@ public class RedoAction extends ModelerAbstractAction {
     }
     
     public RedoAction(Application application) {
-        super(getActionName(), application);
+        super(application, getActionName());
     }
     
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAction.java
index fa94781de..00cecb83a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RemoveAction.java
@@ -54,6 +54,7 @@ import org.apache.cayenne.modeler.event.model.ProcedureEvent;
 import org.apache.cayenne.modeler.event.model.ProcedureParameterEvent;
 import org.apache.cayenne.modeler.event.model.QueryEvent;
 import org.apache.cayenne.modeler.project.DataMapOps;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.confirmremove.ConfirmRemoveDialog;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
@@ -78,14 +79,14 @@ import java.util.Collection;
  * Removes currently selected object from the project. This can be Domain, 
DataNode,
  * Entity, Attribute or Relationship.
  */
-public class RemoveAction extends ModelerAbstractAction {
+public class RemoveAction extends AppAction {
 
     public RemoveAction(Application application) {
-        super("Remove", application);
+        super(application, "Remove");
     }
 
     protected RemoveAction(String actionName, Application application) {
-        super(actionName, application);
+        super(application, actionName);
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RevertAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RevertAction.java
index a82941e41..b2bbcebf3 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RevertAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/RevertAction.java
@@ -20,15 +20,16 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.project.Project;
 
 import java.awt.event.ActionEvent;
 import java.io.File;
 
-public class RevertAction extends ModelerAbstractAction {
+public class RevertAction extends AppAction {
 
     public RevertAction(Application application) {
-        super("Revert", application);
+        super(application, "Revert");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
index 1abaf9f7a..63111e5d6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/SaveAsAction.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.model.ProjectBeforeSaveEvent;
 import org.apache.cayenne.modeler.event.model.ProjectAfterSaveEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.ProjectSaver;
 import org.apache.cayenne.project.validation.ProjectValidator;
@@ -40,7 +41,7 @@ import java.io.File;
 /**
  * A "Save As" action that allows user to pick save location.
  */
-public class SaveAsAction extends ModelerAbstractAction {
+public class SaveAsAction extends AppAction {
 
     private final ProjectOpener fileChooser;
 
@@ -49,7 +50,7 @@ public class SaveAsAction extends ModelerAbstractAction {
     }
 
     protected SaveAsAction(String name, Application application) {
-        super(name, application);
+        super(application, name);
         this.fileChooser = new ProjectOpener();
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
index 2cb732f4b..37cdcbc6e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowLogConsoleAction.java
@@ -19,6 +19,7 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.logconsole.LogConsolePrefs;
 
 import javax.swing.Action;
@@ -29,10 +30,10 @@ import java.awt.event.ActionEvent;
  * {@link Action#SELECTED_KEY} so that any bound checkbox menu item or toggle
  * stays in sync regardless of where the toggle originates.
  */
-public class ShowLogConsoleAction extends ModelerAbstractAction {
+public class ShowLogConsoleAction extends AppAction {
 
     public ShowLogConsoleAction(Application application) {
-        super("Show Log Console", application);
+        super(application, "Show Log Console");
         putValue(Action.SELECTED_KEY, isConsoleShown());
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationConfigAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationConfigAction.java
index fbb320016..7309ca402 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationConfigAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ShowValidationConfigAction.java
@@ -22,13 +22,14 @@ import 
org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.event.display.DomainDisplayEvent;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import java.awt.event.ActionEvent;
 
-public class ShowValidationConfigAction extends ModelerAbstractAction {
+public class ShowValidationConfigAction extends AppAction {
 
     public ShowValidationConfigAction(Application application) {
-        super("Show validation config", application);
+        super(application, "Show validation config");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UndoAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UndoAction.java
index 2cebd69b4..4b3069c15 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UndoAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UndoAction.java
@@ -19,16 +19,17 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 
-public class UndoAction extends ModelerAbstractAction {
+public class UndoAction extends AppAction {
 
     public UndoAction(Application application) {
-        super("Undo", application);
+        super(application, "Undo");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UpdateValidationConfigAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UpdateValidationConfigAction.java
index b2cb3f9d1..3b020cb90 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UpdateValidationConfigAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/UpdateValidationConfigAction.java
@@ -23,6 +23,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.event.model.DomainEvent;
 import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.undo.CayenneUndoManager;
 import org.apache.cayenne.modeler.undo.UpdateValidationConfigUndoableEdit;
 import org.apache.cayenne.project.validation.ValidationConfig;
@@ -32,19 +33,19 @@ import java.awt.event.ActionEvent;
 /**
  * Requires config provided with {@link 
UpdateValidationConfigAction#putConfig(ValidationConfig)}.
  */
-public class UpdateValidationConfigAction extends ModelerAbstractAction {
+public class UpdateValidationConfigAction extends AppAction {
 
     private static final String CONFIG_PARAM = "config";
 
     private boolean undoable;
 
     public UpdateValidationConfigAction(Application application) {
-        super("Update ValidationConfig", application);
+        super(application, "Update ValidationConfig");
         this.undoable = true;
     }
 
     protected UpdateValidationConfigAction(String name, Application 
application) {
-        super(name, application);
+        super(application, name);
     }
 
     public void performAction(Object source) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ValidateAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ValidateAction.java
index cd6a315dd..840073a74 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ValidateAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/action/ValidateAction.java
@@ -20,6 +20,7 @@
 package org.apache.cayenne.modeler.ui.action;
 
 import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.project.validator.ProjectValidatorDialog;
 import org.apache.cayenne.project.validation.ProjectValidator;
 import org.apache.cayenne.validation.ValidationFailure;
@@ -37,12 +38,12 @@ import java.util.List;
 /**
  * UI action that performs full project validation.
  */
-public class ValidateAction extends ModelerAbstractAction {
+public class ValidateAction extends AppAction {
 
     private ProjectValidatorDialog dialog;
 
     public ValidateAction(Application application) {
-        super("Validate Project", application);
+        super(application, "Validate Project");
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
index 74a04e6d8..3a814932c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/logconsole/LogConsole.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.modeler.log.LogAppender;
 import org.apache.cayenne.modeler.toolkit.border.TopBorder;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 import org.apache.cayenne.modeler.toolkit.AppPanel;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.action.ShowLogConsoleAction;
 import org.apache.cayenne.util.Util;
 
@@ -86,9 +86,9 @@ public class LogConsole extends AppPanel implements 
LogAppender {
     public LogConsole(Application app) {
         super(app);
         this.logView = new JTextPane();
-        this.clearItem = new ModelerAbstractAction.CayenneToolbarButton(null, 
0);
-        this.copyItem = new ModelerAbstractAction.CayenneToolbarButton(null, 
0);
-        this.closeItem = new ModelerAbstractAction.CayenneToolbarButton(null, 
0);
+        this.clearItem = new AppAction.CayenneToolbarButton(null, 0);
+        this.copyItem = new AppAction.CayenneToolbarButton(null, 0);
+        this.closeItem = new AppAction.CayenneToolbarButton(null, 0);
 
         initLayout();
         initBindings();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
index 8473c3bdb..498bb1409 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/more/MorePrefsPanel.java
@@ -25,7 +25,7 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.PreferencesRepository;
 import org.apache.cayenne.modeler.toolkit.AppPanel;
-import org.apache.cayenne.modeler.ui.action.ProjectAction;
+import org.apache.cayenne.modeler.ui.action.CloseProjectAction;
 
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
@@ -100,8 +100,7 @@ public class MorePrefsPanel extends AppPanel {
         // Close the open project first (with the standard unsaved-changes
         // prompt). closeProject is a no-op when no project is open. If the 
user
         // cancels the save prompt, abort the wipe entirely.
-        ProjectAction projectAction = 
app.getActionManager().getAction(ProjectAction.class);
-        if (!projectAction.closeProject(true)) {
+        if (!CloseProjectAction.closeProject(app, true)) {
             return;
         }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java
index 3a2bfd67e..f8b840bd1 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/EntityDisplayAction.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
 import org.apache.cayenne.modeler.ui.action.FindAction;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import javax.swing.*;
 import java.awt.event.ActionEvent;
@@ -31,23 +31,23 @@ import java.awt.event.ActionEvent;
 /**
  * Action that displays one of the objects in main tree, and then fires 
another action (if specified)
  */
-public class EntityDisplayAction extends ModelerAbstractAction {
+public class EntityDisplayAction extends AppAction {
 
     /**
      * Action that will be performed after selection
      */
-    private ModelerAbstractAction delegate;
+    private AppAction delegate;
 
     private final GraphBuilder builder;
 
     public EntityDisplayAction(GraphBuilder builder, Application application) {
-        super("Show", application);
+        super(application, "Show");
         this.builder = builder;
         init();
     }
 
-    public EntityDisplayAction(GraphBuilder builder, ModelerAbstractAction 
delegate, Application application) {
-        super((String) delegate.getValue(Action.NAME), application);
+    public EntityDisplayAction(GraphBuilder builder, AppAction delegate, 
Application application) {
+        super(application, (String) delegate.getValue(Action.NAME));
         this.delegate = delegate;
         this.builder = builder;
         init();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java
index 23cb29fbf..7b75abd02 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/RebuildGraphAction.java
@@ -22,16 +22,16 @@ import java.awt.event.ActionEvent;
 
 import org.apache.cayenne.modeler.Application;
 import 
org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 /**
  * Action for refreshing the graph 
  */
-public class RebuildGraphAction extends ModelerAbstractAction {
+public class RebuildGraphAction extends AppAction {
     private final DataDomainGraphTab dataDomainGraphTab;
 
     public RebuildGraphAction(DataDomainGraphTab dataDomainGraphTab, 
Application application) {
-        super("Rebuild", application);
+        super(application, "Rebuild");
         this.dataDomainGraphTab = dataDomainGraphTab;
         setEnabled(true);
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java
index 7b680d698..ada688a76 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/SaveAsImageAction.java
@@ -19,7 +19,7 @@
 package org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.toolkit.filechooser.CMFileChooserPrefs;
 import 
org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
 import org.apache.cayenne.modeler.util.FileFilters;
@@ -39,13 +39,13 @@ import java.io.OutputStream;
 /**
  * Action for saving graph as image
  */
-public class SaveAsImageAction extends ModelerAbstractAction {
+public class SaveAsImageAction extends AppAction {
        private static final Logger LOGGER = 
LoggerFactory.getLogger(SaveAsImageAction.class);
 
        private final DataDomainGraphTab dataDomainGraphTab;
 
        public SaveAsImageAction(DataDomainGraphTab dataDomainGraphTab, 
Application application) {
-               super("Save As Image", application);
+               super(application, "Save As Image");
                this.dataDomainGraphTab = dataDomainGraphTab;
                setEnabled(true);
        }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
index 947b48242..67f0b5188 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ShowGraphEntityAction.java
@@ -28,21 +28,21 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.event.display.DbEntityDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
 
 /**
  * Action that shows entity on the graph
  */
-public class ShowGraphEntityAction extends ModelerAbstractAction {
+public class ShowGraphEntityAction extends AppAction {
 
     public static String getActionName() {
         return "ShowGraphEntity";
     }
 
     public ShowGraphEntityAction(Application application) {
-        super(getActionName(), application, "Show on Graph");
+        super(application, getActionName(), "Show on Graph");
         setEnabled(true);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java
index 40550f72f..f26ff9b65 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomInAction.java
@@ -23,17 +23,17 @@ import java.awt.event.ActionEvent;
 import org.apache.cayenne.modeler.Application;
 import 
org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.jgraph.JGraph;
 
 /**
  * Action for zooming in graph
  */
-public class ZoomInAction extends ModelerAbstractAction {
+public class ZoomInAction extends AppAction {
     private final DataDomainGraphTab dataDomainGraphTab;
     
     public ZoomInAction(DataDomainGraphTab dataDomainGraphTab, Application 
application) {
-        super("Zoom In", application);
+        super(application, "Zoom In");
         this.dataDomainGraphTab = dataDomainGraphTab;
         setEnabled(true);
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java
index a96ebd97d..3d547f5ad 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/graph/action/ZoomOutAction.java
@@ -23,17 +23,17 @@ import java.awt.event.ActionEvent;
 import org.apache.cayenne.modeler.Application;
 import 
org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.DataDomainGraphTab;
 import org.apache.cayenne.modeler.graph.GraphBuilder;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.jgraph.JGraph;
 
 /**
  * Action for zooming out graph
  */
-public class ZoomOutAction extends ModelerAbstractAction {
+public class ZoomOutAction extends AppAction {
     private final DataDomainGraphTab dataDomainGraphTab;
     
     public ZoomOutAction(DataDomainGraphTab dataDomainGraphTab, Application 
application) {
-        super("Zoom Out", application);
+        super(application, "Zoom Out");
         this.dataDomainGraphTab = dataDomainGraphTab;
         setEnabled(true);
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
index 6ccb3ba93..8878955af 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/DbImportView.java
@@ -30,7 +30,7 @@ import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.Mode
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.ColorTreeRenderer;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.TransferableNode;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import javax.swing.*;
 import javax.swing.border.EmptyBorder;
@@ -49,7 +49,7 @@ public class DbImportView extends ProjectPanel {
     private final SourceTargetPanel sourceTargetPanel;
     private final JProgressBar loadDbSchemaProgress;
     private final JProgressBar reverseEngineeringProgress;
-    private final ModelerAbstractAction.CayenneToolbarButton 
loadDbSchemaButton;
+    private final AppAction.CayenneToolbarButton loadDbSchemaButton;
 
     private boolean initFromModel;
 
@@ -84,7 +84,7 @@ public class DbImportView extends ProjectPanel {
         this.configPanel = new ReverseEngineeringConfigPanel(session, this);
         this.loadDbSchemaProgress = new JProgressBar();
         this.reverseEngineeringProgress = new JProgressBar();
-        this.loadDbSchemaButton = (ModelerAbstractAction.CayenneToolbarButton)
+        this.loadDbSchemaButton = (AppAction.CayenneToolbarButton)
                 actions.getLoadDbSchemaAction().buildButton(0);
 
         initLayout(actions);
@@ -121,8 +121,8 @@ public class DbImportView extends ProjectPanel {
         treeToolbar.add(loadDbSchemaButton);
 
         ModelerDbImportAction dbImportAction = 
actions.getReverseEngineeringAction();
-        ModelerAbstractAction.CayenneToolbarButton reverseEngineeringButton =
-                (ModelerAbstractAction.CayenneToolbarButton) 
dbImportAction.buildButton(0);
+        AppAction.CayenneToolbarButton reverseEngineeringButton =
+                (AppAction.CayenneToolbarButton) dbImportAction.buildButton(0);
         reverseEngineeringButton.setShowingText(true);
         reverseEngineeringButton.setText("Run Import");
         JPanel reverseEngineeringButtonPanel = new JPanel();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SourceTargetPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SourceTargetPanel.java
index fa74eedb3..db70b0ca1 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SourceTargetPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/SourceTargetPanel.java
@@ -29,7 +29,7 @@ import 
org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DbImportActions;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.DragAndDropNodeAction;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.action.TreeManipulationAction;
@@ -73,8 +73,8 @@ public class SourceTargetPanel extends JPanel {
     private final Map<Class<?>, Integer> levels;
     private final Map<Class<?>, List<Class<?>>> insertableLevels;
 
-    private final ModelerAbstractAction.CayenneToolbarButton moveButton;
-    private final ModelerAbstractAction.CayenneToolbarButton moveInvertButton;
+    private final AppAction.CayenneToolbarButton moveButton;
+    private final AppAction.CayenneToolbarButton moveInvertButton;
     private final JScrollPane scrollPane;
 
     private ImportSourceTree importSourceTree;
@@ -86,8 +86,8 @@ public class SourceTargetPanel extends JPanel {
         this.databaseStructures = new HashMap<>();
         this.levels = new HashMap<>();
         this.insertableLevels = new HashMap<>();
-        this.moveButton = (ModelerAbstractAction.CayenneToolbarButton) 
actions.getMoveImportNodeAction().buildButton();
-        this.moveInvertButton = (ModelerAbstractAction.CayenneToolbarButton) 
actions.getMoveInvertNodeAction().buildButton();
+        this.moveButton = (AppAction.CayenneToolbarButton) 
actions.getMoveImportNodeAction().buildButton();
+        this.moveInvertButton = (AppAction.CayenneToolbarButton) 
actions.getMoveInvertNodeAction().buildButton();
         this.scrollPane = new JScrollPane(sourceTree);
 
         initLayout();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddCatalogAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddCatalogAction.java
index 73f1e389e..9b60a11ca 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddCatalogAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddCatalogAction.java
@@ -33,7 +33,7 @@ public class AddCatalogAction extends TreeManipulationAction {
     private static final String ICON_NAME = "icon-dbi-catalog.png";
 
     public AddCatalogAction(Application application, DbImportTree tree) {
-        super(ACTION_NAME, application, tree);
+        super(application, ACTION_NAME, tree);
         insertableNodeClass = Catalog.class;
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeTableAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeTableAction.java
index 7dee78938..7b71d6d22 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeTableAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddIncludeTableAction.java
@@ -34,7 +34,7 @@ public class AddIncludeTableAction extends 
TreeManipulationAction {
     private static final String ICON_NAME = "icon-dbi-includeTable.png";
 
     public AddIncludeTableAction(Application application, DbImportTree tree) {
-        super(ACTION_NAME, application, tree);
+        super(application, ACTION_NAME, tree);
         insertableNodeClass = IncludeTable.class;
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddPatternParamAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddPatternParamAction.java
index 324e7d28e..2fe20e781 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddPatternParamAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddPatternParamAction.java
@@ -39,7 +39,7 @@ public abstract class AddPatternParamAction extends 
TreeManipulationAction {
     private final Class<?> paramClass;
 
     AddPatternParamAction(String name, Application application, DbImportTree 
tree, Class<?> paramClass) {
-        super(name, application, tree);
+        super(application, name, tree);
         this.paramClass = paramClass;
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddSchemaAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddSchemaAction.java
index 00f29e17b..d730e8c3c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddSchemaAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/AddSchemaAction.java
@@ -35,7 +35,7 @@ public class AddSchemaAction extends TreeManipulationAction {
     private static final String ICON_NAME = "icon-dbi-schema.png";
 
     public AddSchemaAction(Application application, DbImportTree tree) {
-        super(ACTION_NAME, application, tree);
+        super(application, ACTION_NAME, tree);
         insertableNodeClass = Schema.class;
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
index b00f92f31..49f83a01c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DbImportActions.java
@@ -28,7 +28,7 @@ import 
org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
 import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
 import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
 
@@ -95,7 +95,7 @@ public class DbImportActions {
         actionsByNodeType.put(ExcludeProcedure.class, addExcludeProcedure);
     }
 
-    private static <T extends ModelerAbstractAction> T enabled(T action) {
+    private static <T extends AppAction> T enabled(T action) {
         action.setAlwaysOn(true);
         return action;
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DeleteNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DeleteNodeAction.java
index 2263bf415..523b1d133 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DeleteNodeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DeleteNodeAction.java
@@ -48,7 +48,7 @@ public class DeleteNodeAction extends TreeManipulationAction {
     private final DbImportView view;
 
     public DeleteNodeAction(Application application, DbImportView view, 
DbImportTree tree) {
-        super(ACTION_NAME, application, tree);
+        super(application, ACTION_NAME, tree);
         this.view = view;
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DragAndDropNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DragAndDropNodeAction.java
index e35331182..abf343ff4 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DragAndDropNodeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/DragAndDropNodeAction.java
@@ -43,7 +43,7 @@ public class DragAndDropNodeAction extends 
TreeManipulationAction {
     private JTree.DropLocation dropLocation;
 
     public DragAndDropNodeAction(Application application, DbImportTree tree) {
-        super(ACTION_NAME, application, tree);
+        super(application, ACTION_NAME, tree);
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/EditNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/EditNodeAction.java
index 91b6401fc..1cce46199 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/EditNodeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/EditNodeAction.java
@@ -38,7 +38,7 @@ public class EditNodeAction extends TreeManipulationAction {
     private String actionName;
 
     public EditNodeAction(Application application, DbImportTree tree) {
-        super(ACTION_NAME, application, tree);
+        super(application, ACTION_NAME, tree);
     }
 
     public String getIconName() {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
index 7e8e289d1..2bd09862b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/MoveImportNodeAction.java
@@ -35,7 +35,7 @@ import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTre
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportView;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.SourceTargetPanel;
 import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 
 import javax.swing.tree.TreePath;
 import java.awt.event.ActionEvent;
@@ -44,7 +44,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Matcher;
 
-public class MoveImportNodeAction extends ModelerAbstractAction {
+public class MoveImportNodeAction extends AppAction {
 
     private static final String ICON_NAME = "icon-backward.png";
     private static final String ACTION_NAME = "Include";
@@ -62,7 +62,7 @@ public class MoveImportNodeAction extends 
ModelerAbstractAction {
 
     MoveImportNodeAction(String actionName, Application application, 
DbImportView view,
                          DbImportTree sourceTree, DbImportTree targetTree) {
-        super(actionName, application);
+        super(application, actionName);
         this.view = view;
         this.sourceTree = sourceTree;
         this.targetTree = targetTree;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/SortNodesAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/SortNodesAction.java
index 5235a97b1..b71481d46 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/SortNodesAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/SortNodesAction.java
@@ -34,7 +34,7 @@ public class SortNodesAction extends TreeManipulationAction {
     private static final String ICON_NAME = "icon-dbi-sort.png";
 
     public SortNodesAction(Application application, DbImportTree tree) {
-        super(ACTION_NAME, application, tree);
+        super(application, ACTION_NAME, tree);
     }
 
     @Override
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
index ab965dc02..74cc2081b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/action/TreeManipulationAction.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.modeler.Application;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.tree.DbImportTreeNode;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportTree;
 import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +45,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-public abstract class TreeManipulationAction extends ModelerAbstractAction {
+public abstract class TreeManipulationAction extends AppAction {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(TreeManipulationAction.class);
 
@@ -61,8 +61,8 @@ public abstract class TreeManipulationAction extends 
ModelerAbstractAction {
     protected String name;
     protected boolean updateSelected;
 
-    public TreeManipulationAction(String name, Application application, 
DbImportTree tree) {
-        super(name, application);
+    public TreeManipulationAction(Application app, String name, DbImportTree 
tree) {
+        super(app, name);
         this.tree = tree;
         this.levels = initLevels();
     }
@@ -71,7 +71,7 @@ public abstract class TreeManipulationAction extends 
ModelerAbstractAction {
         if (!isMultipleAction) {
             updateAfterInsert();
         }
-        if ((!isMultipleAction) && (!insertableNodeName.equals(""))) {
+        if ((!isMultipleAction) && (!insertableNodeName.isEmpty())) {
             putReverseEngineeringToUndoManager(reverseEngineeringOldCopy);
         }
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
index 88c78f47d..fb55c170b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbEntityPropertiesView.java
@@ -35,7 +35,7 @@ import 
org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.DbEntityCounterpartAction;
 import org.apache.cayenne.modeler.ui.action.DbEntitySyncAction;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
 import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.project.ProjectSession;
@@ -57,7 +57,7 @@ public class DbEntityPropertiesView extends ProjectPanel 
implements DbEntityDisp
 
     public DbEntityPropertiesView(ProjectSession session) {
         super(session);
-        this.editButton = new ModelerAbstractAction.CayenneToolbarButton(null, 
0);
+        this.editButton = new AppAction.CayenneToolbarButton(null, 0);
         this.attributePanel = new DbAttributePanel(session, this);
         this.relationshipPanel = new DbRelationshipPanel(session, this);
         this.splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
attributePanel, relationshipPanel);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
index 5534d38a0..142ba9e19 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/callbacks/ObjEntityCallbacksView.java
@@ -36,7 +36,7 @@ import org.apache.cayenne.modeler.toolkit.table.CMTable;
 import org.apache.cayenne.modeler.ui.action.CopyCallbackMethodAction;
 import org.apache.cayenne.modeler.ui.action.CreateCallbackMethodAction;
 import org.apache.cayenne.modeler.ui.action.CutCallbackMethodAction;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
 import org.apache.cayenne.modeler.toolkit.ProjectPanel;
 import org.apache.cayenne.modeler.ui.action.RemoveCallbackMethodAction;
@@ -178,7 +178,7 @@ public class ObjEntityCallbacksView extends ProjectPanel {
         return null;
     }
 
-    private ModelerAbstractAction getCreateCallbackMethodAction() {
+    private AppAction getCreateCallbackMethodAction() {
         return 
app.getActionManager().getAction(CreateCallbackMethodAction.class);
     }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
index 189df222f..9f365889a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjEntityPropertiesView.java
@@ -29,7 +29,7 @@ import 
org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CreateAttributeAction;
 import org.apache.cayenne.modeler.ui.action.CreateRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.action.ObjEntityCounterpartAction;
 import org.apache.cayenne.modeler.ui.action.ObjEntitySyncAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
@@ -54,7 +54,7 @@ public class ObjEntityPropertiesView extends ProjectPanel 
implements ObjEntityDi
 
     public ObjEntityPropertiesView(ProjectSession session) {
         super(session);
-        this.editButton = new ModelerAbstractAction.CayenneToolbarButton(null, 
0);
+        this.editButton = new AppAction.CayenneToolbarButton(null, 0);
         this.attributePanel = new ObjAttributePanel(session, this);
         this.relationshipPanel = new ObjRelationshipPanel(session, this);
         this.splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, 
attributePanel, relationshipPanel);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
index 5771f2fa5..fc4a76302 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureParameterTab.java
@@ -45,7 +45,7 @@ import 
org.apache.cayenne.modeler.ui.action.CopyProcedureParameterAction;
 import org.apache.cayenne.modeler.ui.action.CreateProcedureParameterAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutProcedureParameterAction;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
 import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.RemoveProcedureParameterAction;
@@ -119,13 +119,13 @@ public class ProcedureParameterTab extends ProjectPanel 
implements ProcedurePara
         Icon up = IconFactory.buildIcon("icon-up.png");
         Icon down = IconFactory.buildIcon("icon-down.png");
 
-        moveUp = new ModelerAbstractAction.CayenneToolbarButton(null, 1);
+        moveUp = new AppAction.CayenneToolbarButton(null, 1);
         moveUp.setIcon(up);
         moveUp.setDisabledIcon(IconFactory.disabledIcon(up));
         moveUp.setToolTipText("Move Parameter Up");
         toolBar.add(moveUp);
 
-        moveDown = new ModelerAbstractAction.CayenneToolbarButton(null, 3);
+        moveDown = new AppAction.CayenneToolbarButton(null, 3);
         moveDown.setIcon(down);
         moveDown.setDisabledIcon(IconFactory.disabledIcon(down));
         moveDown.setToolTipText("Move Parameter Down");
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
index 15bd1de92..05070baec 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryOrderingTab.java
@@ -28,7 +28,7 @@ import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 import org.apache.cayenne.modeler.toolkit.splitpane.CMSplitPanePrefs;
 import org.apache.cayenne.modeler.toolkit.table.CMTable;
 import org.apache.cayenne.modeler.toolkit.ProjectPanel;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.util.EntityTreeModel;
 import org.apache.cayenne.query.Ordering;
@@ -167,14 +167,14 @@ public class SelectQueryOrderingTab extends ProjectPanel {
 
     protected JComponent createToolbar() {
 
-        JButton add = new ModelerAbstractAction.CayenneToolbarButton(null, 1);
+        JButton add = new AppAction.CayenneToolbarButton(null, 1);
         add.setText("Add Ordering");
         Icon addIcon = IconFactory.buildIcon("icon-plus.png");
         add.setIcon(addIcon);
         add.setDisabledIcon(IconFactory.disabledIcon(addIcon));
         add.addActionListener(e -> addOrdering());
 
-        JButton remove = new ModelerAbstractAction.CayenneToolbarButton(null, 
3);
+        JButton remove = new AppAction.CayenneToolbarButton(null, 3);
         remove.setText("Remove Ordering");
         Icon removeIcon = IconFactory.buildIcon("icon-trash.png");
         remove.setIcon(removeIcon);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java
index 9ad617d55..6541301be 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryPrefetchTab.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.util.EntityTreeFilter;
 import org.apache.cayenne.modeler.util.EntityTreeModel;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
@@ -83,7 +83,7 @@ public class SelectQueryPrefetchTab extends 
SelectQueryOrderingTab {
 
     protected JComponent createToolbar() {
 
-        JButton add = new ModelerAbstractAction.CayenneToolbarButton(null, 1);
+        JButton add = new AppAction.CayenneToolbarButton(null, 1);
         add.setText("Add Prefetch");
         Icon addIcon = IconFactory.buildIcon("icon-plus.png");
         add.setIcon(addIcon);
@@ -101,7 +101,7 @@ public class SelectQueryPrefetchTab extends 
SelectQueryOrderingTab {
             app.getUndoManager().addEdit(new AddPrefetchUndoableEdit(prefetch, 
SelectQueryPrefetchTab.this));
         });
 
-        JButton remove = new ModelerAbstractAction.CayenneToolbarButton(null, 
3);
+        JButton remove = new AppAction.CayenneToolbarButton(null, 3);
         remove.setText("Remove Prefetch");
         Icon removeIcon = IconFactory.buildIcon("icon-trash.png");
         remove.setIcon(removeIcon);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
index 48c772907..8025c309b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplatePrefetchTab.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.SQLTemplateDescriptor;
 import org.apache.cayenne.modeler.toolkit.ProjectPanel;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.util.EntityTreeFilter;
 import org.apache.cayenne.modeler.util.EntityTreeModel;
 import org.apache.cayenne.modeler.toolkit.MultiColumnBrowser;
@@ -194,7 +194,7 @@ public class SQLTemplatePrefetchTab extends ProjectPanel {
 
     protected JComponent createToolbar() {
 
-        JButton add = new ModelerAbstractAction.CayenneToolbarButton(null, 1);
+        JButton add = new AppAction.CayenneToolbarButton(null, 1);
         add.setText("Add Prefetch");
         Icon addIcon = IconFactory.buildIcon("icon-plus.png");
         add.setIcon(addIcon);
@@ -212,7 +212,7 @@ public class SQLTemplatePrefetchTab extends ProjectPanel {
             app.getUndoManager().addEdit(new 
AddPrefetchUndoableEditForSqlTemplate(prefetch, SQLTemplatePrefetchTab.this));
         });
 
-        JButton remove = new ModelerAbstractAction.CayenneToolbarButton(null, 
3);
+        JButton remove = new AppAction.CayenneToolbarButton(null, 3);
         remove.setText("Remove Prefetch");
         Icon removeIcon = IconFactory.buildIcon("icon-trash.png");
         remove.setIcon(removeIcon);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTree.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTree.java
index c5eabc8d2..b56c026f4 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTree.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTree.java
@@ -76,7 +76,7 @@ import org.apache.cayenne.modeler.ui.action.CreateQueryAction;
 import org.apache.cayenne.modeler.ui.action.CutAction;
 import org.apache.cayenne.modeler.ui.action.DbEntitySyncAction;
 import org.apache.cayenne.modeler.ui.action.LinkDataMapsAction;
-import org.apache.cayenne.modeler.ui.action.ModelerAbstractAction;
+import org.apache.cayenne.modeler.toolkit.AppAction;
 import org.apache.cayenne.modeler.ui.action.ObjEntitySyncAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
 import org.apache.cayenne.modeler.ui.action.RemoveAction;
@@ -988,7 +988,7 @@ public class ProjectTree extends JTree
      * Creates and returns a menu item associated with the given action type.
      */
     private JMenuItem buildMenu(Class<? extends Action> actionType) {
-        ModelerAbstractAction action = (ModelerAbstractAction) session.app()
+        AppAction action = (AppAction) session.app()
                 .getActionManager()
                 .getAction(actionType);
         return action.buildMenu();


Reply via email to