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 7fb27a7e85a5afa6db5af8363b75f079b9bffe65
Author: Andrus Adamchik <[email protected]>
AuthorDate: Tue May 5 18:08:01 2026 -0400

    Modeler cleanup
---
 .../{util => }/NameGeneratorPreferences.java       |   4 +-
 .../DbAdapters.java}                               |  60 ++-----
 .../ProjectComparators.java}                       |   4 +-
 .../cayenne/modeler/project/ProjectSession.java    |   5 +-
 .../AppTabbedPane.java}                            |  29 ++--
 .../cayenne/modeler/toolkit/ProjectTabbedPane.java |   9 +-
 .../ColumnViewPanel.java}                          |  26 +--
 .../{util => toolkit/filechooser}/FileFilters.java | 111 +-----------
 .../cayenne/modeler/toolkit/icon/IconFactory.java  |   2 +-
 .../modeler/toolkit/text/LimitedTextField.java     |  49 ------
 .../modeler/toolkit/text/LineNumberedBorder.java   | 188 ++++++++++-----------
 .../EntityTreeAttributeRelationshipFilter.java     |   2 +-
 .../{util => toolkit/tree}/EntityTreeFilter.java   |   2 +-
 .../{util => toolkit/tree}/EntityTreeModel.java    |   7 +-
 .../tree}/EntityTreeRelationshipFilter.java        |   2 +-
 .../modeler/toolkit/{ => url}/UrlOpener.java       |   2 +-
 .../toolkit/{ => valuetype}/ValueTypes.java        |   2 +-
 .../org/apache/cayenne/modeler/ui/MainFrame.java   |   2 +-
 .../cayenne/modeler/ui/about/AboutFrame.java       |  64 +++----
 .../modeler/ui/action/DocumentationAction.java     |   2 +-
 .../modeler/ui/action/ImportDataMapAction.java     |   2 +-
 .../modeler/ui/action/ImportEOModelAction.java     |  72 +++++++-
 .../cayenne/modeler/ui/action/ProjectOpener.java   |   2 +-
 .../autorelationship/InferRelationshipsDialog.java |  11 +-
 .../autorelationship/InferRelationshipsPanel.java  |   3 -
 .../modeler/ui/dbgen/DBGeneratorOptionsDialog.java |   4 +-
 .../modeler/ui/entitysync/EntitySyncDialog.java    |   2 +-
 .../cayenne/modeler/ui/errors/ErrorDialog.java     |   2 +-
 .../preferences/classpath/ClasspathPrefsPanel.java |   2 +-
 .../preferences/dbconnector/DBConnectorEditor.java |   4 +-
 .../creator/DBConnectorCreatorDialog.java          |   4 +-
 .../project/editor/datadomain/DataDomainView.java  |   8 +-
 .../datadomain/graph/action/SaveAsImageAction.java |   2 +-
 .../ui/project/editor/datamap/DataMapView.java     |   6 +-
 .../dbimport/ReverseEngineeringConfigPanel.java    |   2 +-
 .../editor/datamap/main/DataMapMainView.java       |   4 +-
 .../main/superclass/SuperclassUpdateDialog.java    |   4 +-
 .../ui/project/editor/dbentity/DbEntityView.java   |   8 +-
 .../dbentity/properties/DbAttributePanel.java      |  32 ++--
 .../project/editor/embeddable/EmbeddableView.java  |   6 +-
 .../attributes/EmbeddableAttributesView.java       |   2 +-
 .../editor/embeddable/main/EmbeddableMainView.java |   4 +-
 .../ui/project/editor/objentity/ObjEntityView.java |   8 +-
 .../objentity/attrinfo/ObjAttributeInfoDialog.java |  12 +-
 ...er.java => ObjAttributePathNavigatorPanel.java} |   6 +-
 .../editor/objentity/main/ObjEntityMainView.java   |   6 +-
 .../properties/DbAttributePathComboBoxEditor.java  |   4 +-
 .../DbRelationshipPathComboBoxEditor.java          |   4 +-
 .../objentity/properties/ObjAttributePanel.java    |   2 +-
 .../properties/ObjAttributeTableModel.java         |   2 +-
 .../properties/PathChooserComboBoxCellEditor.java  |   2 +-
 .../relinfo/ObjRelationshipInfoDialog.java         |  14 +-
 ...java => ObjRelationshipPathNavigatorPanel.java} |  19 +--
 .../editor/procedure/ProcedureParameterTab.java    |  33 +---
 .../editor/procedure/ProcedureQueryView.java       |   4 +-
 .../editor/procedure/ProcedureTabbedView.java      |   7 +-
 .../editor/query/RawQueryPropertiesPanel.java      |   4 +-
 .../editor/query/ejbql/EjbqlTabbedView.java        |   4 +-
 .../query/selectquery/SelectQueryMainTab.java      |   4 +-
 .../query/selectquery/SelectQueryOrderingTab.java  |   8 +-
 .../query/selectquery/SelectQueryPrefetchTab.java  |   4 +-
 .../query/selectquery/SelectQueryTabbedView.java   |  15 +-
 .../query/sqltemplate/SQLTemplateMainTab.java      |   4 +-
 .../query/sqltemplate/SQLTemplatePrefetchTab.java  |  10 +-
 .../query/sqltemplate/SQLTemplateScriptsTab.java   |  10 +-
 .../query/sqltemplate/SQLTemplateTabbedView.java   |   6 +-
 .../modeler/ui/project/tree/ProjectTree.java       |  30 ++--
 .../ui/project/tree/ProjectTreeFactory.java        |  12 +-
 .../modeler/util/ApplicationFileFilterTest.java    |   1 +
 .../modeler/util/DataMapFileFilterTest.java        |   1 +
 .../modeler/util/EOModelFileFilterTest.java        |   1 +
 71 files changed, 395 insertions(+), 600 deletions(-)

diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/NameGeneratorPreferences.java
similarity index 94%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/NameGeneratorPreferences.java
index 51d3b4d84..759bf43a1 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/NameGeneratorPreferences.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/NameGeneratorPreferences.java
@@ -16,11 +16,10 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler;
 
 import org.apache.cayenne.dbsync.naming.DefaultObjectNameGenerator;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
-import org.apache.cayenne.modeler.Application;
 
 import java.util.Arrays;
 import java.util.Vector;
@@ -29,6 +28,7 @@ import java.util.prefs.Preferences;
 /**
  * Helper class to store/read information about naming strategies have been 
used
  */
+// TODO: this requires some refactoring (or removal)?
 public class NameGeneratorPreferences {
 
     private static final String STRATEGIES_PREFERENCE = "recentNameGenerators";
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dbadapter/DbAdapters.java
similarity index 69%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dbadapter/DbAdapters.java
index 49b18e42f..440b1306a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAdapterInfo.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dbadapter/DbAdapters.java
@@ -17,16 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
-
-import java.awt.Component;
-import java.util.Collections;
-import java.util.Map;
-import java.util.TreeMap;
-
-import javax.swing.DefaultListCellRenderer;
-import javax.swing.JList;
-import javax.swing.ListCellRenderer;
+package org.apache.cayenne.modeler.dbadapter;
 
 import org.apache.cayenne.dba.JdbcAdapter;
 import org.apache.cayenne.dba.db2.DB2Adapter;
@@ -43,17 +34,19 @@ import org.apache.cayenne.dba.sqlite.SQLiteAdapter;
 import org.apache.cayenne.dba.sqlserver.SQLServerAdapter;
 import org.apache.cayenne.dba.sybase.SybaseAdapter;
 
-public final class DbAdapterInfo {
+import java.util.Collections;
+import java.util.Map;
+import java.util.TreeMap;
 
-    private static final Map<String, String> DEFAULT_ADAPTER_LABELS = new 
TreeMap<String, String>();
-    private static final String[] standardAdapters = new String[] { 
JdbcAdapter.class.getName(),
+public final class DbAdapters {
+
+    private static final Map<String, String> DEFAULT_ADAPTER_LABELS = new 
TreeMap<>();
+    private static final String[] STANDARD_ADAPTERS = new 
String[]{JdbcAdapter.class.getName(),
             MySQLAdapter.class.getName(), OracleAdapter.class.getName(), 
SybaseAdapter.class.getName(),
             PostgresAdapter.class.getName(), H2Adapter.class.getName(), 
HSQLDBAdapter.class.getName(),
             DB2Adapter.class.getName(), SQLServerAdapter.class.getName(), 
FrontBaseAdapter.class.getName(),
             FirebirdAdapter.class.getName(), DerbyAdapter.class.getName(),
-            IngresAdapter.class.getName(), SQLiteAdapter.class.getName() };
-
-    private static final Map<String, String> IMMUTABLE_LABELS = 
Collections.unmodifiableMap(DEFAULT_ADAPTER_LABELS);
+            IngresAdapter.class.getName(), SQLiteAdapter.class.getName()};
 
     static {
         DEFAULT_ADAPTER_LABELS.put(JdbcAdapter.class.getName(), "Generic JDBC 
Adapter");
@@ -72,38 +65,11 @@ public final class DbAdapterInfo {
         DEFAULT_ADAPTER_LABELS.put(SQLiteAdapter.class.getName(), "SQLite 
Adapter");
     }
 
-    public static Map getStandardAdapterLabels() {
-        return IMMUTABLE_LABELS;
+    public static Map<String, String> getStandardAdapterLabels() {
+        return Collections.unmodifiableMap(DEFAULT_ADAPTER_LABELS);
     }
 
-    public static ListCellRenderer getListRenderer() {
-        return new DbAdapterListRenderer(DEFAULT_ADAPTER_LABELS);
-    }
-
-    public static String[] getStandardAdapters() {
-        return standardAdapters;
-    }
-
-    static final class DbAdapterListRenderer extends DefaultListCellRenderer {
-
-        Map adapterLabels;
-
-        DbAdapterListRenderer(Map adapterLabels) {
-            this.adapterLabels = (adapterLabels != null) ? adapterLabels : 
Collections.EMPTY_MAP;
-        }
-
-        public Component getListCellRendererComponent(JList list, Object 
object, int index, boolean arg3, boolean arg4) {
-
-            if (object instanceof Class) {
-                object = ((Class<?>) object).getName();
-            }
-
-            Object label = adapterLabels.get(object);
-            if (label == null) {
-                label = object;
-            }
-
-            return super.getListCellRendererComponent(list, label, index, 
arg3, arg4);
-        }
+    public static String[] standardAdapters() {
+        return STANDARD_ADAPTERS;
     }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectComparators.java
similarity index 98%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectComparators.java
index d0038bdb0..0edaa66a8 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/Comparators.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectComparators.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.project;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
@@ -37,7 +37,7 @@ import java.util.Comparator;
 /**
  * A collection of useful Comparators used by the modeler.
  */
-public class Comparators {
+public class ProjectComparators {
 
     private static final Comparator<ConfigurationNode> dataDomainChildren = 
new DataDomainChildrenComparator();
     private static final Comparator<ConfigurationNode> dataMapChildren = new 
DataMapChildrenComparator();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
index e1c82ccbb..bd24f92dd 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/project/ProjectSession.java
@@ -41,7 +41,6 @@ import org.apache.cayenne.modeler.event.model.*;
 import org.apache.cayenne.modeler.service.action.GlobalActions;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.CallbackType;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.callbacks.ObjCallbackMethod;
-import org.apache.cayenne.modeler.util.Comparators;
 import org.apache.cayenne.project.ConfigurationNodeParentGetter;
 import org.apache.cayenne.project.Project;
 
@@ -139,8 +138,8 @@ public class ProjectSession {
              * would be set.
              */
             result.sort(parent instanceof DataMap
-                    ? Comparators.forDataMapChildren()
-                    : Comparators.forDataDomainChildren());
+                    ? ProjectComparators.forDataMapChildren()
+                    : ProjectComparators.forDataDomainChildren());
 
             return result;
         }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeFilter.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppTabbedPane.java
similarity index 62%
copy from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeFilter.java
copy to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppTabbedPane.java
index 6f25b1ef7..1b6af865f 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeFilter.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/AppTabbedPane.java
@@ -16,23 +16,18 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.util;
 
-import org.apache.cayenne.map.Attribute;
-import org.apache.cayenne.map.Relationship;
+package org.apache.cayenne.modeler.toolkit;
 
-/**
- * EntityTreeFilter is an interface for deciding which attributes or
- * relationships should appear in the tree
- */
-public interface EntityTreeFilter {
-    /**
-     * Checks if attribute should appear in the tree 
-     */
-    boolean attributeMatch(Object node, Attribute<?,?,?> attr);
-    
-    /**
-     * Checks if relationship should appear in the tree 
-     */
-    boolean relationshipMatch(Object node, Relationship<?,?,?> rel);
+import org.apache.cayenne.modeler.Application;
+
+import javax.swing.*;
+
+public abstract class AppTabbedPane extends JTabbedPane {
+
+    protected final Application app;
+
+    protected AppTabbedPane(Application app) {
+        this.app = app;
+    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/ProjectTabbedPane.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/ProjectTabbedPane.java
index 2156e72a2..60fb22a9c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/ProjectTabbedPane.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/ProjectTabbedPane.java
@@ -22,26 +22,21 @@ package org.apache.cayenne.modeler.toolkit;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.project.ProjectSession;
 
-import javax.swing.JTabbedPane;
-
 /**
  * Base for tabbed-pane containers in the modeler that need {@link 
ProjectSession} access
  * (selection state, model events, dirty flag) plus the {@link Application} 
reference.
  * Sibling of {@link ProjectPanel}, for editors whose root component is a 
{@code JTabbedPane}.
  */
-public abstract class ProjectTabbedPane extends JTabbedPane {
+public abstract class ProjectTabbedPane extends AppTabbedPane {
 
     protected final ProjectSession session;
 
     protected ProjectTabbedPane(ProjectSession session) {
+        super(session.app());
         this.session = session;
     }
 
     protected Application app() {
         return session.app();
     }
-
-    protected ProjectSession session() {
-        return session;
-    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/MultiColumnBrowser.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/columnview/ColumnViewPanel.java
similarity index 95%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/MultiColumnBrowser.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/columnview/ColumnViewPanel.java
index f2ebd7f0e..d118d3409 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/MultiColumnBrowser.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/columnview/ColumnViewPanel.java
@@ -17,8 +17,9 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.toolkit;
+package org.apache.cayenne.modeler.toolkit.columnview;
 
+import org.apache.cayenne.modeler.toolkit.Renderers;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 
 import javax.swing.*;
@@ -35,22 +36,9 @@ import java.util.ArrayList;
 import java.util.List;
 
 /**
- * A simple non-editable tree browser with multiple columns for display and
- * navigation of a tree structure. This type of browser is ideal for showing
- * deeply (or infinitely) nested trees/graphs. The most famous example of its
- * use is Mac OS X Finder column view.
- * 
- * <p>
- * MultiColumnBrowser starts at the root of the tree and automatically expands
- * to the right as navigation goes deeper. MultiColumnBrowser uses the same
- * TreeModel as a regular JTree for its navigation model.
- * </p>
- * 
- * <p>
- * Users are notified of selection changes via a TreeSelectionEvents.
- * </p>
+ * A tree browser in the style of macOS Finder "column view"
  */
-public class MultiColumnBrowser extends JPanel {
+public class ColumnViewPanel extends JPanel {
 
     protected static final ImageIcon rightArrow = 
IconFactory.buildIcon("icon-arrow-closed.png");
 
@@ -71,11 +59,11 @@ public class MultiColumnBrowser extends JPanel {
      */
     private boolean fireDisabled;
 
-    public MultiColumnBrowser() {
+    public ColumnViewPanel() {
         this(DEFAULT_MIN_COLUMNS_COUNT);
     }
 
-    public MultiColumnBrowser(int minColumns) {
+    public ColumnViewPanel(int minColumns) {
         if (minColumns < DEFAULT_MIN_COLUMNS_COUNT) {
             throw new IllegalArgumentException("Expected " + 
DEFAULT_MIN_COLUMNS_COUNT + " or more columns, got: "
                     + minColumns);
@@ -443,7 +431,7 @@ public class MultiColumnBrowser extends JPanel {
             this.children = (treeNode != null) ? model.getChildCount(treeNode) 
: 0;
 
             // must fire an event to refresh the view
-            super.fireContentsChanged(MultiColumnBrowser.this, 0, 
Math.max(oldChildren, children));
+            super.fireContentsChanged(ColumnViewPanel.this, 0, 
Math.max(oldChildren, children));
         }
 
         public Object getElementAt(int index) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/FileFilters.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/FileFilters.java
similarity index 52%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/FileFilters.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/FileFilters.java
index 1e3f3f3bd..903f0e4d0 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/FileFilters.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/filechooser/FileFilters.java
@@ -17,10 +17,10 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.toolkit.filechooser;
 
-import java.io.File;
 import javax.swing.filechooser.FileFilter;
+import java.io.File;
 
 /**
  * A collection of common file filters used by CayenneModeler JFileChoosers.
@@ -28,9 +28,6 @@ import javax.swing.filechooser.FileFilter;
 public class FileFilters {
 
     protected static final FileFilter applicationFilter = new 
ApplicationFileFilter();
-    protected static final FileFilter velotemplateFilter = new 
VelotemplateFileFilter();
-    protected static final FileFilter eomodelFilter = new EOModelFileFilter();
-    protected static final FileFilter eomodelSelectFilter = new 
EOModelSelectFilter();
     protected static final FileFilter dataMapFilter = new DataMapFileFilter();
 
     private static final String DATA_MAP_LOCATION_SUFFIX = ".map.xml";
@@ -49,35 +46,6 @@ public class FileFilters {
         return dataMapFilter;
     }
 
-    /**
-     * Returns a FileFilter used to select Velocity template files. Filters 
files with
-     * ".vm" extension.
-     */
-    public static FileFilter getVelotemplateFilter() {
-        return velotemplateFilter;
-    }
-
-    /**
-     * Returns a FileFilter used to filter EOModels. This filter will only 
display
-     * directories and index.eomodeld files.
-     */
-    public static FileFilter getEOModelFilter() {
-        return eomodelFilter;
-    }
-
-    /**
-     * Returns FileFilter that defines the rules for EOModel selection. This 
filter will
-     * only allow selection of the following files/directories:
-     * <ul>
-     * <li>Directories with name matching <code>*.eomodeld</code> that contain
-     * <code>index.eomodeld</code>.</li>
-     * <li><code>index.eomodeld</code> files contained within 
<code>*.eomodeld</code>
-     * directory.</li>
-     * </ul>
-     */
-    public static FileFilter getEOModelSelectFilter() {
-        return eomodelSelectFilter;
-    }
 
     /**
      * Returns filter that checks if file has specified extension
@@ -86,25 +54,6 @@ public class FileFilters {
         return new ExtensionFileFilter(ext, description);
     }
 
-    static final class VelotemplateFileFilter extends FileFilter {
-
-        /**
-         * Accepts all *.vm files.
-         */
-        public boolean accept(File f) {
-            if (f.isDirectory()) {
-                return true;
-            }
-
-            String name = f.getName();
-            return (name.endsWith(".vm") && !name.equals(".vm"));
-        }
-
-        public String getDescription() {
-            return "Velocity Templates (*.vm)";
-        }
-    }
-
     static final class ApplicationFileFilter extends FileFilter {
 
         /**
@@ -150,62 +99,6 @@ public class FileFilters {
         }
     }
 
-    static final class EOModelFileFilter extends FileFilter {
-
-        static final String EOM_SUFFIX = ".eomodeld";
-        static final String EOM_INDEX = "index" + EOM_SUFFIX;
-
-        /**
-         * Accepts all directories and <code>*.eomodeld/index.eomodeld</code> 
files.
-         */
-        public boolean accept(File f) {
-            if (f.isDirectory()) {
-                return true;
-            }
-
-            File parent = f.getParentFile();
-            return parent != null
-                    && parent.getName().endsWith(EOM_SUFFIX)
-                    && EOM_INDEX.equals(f.getName());
-        }
-
-        public String getDescription() {
-            return "*" + EOM_SUFFIX;
-        }
-    }
-
-    static final class EOModelSelectFilter extends FileFilter {
-
-        /**
-         * Accepts all directories and <code>*.eomodeld/index.eomodeld</code> 
files.
-         * 
-         * @see EOModelSelectFilter#accept(File)
-         */
-        public boolean accept(File f) {
-            if (f.isDirectory()) {
-                if (f.getName().endsWith(EOModelFileFilter.EOM_SUFFIX)
-                        && new File(f, EOModelFileFilter.EOM_INDEX).exists()) {
-
-                    return true;
-                }
-            }
-            else if (f.isFile()) {
-                File parent = f.getParentFile();
-                if (parent != null
-                        && 
parent.getName().endsWith(EOModelFileFilter.EOM_SUFFIX)
-                        && EOModelFileFilter.EOM_INDEX.equals(f.getName())) {
-                    return true;
-                }
-            }
-
-            return false;
-        }
-
-        public String getDescription() {
-            return "*" + EOModelFileFilter.EOM_SUFFIX;
-        }
-    }
-
     /**
      * filter that checks if file has specified extension
      */
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/icon/IconFactory.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/icon/IconFactory.java
index 167de98ee..2dd30b764 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/icon/IconFactory.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/icon/IconFactory.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.Relationship;
-import org.apache.cayenne.modeler.toolkit.ValueTypes;
+import org.apache.cayenne.modeler.toolkit.valuetype.ValueTypes;
 
 import javax.swing.*;
 import java.awt.*;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/text/LimitedTextField.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/text/LimitedTextField.java
deleted file mode 100644
index 8a1f31f0c..000000000
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/text/LimitedTextField.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*****************************************************************
- *   Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *    https://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing,
- *  software distributed under the License is distributed on an
- *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- *  KIND, either express or implied.  See the License for the
- *  specific language governing permissions and limitations
- *  under the License.
- ****************************************************************/
-package org.apache.cayenne.modeler.toolkit.text;
-
-import javax.swing.JTextField;
-import javax.swing.text.AttributeSet;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.PlainDocument;
-
-public class LimitedTextField extends JTextField {
-
-    public LimitedTextField(int limit) {
-        setDocument(new LimitedDocument(limit));
-    }
-
-    private static class LimitedDocument extends PlainDocument {
-
-        private final int limit;
-
-        LimitedDocument(int limit) {
-            this.limit = limit;
-        }
-
-        @Override
-        public void insertString(int offset, String str, AttributeSet attr) 
throws BadLocationException {
-            if (str == null) return;
-
-            if ((getLength() + str.length()) <= limit) {
-                super.insertString(offset, str, attr);
-            }
-        }
-    }
-}
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/text/LineNumberedBorder.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/text/LineNumberedBorder.java
index 37dc11741..ba89b4399 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/text/LineNumberedBorder.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/text/LineNumberedBorder.java
@@ -23,98 +23,98 @@ import javax.swing.border.AbstractBorder;
 import javax.swing.text.Document;
 import java.awt.*;
 
-public class LineNumberedBorder extends AbstractBorder {
-       private int etalon;
-       private int lineNumberWidth;
-       private CMTextPane pane;
-
-       public LineNumberedBorder(CMTextPane pane) {
-               setEtalon(10);
-               this.pane = pane;
-       }
-
-       public Insets getBorderInsets(Component c) {
-               return getBorderInsets(c, new Insets(0, 0, 0, 0));
-       }
-
-       public Insets getBorderInsets(Component c, Insets insets) {
-               if (c instanceof JTextPane) {
-                       int width = lineNumberWidth((JTextPane) c);
-                       insets.left = width;
-               }
-               return insets;
-       }
-
-       /**
-        * Returns the width, in pixels
-        */
-       private int lineNumberWidth(JTextPane textPane) {
-               int lineCount = getEtalon();
-               setLineNumberWidth(textPane.getFontMetrics(textPane.getFont())
-                               .stringWidth(lineCount + " "));
-               return getLineNumberWidth();
-       }
-
-       public void paintBorder(Component c, Graphics g, int x, int y, int 
width,
-                       int height) {
-
-               java.awt.Rectangle clip = g.getClipBounds();
-
-               FontMetrics fm = g.getFontMetrics();
-               int fontHeight = fm.getHeight();
-               int ybaseline = y + fm.getAscent();
-
-               int startingLineNumber = (clip.y / fontHeight) + 1;
-
-               if (ybaseline < clip.y) {
-                       ybaseline = y + startingLineNumber * fontHeight
-                                       - (fontHeight - fm.getAscent());
-               }
-
-
-               int yend = ybaseline + height;
-               if (yend > (y + height)) {
-                       yend = y + height;
-               }
-
-               int lnxstart = x;
-               int widhtBorder = getLineNumberWidth() - 2;
-
-               g.setColor(new Color(255, 255, 224));
-               g.fillRect(lnxstart, 0, lnxstart + widhtBorder, yend);
-               g.setColor(new Color(214, 214, 214));
-               g.drawRect(lnxstart - 1, -1, lnxstart + widhtBorder, yend + 1);
-
-               int end = pane.getEndPositionInDocument();
-               Document doc = pane.getDocument();
-               int endline = doc.getDefaultRootElement().getElementIndex(end) 
+ 1;
-                       
-               while (startingLineNumber <= endline) {
-                       g.setColor(Color.gray);
-                       g.drawString(startingLineNumber + " ", lnxstart + 1, 
ybaseline);
-                       ybaseline += fontHeight;
-                       startingLineNumber++;
-               }
-
-               setEtalon(startingLineNumber-1);
-       }
-
-       public int getEtalon() {
-               return etalon;
-       }
-
-       public void setEtalon(int etalon) {
-               if(etalon<10){
-                       etalon = 10;
-               }
-               this.etalon = etalon;
-       }
-
-       public int getLineNumberWidth() {
-               return lineNumberWidth;
-       }
-
-       public void setLineNumberWidth(int lineNumberWidth) {
-               this.lineNumberWidth = lineNumberWidth;
-       }
+class LineNumberedBorder extends AbstractBorder {
+    private int etalon;
+    private int lineNumberWidth;
+    private CMTextPane pane;
+
+    public LineNumberedBorder(CMTextPane pane) {
+        setEtalon(10);
+        this.pane = pane;
+    }
+
+    public Insets getBorderInsets(Component c) {
+        return getBorderInsets(c, new Insets(0, 0, 0, 0));
+    }
+
+    public Insets getBorderInsets(Component c, Insets insets) {
+        if (c instanceof JTextPane) {
+            int width = lineNumberWidth((JTextPane) c);
+            insets.left = width;
+        }
+        return insets;
+    }
+
+    /**
+     * Returns the width, in pixels
+     */
+    private int lineNumberWidth(JTextPane textPane) {
+        int lineCount = getEtalon();
+        setLineNumberWidth(textPane.getFontMetrics(textPane.getFont())
+                .stringWidth(lineCount + " "));
+        return getLineNumberWidth();
+    }
+
+    public void paintBorder(Component c, Graphics g, int x, int y, int width,
+                            int height) {
+
+        java.awt.Rectangle clip = g.getClipBounds();
+
+        FontMetrics fm = g.getFontMetrics();
+        int fontHeight = fm.getHeight();
+        int ybaseline = y + fm.getAscent();
+
+        int startingLineNumber = (clip.y / fontHeight) + 1;
+
+        if (ybaseline < clip.y) {
+            ybaseline = y + startingLineNumber * fontHeight
+                    - (fontHeight - fm.getAscent());
+        }
+
+
+        int yend = ybaseline + height;
+        if (yend > (y + height)) {
+            yend = y + height;
+        }
+
+        int lnxstart = x;
+        int widhtBorder = getLineNumberWidth() - 2;
+
+        g.setColor(new Color(255, 255, 224));
+        g.fillRect(lnxstart, 0, lnxstart + widhtBorder, yend);
+        g.setColor(new Color(214, 214, 214));
+        g.drawRect(lnxstart - 1, -1, lnxstart + widhtBorder, yend + 1);
+
+        int end = pane.getEndPositionInDocument();
+        Document doc = pane.getDocument();
+        int endline = doc.getDefaultRootElement().getElementIndex(end) + 1;
+
+        while (startingLineNumber <= endline) {
+            g.setColor(Color.gray);
+            g.drawString(startingLineNumber + " ", lnxstart + 1, ybaseline);
+            ybaseline += fontHeight;
+            startingLineNumber++;
+        }
+
+        setEtalon(startingLineNumber - 1);
+    }
+
+    public int getEtalon() {
+        return etalon;
+    }
+
+    public void setEtalon(int etalon) {
+        if (etalon < 10) {
+            etalon = 10;
+        }
+        this.etalon = etalon;
+    }
+
+    public int getLineNumberWidth() {
+        return lineNumberWidth;
+    }
+
+    public void setLineNumberWidth(int lineNumberWidth) {
+        this.lineNumberWidth = lineNumberWidth;
+    }
 }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeAttributeRelationshipFilter.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeAttributeRelationshipFilter.java
similarity index 97%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeAttributeRelationshipFilter.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeAttributeRelationshipFilter.java
index 315f2f280..00a75daf6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeAttributeRelationshipFilter.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeAttributeRelationshipFilter.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.toolkit.tree;
 
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DbRelationship;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeFilter.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeFilter.java
similarity index 96%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeFilter.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeFilter.java
index 6f25b1ef7..9c1a7de35 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeFilter.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeFilter.java
@@ -16,7 +16,7 @@
  *  specific language governing permissions and limitations
  *  under the License.
  ****************************************************************/
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.toolkit.tree;
 
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.Relationship;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeModel.java
similarity index 95%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeModel.java
index 69591d20b..c6504538b 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeModel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeModel.java
@@ -17,12 +17,13 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.toolkit.tree;
 
 import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 
 import javax.swing.event.TreeModelListener;
 import javax.swing.tree.TreeModel;
@@ -78,7 +79,7 @@ public class EntityTreeModel implements TreeModel {
 
         // wonder if linear search will be faster, considering that
         // this comparator uses reflection?
-        return Arrays.binarySearch(sortedChildren(node), 
(ConfigurationNode)child, Comparators.forNamedObjects());
+        return Arrays.binarySearch(sortedChildren(node), 
(ConfigurationNode)child, ProjectComparators.forNamedObjects());
     }
 
     public void addTreeModelListener(TreeModelListener listener) {
@@ -121,7 +122,7 @@ public class EntityTreeModel implements TreeModel {
 
             sortedForNode = nodes.toArray(new ConfigurationNode[0]);
 
-            Arrays.sort(sortedForNode, Comparators.forEntityChildren());
+            Arrays.sort(sortedForNode, ProjectComparators.forEntityChildren());
             sortedChildren.put(node, sortedForNode);
         }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeRelationshipFilter.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeRelationshipFilter.java
similarity index 97%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeRelationshipFilter.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeRelationshipFilter.java
index 988fcc44e..05db819d2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/EntityTreeRelationshipFilter.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/tree/EntityTreeRelationshipFilter.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.util;
+package org.apache.cayenne.modeler.toolkit.tree;
 
 import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DbRelationship;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/UrlOpener.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/url/UrlOpener.java
similarity index 98%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/UrlOpener.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/url/UrlOpener.java
index d66722e0e..0402ede3c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/UrlOpener.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/url/UrlOpener.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.toolkit;
+package org.apache.cayenne.modeler.toolkit.url;
 
 import org.apache.cayenne.modeler.service.os.OperatingSystem;
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/ValueTypes.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/valuetype/ValueTypes.java
similarity index 98%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/ValueTypes.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/valuetype/ValueTypes.java
index d74dc4072..d4fa61b64 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/ValueTypes.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/toolkit/valuetype/ValueTypes.java
@@ -17,7 +17,7 @@
  *  under the License.
  ****************************************************************/
 
-package org.apache.cayenne.modeler.toolkit;
+package org.apache.cayenne.modeler.toolkit.valuetype;
 
 import org.apache.cayenne.value.GeoJson;
 import org.apache.cayenne.value.Json;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
index dce638a09..626549255 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/MainFrame.java
@@ -39,7 +39,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.project.ProjectView;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.dbimport.DbImportResultDialog;
 import org.apache.cayenne.modeler.ui.welcome.WelcomeScreen;
-import org.apache.cayenne.modeler.util.FileFilters;
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.project.validation.ProjectValidator;
 import org.apache.cayenne.validation.ValidationFailure;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/about/AboutFrame.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/about/AboutFrame.java
index 560bf0e77..58ed06fcc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/about/AboutFrame.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/about/AboutFrame.java
@@ -25,18 +25,18 @@ import org.apache.cayenne.util.Util;
 
 import javax.swing.*;
 import java.awt.*;
+import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
-import java.awt.event.FocusListener;
+import java.awt.event.KeyAdapter;
 import java.awt.event.KeyEvent;
-import java.awt.event.KeyListener;
+import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
 import java.time.LocalDate;
 
 /**
  * Displays the Cayenne license and build information.
  */
-public class AboutFrame extends JFrame implements FocusListener, KeyListener, 
MouseListener {
+public class AboutFrame extends JFrame {
 
     private static final String ABOUT_STRING = "(c) 2001-%d Apache Software 
Foundation and individual authors.<br><br>https://cayenne.apache.org/<br>";
 
@@ -94,9 +94,26 @@ public class AboutFrame extends JFrame implements 
FocusListener, KeyListener, Mo
     }
 
     private void initBindings() {
-        addMouseListener(this);
-        addFocusListener(this);
-        addKeyListener(this);
+        addMouseListener(new MouseAdapter() {
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                dispose();
+            }
+        });
+
+        addFocusListener(new FocusAdapter() {
+            @Override
+            public void focusLost(FocusEvent e) {
+                dispose();
+            }
+        });
+
+        addKeyListener(new KeyAdapter() {
+            @Override
+            public void keyPressed(KeyEvent e) {
+                dispose();
+            }
+        });
     }
 
     private static String getInfoString() {
@@ -131,37 +148,4 @@ public class AboutFrame extends JFrame implements 
FocusListener, KeyListener, Mo
 
         return infoString;
     }
-
-    public void keyPressed(KeyEvent e) {
-        dispose();
-    }
-
-    public void focusLost(FocusEvent e) {
-        dispose();
-    }
-
-    public void focusGained(FocusEvent e) {
-    }
-
-    public void keyReleased(KeyEvent e) {
-    }
-
-    public void keyTyped(KeyEvent e) {
-    }
-
-    public void mouseClicked(MouseEvent e) {
-        dispose();
-    }
-
-    public void mouseEntered(MouseEvent e) {
-    }
-
-    public void mouseExited(MouseEvent e) {
-    }
-
-    public void mousePressed(MouseEvent e) {
-    }
-
-    public void mouseReleased(MouseEvent e) {
-    }
 }
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 79da844cc..df5187aeb 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
@@ -23,7 +23,7 @@ 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.modeler.toolkit.url.UrlOpener;
 import org.apache.cayenne.util.LocalizedStringsHandler;
 
 public class DocumentationAction extends AppAction {
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 17eaa814b..bde0e983d 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
@@ -28,7 +28,7 @@ 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.modeler.toolkit.filechooser.FileFilters;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.URLResource;
 import org.slf4j.Logger;
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 acf091316..eec84b13e 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
@@ -44,18 +44,17 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
-import org.apache.cayenne.modeler.event.model.DbEntityEvent;
 import org.apache.cayenne.modeler.Application;
 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.DbEntityEvent;
+import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.event.model.QueryEvent;
+import org.apache.cayenne.modeler.project.ProjectSession;
 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;
-import org.apache.cayenne.modeler.util.FileFilters;
 import org.apache.cayenne.wocompat.EOModelProcessor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -336,15 +335,18 @@ public class ImportEOModelAction extends AppAction {
      */
     static class EOModelChooser extends JFileChooser {
 
+        private static final FileFilter eomodelFilter = new 
EOModelFileFilter();
+        private static final FileFilter eomodelSelectFilter = new 
EOModelSelectFilter();
+
         protected FileFilter selectFilter;
         protected JDialog cachedDialog;
 
+
         public EOModelChooser(String title) {
-            super.setFileFilter(FileFilters.getEOModelFilter());
+            super.setFileFilter(eomodelFilter);
             super.setDialogTitle(title);
             super.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
-
-            this.selectFilter = FileFilters.getEOModelSelectFilter();
+            this.selectFilter = eomodelSelectFilter;
         }
 
         public int showOpenDialog(Component parent) {
@@ -376,4 +378,60 @@ public class ImportEOModelAction extends AppAction {
             return cachedDialog;
         }
     }
+
+    static final class EOModelFileFilter extends FileFilter {
+
+        static final String EOM_SUFFIX = ".eomodeld";
+        static final String EOM_INDEX = "index" + EOM_SUFFIX;
+
+        /**
+         * Accepts all directories and <code>*.eomodeld/index.eomodeld</code> 
files.
+         */
+        public boolean accept(File f) {
+            if (f.isDirectory()) {
+                return true;
+            }
+
+            File parent = f.getParentFile();
+            return parent != null
+                    && parent.getName().endsWith(EOM_SUFFIX)
+                    && EOM_INDEX.equals(f.getName());
+        }
+
+        public String getDescription() {
+            return "*" + EOM_SUFFIX;
+        }
+    }
+
+    static final class EOModelSelectFilter extends FileFilter {
+
+        /**
+         * Accepts all directories and <code>*.eomodeld/index.eomodeld</code> 
files.
+         *
+         * @see EOModelSelectFilter#accept(File)
+         */
+        public boolean accept(File f) {
+            if (f.isDirectory()) {
+                if (f.getName().endsWith(EOModelFileFilter.EOM_SUFFIX)
+                        && new File(f, EOModelFileFilter.EOM_INDEX).exists()) {
+
+                    return true;
+                }
+            }
+            else if (f.isFile()) {
+                File parent = f.getParentFile();
+                if (parent != null
+                        && 
parent.getName().endsWith(EOModelFileFilter.EOM_SUFFIX)
+                        && EOModelFileFilter.EOM_INDEX.equals(f.getName())) {
+                    return true;
+                }
+            }
+
+            return false;
+        }
+
+        public String getDescription() {
+            return "*" + EOModelFileFilter.EOM_SUFFIX;
+        }
+    }
 }
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 66715fd8f..b02d14dd0 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
@@ -24,7 +24,7 @@ import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.pref.RecentProjectsPrefs;
 import org.apache.cayenne.modeler.ui.project.overwrite.OverwriteDialog;
-import org.apache.cayenne.modeler.util.FileFilters;
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 import org.apache.cayenne.project.Project;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
index c713af586..9c441f862 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsDialog.java
@@ -30,7 +30,7 @@ import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit;
 import org.apache.cayenne.modeler.undo.InferRelationshipsUndoableEdit;
-import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
+import org.apache.cayenne.modeler.NameGeneratorPreferences;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -62,8 +62,6 @@ public class InferRelationshipsDialog extends ProjectDialog {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(InferRelationshipsDialog.class);
     public static final String SELECTED_PROPERTY = "selected";
-    public static final int SELECT = 1;
-    public static final int CANCEL = 0;
 
     private final DataMap dataMap;
     private final List<InferredRelationship> inferredRelationships = new 
ArrayList<>();
@@ -79,9 +77,6 @@ public class InferRelationshipsDialog extends ProjectDialog {
     private ObjectNameGenerator strategy;
     private PropertyChangeSupport propertyChangeSupport;
 
-    @SuppressWarnings("unused")
-    private int choice = CANCEL;
-
     public InferRelationshipsDialog(ProjectSession session, Window owner, 
DataMap dataMap) {
         super(session, owner, "Infer Relationships", 
ModalityType.APPLICATION_MODAL);
         this.dataMap = dataMap;
@@ -367,7 +362,6 @@ public class InferRelationshipsDialog extends ProjectDialog 
{
 
         createNames();
         entitySelector.initBindings();
-        choice = SELECT;
     }
 
     private void generateAction() {
@@ -376,8 +370,7 @@ public class InferRelationshipsDialog extends ProjectDialog 
{
         for (InferredRelationship temp : selectedEntities) {
             DbRelationship rel = new 
DbRelationship(uniqueRelName(temp.getSource(), temp.getName()));
 
-            DbRelationshipEvent e = DbRelationshipEvent.ofAdd(
-                    app.getFrame(), rel, temp.getSource());
+            DbRelationshipEvent e = DbRelationshipEvent.ofAdd(app.getFrame(), 
rel, temp.getSource());
             session.fireDbRelationshipEvent(e);
 
             rel.setSourceEntity(temp.getSource());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsPanel.java
index 69d7baab9..d08bea5b2 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/autorelationship/InferRelationshipsPanel.java
@@ -29,9 +29,6 @@ public class InferRelationshipsPanel extends JPanel {
 
     public InferRelationshipsPanel() {
         this.table = new JTable();
-
-        // TODO: andrus 04/07/2006 - is there an easy way to stick that 
checkbox in the
-        // table header????
         this.checkAll = new JCheckBox();
         this.checkAllLabel = new JLabel("Check All DBRelationships");
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
index c107deb5a..62c724eb4 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/dbgen/DBGeneratorOptionsDialog.java
@@ -33,7 +33,7 @@ import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.ui.datasource.DataSourceDialog;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.validation.ValidationDialog;
-import org.apache.cayenne.modeler.util.DbAdapterInfo;
+import org.apache.cayenne.modeler.dbadapter.DbAdapters;
 import org.apache.cayenne.validation.ValidationResult;
 
 import javax.swing.Box;
@@ -128,7 +128,7 @@ public class DBGeneratorOptionsDialog extends ProjectDialog 
{
         this.tabs = new JTabbedPane(SwingConstants.TOP);
         this.adapters = new JComboBox<>();
         this.adapters.setEditable(true);
-        this.adapters.setModel(new 
DefaultComboBoxModel<>(DbAdapterInfo.getStandardAdapters()));
+        this.adapters.setModel(new 
DefaultComboBoxModel<>(DbAdapters.standardAdapters()));
         this.adapters.setSelectedIndex(0);
 
         this.sqlPreview = new JTextArea();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
index 793784de4..7df14e555 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/entitysync/EntitySyncDialog.java
@@ -31,7 +31,7 @@ import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.toolkit.AppDialog;
-import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
+import org.apache.cayenne.modeler.NameGeneratorPreferences;
 
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
index 79c9ec311..c2572e095 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/errors/ErrorDialog.java
@@ -21,7 +21,7 @@
 package org.apache.cayenne.modeler.ui.errors;
 
 import org.apache.cayenne.modeler.Application;
-import org.apache.cayenne.modeler.toolkit.UrlOpener;
+import org.apache.cayenne.modeler.toolkit.url.UrlOpener;
 import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel;
 import org.apache.cayenne.modeler.toolkit.AppDialog;
 import org.apache.cayenne.util.LocalizedStringsHandler;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
index d690cdb56..3d7bcb5db 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/classpath/ClasspathPrefsPanel.java
@@ -29,7 +29,7 @@ import 
org.apache.cayenne.modeler.toolkit.filechooser.CMFileChooserPrefs;
 import org.apache.cayenne.modeler.toolkit.table.CMTable;
 import org.apache.cayenne.modeler.toolkit.AppPanel;
 import 
org.apache.cayenne.modeler.ui.preferences.classpath.maven.MavenDependencyDialog;
-import org.apache.cayenne.modeler.util.FileFilters;
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 
 import javax.swing.BorderFactory;
 import javax.swing.JButton;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/DBConnectorEditor.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/DBConnectorEditor.java
index bdc1c8910..f7d7b9728 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/DBConnectorEditor.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/DBConnectorEditor.java
@@ -24,7 +24,7 @@ import com.jgoodies.forms.layout.FormLayout;
 import org.apache.cayenne.modeler.dbconnector.DBConnector;
 import org.apache.cayenne.modeler.toolkit.text.CMPasswordField;
 import org.apache.cayenne.modeler.toolkit.text.CMTextField;
-import org.apache.cayenne.modeler.util.DbAdapterInfo;
+import org.apache.cayenne.modeler.dbadapter.DbAdapters;
 
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JComboBox;
@@ -62,7 +62,7 @@ public class DBConnectorEditor extends JPanel {
         this.labels = new ArrayList<>();
 
         adapters.setEditable(true);
-        adapters.setModel(new 
DefaultComboBoxModel<>(DbAdapterInfo.getStandardAdapters()));
+        adapters.setModel(new 
DefaultComboBoxModel<>(DbAdapters.standardAdapters()));
         adapters.setSelectedIndex(0);
 
         initLayout();
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/creator/DBConnectorCreatorDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/creator/DBConnectorCreatorDialog.java
index 538b406e1..8aa13a172 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/creator/DBConnectorCreatorDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/preferences/dbconnector/creator/DBConnectorCreatorDialog.java
@@ -25,7 +25,7 @@ import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dbconnector.DBConnector;
 import org.apache.cayenne.modeler.toolkit.AppDialog;
 import 
org.apache.cayenne.modeler.ui.preferences.dbconnector.DBConnectorPrefsPanel;
-import org.apache.cayenne.modeler.util.DbAdapterInfo;
+import org.apache.cayenne.modeler.dbadapter.DbAdapters;
 
 import javax.swing.DefaultComboBoxModel;
 import javax.swing.JButton;
@@ -66,7 +66,7 @@ public class DBConnectorCreatorDialog extends AppDialog {
 
         this.connectorName = new JTextField(suggestName());
 
-        DefaultComboBoxModel<String> model = new 
DefaultComboBoxModel<>(DbAdapterInfo.getStandardAdapters());
+        DefaultComboBoxModel<String> model = new 
DefaultComboBoxModel<>(DbAdapters.standardAdapters());
         model.insertElementAt(NO_ADAPTER, 0);
         this.adapters = new JComboBox<>(model);
         this.adapters.setSelectedIndex(0);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
index 408169224..4cc349487 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datadomain/DataDomainView.java
@@ -57,7 +57,7 @@ public class DataDomainView extends ProjectTabbedPane {
 
     private void initLayout() {
         setTabPlacement(JTabbedPane.TOP);
-        addTab("Main", new JScrollPane(new DataDomainMainView(session())));
+        addTab("Main", new JScrollPane(new DataDomainMainView(session)));
         addTab("Db Import", dbImportView);
         addTab("Class Generation", cgenView);
         addTab("Graph", graphTab);
@@ -66,9 +66,9 @@ public class DataDomainView extends ProjectTabbedPane {
 
     private void initBindings() {
         addChangeListener(this::stateChanged);
-        session().addDomainDisplayListener(this::currentDomainChanged);
-        session().addObjEntityDisplayListener(this::onEntitySelected);
-        session().addDbEntityDisplayListener(this::onEntitySelected);
+        session.addDomainDisplayListener(this::currentDomainChanged);
+        session.addObjEntityDisplayListener(this::onEntitySelected);
+        session.addDbEntityDisplayListener(this::onEntitySelected);
     }
 
     private void onEntitySelected(ObjEntityDisplayEvent e) {
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 ada688a76..9fcae2bea 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
@@ -22,7 +22,7 @@ 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.ui.project.editor.datadomain.graph.DataDomainGraphTab;
-import org.apache.cayenne.modeler.util.FileFilters;
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 import org.jgraph.JGraph;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/DataMapView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/DataMapView.java
index e87cf3ad1..fc21c1b4a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/DataMapView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/DataMapView.java
@@ -38,13 +38,13 @@ public class DataMapView extends ProjectTabbedPane {
 
     private void initLayout() {
         setTabPlacement(JTabbedPane.TOP);
-        addTab("DataMap", new JScrollPane(new DataMapMainView(session())));
-        addTab("DB Import", new JScrollPane(new DbImportView(session())));
+        addTab("DataMap", new JScrollPane(new DataMapMainView(session)));
+        addTab("DB Import", new JScrollPane(new DbImportView(session)));
         addTab("Class Generation", new JScrollPane(new CgenPanel(session)));
     }
 
     private void initBindings() {
-        session().addDataMapDisplayListener(this::currentDataMapChanged);
+        session.addDataMapDisplayListener(this::currentDataMapChanged);
     }
 
     private void currentDataMapChanged(DataMapDisplayEvent e) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
index 3d148fe4a..08747306a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/dbimport/ReverseEngineeringConfigPanel.java
@@ -28,7 +28,7 @@ import 
org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
 import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
 import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.util.NameGeneratorPreferences;
+import org.apache.cayenne.modeler.NameGeneratorPreferences;
 
 import javax.swing.*;
 import java.awt.*;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
index 396ba2b54..48f8ff414 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/DataMapMainView.java
@@ -39,7 +39,7 @@ import 
org.apache.cayenne.modeler.ui.project.editor.datamap.main.locking.Locking
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.main.pkg.PackageUpdateDialog;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.main.schema.SchemaUpdateDialog;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.main.superclass.SuperclassUpdateDialog;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
@@ -165,7 +165,7 @@ public class DataMapMainView extends ProjectPanel {
 
         // now add the entities
         if (nodes.length > 0) {
-            Arrays.sort(nodes, Comparators.forNamedObjects());
+            Arrays.sort(nodes, ProjectComparators.forNamedObjects());
             System.arraycopy(nodes, 0, objects, 1, nodes.length);
         }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateDialog.java
index 78d98c5fb..ea27d3810 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/datamap/main/superclass/SuperclassUpdateDialog.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import 
org.apache.cayenne.modeler.ui.project.editor.datamap.defaults.DefaultsUpdateDialog;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.util.Util;
 
 import java.awt.Window;
@@ -43,7 +43,7 @@ public class SuperclassUpdateDialog extends 
DefaultsUpdateDialog {
         String defaultSuperclass = dataMap.getDefaultSuperclass();
 
         dataMap.getObjEntities().stream()
-                .sorted(Comparators.forDataMapChildren()).forEach(entity -> {
+                
.sorted(ProjectComparators.forDataMapChildren()).forEach(entity -> {
                     if (doAll || 
Util.isEmptyString(entity.getSuperClassName())) {
                         if (!Util.nullSafeEquals(defaultSuperclass, 
entity.getSuperClassName())) {
                             entity.setSuperClassName(defaultSuperclass);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
index f831f462e..d595eb366 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/DbEntityView.java
@@ -60,14 +60,14 @@ public class DbEntityView extends ProjectTabbedPane {
     }
 
     private void initBindings() {
-        session().addDbEntityDisplayListener(this::currentDbEntityChanged);
-        
session().addDbAttributeDisplayListener(this::currentDbAttributeChanged);
-        
session().addDbRelationshipDisplayListener(this::currentDbRelationshipChanged);
+        session.addDbEntityDisplayListener(this::currentDbEntityChanged);
+        session.addDbAttributeDisplayListener(this::currentDbAttributeChanged);
+        
session.addDbRelationshipDisplayListener(this::currentDbRelationshipChanged);
         addChangeListener(this::stateChanged);
     }
 
     private void resetRemoveButtons() {
-        GlobalActions globalActions = app().getActionManager();
+        GlobalActions globalActions = app.getActionManager();
 
         globalActions.getAction(RemoveAttributeAction.class).setEnabled(false);
         
globalActions.getAction(RemoveRelationshipAction.class).setEnabled(false);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
index 441f421f8..955b05b85 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/dbentity/properties/DbAttributePanel.java
@@ -21,27 +21,25 @@ package 
org.apache.cayenne.modeler.ui.project.editor.dbentity.properties;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.modeler.event.display.DbAttributeDisplayEvent;
+import org.apache.cayenne.modeler.event.display.DbEntityDisplayEvent;
+import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
+import org.apache.cayenne.modeler.event.display.TablePopupHandler;
 import org.apache.cayenne.modeler.event.model.DbAttributeEvent;
 import org.apache.cayenne.modeler.event.model.DbAttributeListener;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.service.action.GlobalActions;
+import org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
+import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
+import org.apache.cayenne.modeler.toolkit.table.BoardTableCellRenderer;
+import org.apache.cayenne.modeler.toolkit.table.CMComboBoxCellEditor;
+import org.apache.cayenne.modeler.toolkit.table.CMTable;
+import org.apache.cayenne.modeler.toolkit.table.CMTablePanel;
+import org.apache.cayenne.modeler.toolkit.table.CMTablePrefs;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.CutAttributeRelationshipAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
 import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
-import org.apache.cayenne.modeler.event.display.DbAttributeDisplayEvent;
-import org.apache.cayenne.modeler.event.display.DbEntityDisplayEvent;
-import org.apache.cayenne.modeler.event.display.DbEntityDisplayListener;
-import org.apache.cayenne.modeler.event.display.TablePopupHandler;
-import org.apache.cayenne.modeler.toolkit.table.CMTablePrefs;
-import org.apache.cayenne.modeler.toolkit.table.BoardTableCellRenderer;
-import org.apache.cayenne.modeler.toolkit.table.CMTable;
-import org.apache.cayenne.modeler.toolkit.table.CMTablePanel;
-import org.apache.cayenne.modeler.toolkit.table.CMTextFieldCellEditor;
-import org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
-import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
-import org.apache.cayenne.modeler.toolkit.table.CMComboBoxCellEditor;
-import org.apache.cayenne.modeler.toolkit.text.LimitedTextField;
 
 import javax.swing.*;
 import javax.swing.event.ListSelectionEvent;
@@ -178,7 +176,7 @@ public class DbAttributePanel extends JPanel implements 
DbEntityDisplayListener,
 
         String[] types = TypesMapping.getDatabaseTypes();
         Arrays.sort(types);
-        JComboBox comboBox = new CMComboBox<>(types);
+        JComboBox<String> comboBox = new CMComboBox<>(types);
 
         // Types.NULL makes no sense as a column type
         comboBox.removeItem("NULL");
@@ -187,12 +185,6 @@ public class DbAttributePanel extends JPanel implements 
DbEntityDisplayListener,
         TableColumn typeColumn = 
table.getColumnModel().getColumn(DbAttributeTableModel.DB_ATTRIBUTE_TYPE);
         typeColumn.setCellEditor(new CMComboBoxCellEditor(comboBox));
 
-        TableColumn lengthColumn = 
table.getColumnModel().getColumn(DbAttributeTableModel.DB_ATTRIBUTE_MAX);
-        lengthColumn.setCellEditor(new CMTextFieldCellEditor(new 
LimitedTextField(10)));
-
-        TableColumn scaleColumn = 
table.getColumnModel().getColumn(DbAttributeTableModel.DB_ATTRIBUTE_SCALE);
-        scaleColumn.setCellEditor(new CMTextFieldCellEditor(new 
LimitedTextField(10)));
-
         CMTablePrefs.of(session.app().getPreferencesRepository(), 
"dbEntity/attributeTable")
                 .bind(table, null, DbAttributeTableModel.DB_ATTRIBUTE_NAME);
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
index 1ad6462df..efb0eacfc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/EmbeddableView.java
@@ -56,8 +56,8 @@ public class EmbeddableView extends ProjectTabbedPane {
     }
 
     private void initBindings() {
-        
session().addEmbeddableAttributeDisplayListener(this::currentEmbeddableAttributeChanged);
-        session().addEmbeddableDisplayListener(this::currentEmbeddableChanged);
+        
session.addEmbeddableAttributeDisplayListener(this::currentEmbeddableAttributeChanged);
+        session.addEmbeddableDisplayListener(this::currentEmbeddableChanged);
         addChangeListener(this::stateChanged);
     }
 
@@ -74,7 +74,7 @@ public class EmbeddableView extends ProjectTabbedPane {
     }
 
     private void resetRemoveButtons() {
-        GlobalActions globalActions = app().getActionManager();
+        GlobalActions globalActions = app.getActionManager();
 
         globalActions.getAction(RemoveAttributeAction.class).setEnabled(false);
         
globalActions.getAction(RemoveCallbackMethodAction.class).setEnabled(false);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
index 073e0163b..2b1d832c5 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/attributes/EmbeddableAttributesView.java
@@ -31,7 +31,7 @@ import 
org.apache.cayenne.modeler.event.model.EmbeddableAttributeListener;
 import org.apache.cayenne.modeler.event.model.EmbeddableEvent;
 import org.apache.cayenne.modeler.event.model.EmbeddableListener;
 import org.apache.cayenne.modeler.service.action.GlobalActions;
-import org.apache.cayenne.modeler.toolkit.ValueTypes;
+import org.apache.cayenne.modeler.toolkit.valuetype.ValueTypes;
 import org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
 import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
 import org.apache.cayenne.modeler.toolkit.table.CMComboBoxCellEditor;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
index cb094f25a..a87aaf59e 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/embeddable/main/EmbeddableMainView.java
@@ -34,7 +34,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayEvent;
 import org.apache.cayenne.modeler.event.display.EmbeddableDisplayListener;
 import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
@@ -137,7 +137,7 @@ public class EmbeddableMainView extends ProjectPanel 
implements EmbeddableDispla
             while (it.hasNext()) {
                 DataMap dataMap = (DataMap) it.next();
                 Iterator<ObjEntity> ent = dataMap.getObjEntities().stream()
-                        .sorted(Comparators.forDataMapChildren())
+                        .sorted(ProjectComparators.forDataMapChildren())
                         .iterator();
 
                 while (ent.hasNext()) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
index 9740ed6f0..9b46b7353 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/ObjEntityView.java
@@ -66,9 +66,9 @@ public class ObjEntityView extends ProjectTabbedPane {
     }
 
     private void initBindings() {
-        session().addObjEntityDisplayListener(this::currentObjEntityChanged);
-        
session().addObjAttributeDisplayListener(this::currentObjAttributeChanged);
-        
session().addObjRelationshipDisplayListener(this::currentObjRelationshipChanged);
+        session.addObjEntityDisplayListener(this::currentObjEntityChanged);
+        
session.addObjAttributeDisplayListener(this::currentObjAttributeChanged);
+        
session.addObjRelationshipDisplayListener(this::currentObjRelationshipChanged);
         addChangeListener(this::stateChanged);
     }
 
@@ -88,7 +88,7 @@ public class ObjEntityView extends ProjectTabbedPane {
     }
 
     private void resetRemoveButtons() {
-        GlobalActions globalActions = app().getActionManager();
+        GlobalActions globalActions = app.getActionManager();
 
         globalActions.getAction(RemoveAttributeAction.class).setEnabled(false);
         
globalActions.getAction(RemoveRelationshipAction.class).setEnabled(false);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
index d7725a1f6..b11d8acab 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributeInfoDialog.java
@@ -35,8 +35,8 @@ import 
org.apache.cayenne.modeler.event.display.ObjAttributeDisplayEvent;
 import org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
 import org.apache.cayenne.modeler.event.model.ObjAttributeEvent;
 import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
-import org.apache.cayenne.modeler.toolkit.MultiColumnBrowser;
-import org.apache.cayenne.modeler.toolkit.ValueTypes;
+import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel;
+import org.apache.cayenne.modeler.toolkit.valuetype.ValueTypes;
 import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel;
 import org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
 import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
@@ -45,8 +45,8 @@ import org.apache.cayenne.modeler.toolkit.table.CMTablePrefs;
 import org.apache.cayenne.modeler.toolkit.ProjectDialog;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.properties.ObjAttributeTableModel;
-import org.apache.cayenne.modeler.util.EntityTreeAttributeRelationshipFilter;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
+import 
org.apache.cayenne.modeler.toolkit.tree.EntityTreeAttributeRelationshipFilter;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.CayenneMapEntry;
 
@@ -114,7 +114,7 @@ public class ObjAttributeInfoDialog extends ProjectDialog 
implements TreeSelecti
     private final JCheckBox usedForLockingCheckBox;
     private final JCheckBox lazyCheckBox;
     private final JTextField commentField;
-    private final MultiColumnBrowser pathBrowser;
+    private final ColumnViewPanel pathBrowser;
 
     private final Map<String, Embeddable> stringToEmbeddables = new 
HashMap<>();
     private final List<String> embeddableNames = new ArrayList<>();
@@ -147,7 +147,7 @@ public class ObjAttributeInfoDialog extends ProjectDialog 
implements TreeSelecti
         this.commentField = new JTextField();
         this.overrideAttributeTable = new CMTable();
 
-        this.pathBrowser = new ObjAttributePathBrowser(selectPathButton, 
saveButton);
+        this.pathBrowser = new 
ObjAttributePathNavigatorPanel(selectPathButton, saveButton);
         this.pathBrowser.setPreferredColumnSize(BROWSER_CELL_DIM);
         this.pathBrowser.setDefaultRenderer();
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributePathBrowser.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributePathNavigatorPanel.java
similarity index 93%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributePathBrowser.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributePathNavigatorPanel.java
index a853e4b49..21782e307 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributePathBrowser.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/attrinfo/ObjAttributePathNavigatorPanel.java
@@ -18,7 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.project.editor.objentity.attrinfo;
 
-import 
org.apache.cayenne.modeler.ui.project.editor.objentity.relinfo.ObjRelationshipPathBrowser;
+import 
org.apache.cayenne.modeler.ui.project.editor.objentity.relinfo.ObjRelationshipPathNavigatorPanel;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbRelationship;
 
@@ -27,12 +27,12 @@ import javax.swing.tree.TreePath;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
-public class ObjAttributePathBrowser extends ObjRelationshipPathBrowser {
+public class ObjAttributePathNavigatorPanel extends 
ObjRelationshipPathNavigatorPanel {
 
     private final JButton selectPathButton;
     private final JButton doneButton;
 
-    public ObjAttributePathBrowser(JButton selectPathButton, JButton 
doneButton) {
+    public ObjAttributePathNavigatorPanel(JButton selectPathButton, JButton 
doneButton) {
         this.selectPathButton = selectPathButton;
         this.doneButton = doneButton;
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
index 1df9bd33f..a658b3920 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/main/ObjEntityMainView.java
@@ -48,7 +48,7 @@ import 
org.apache.cayenne.modeler.ui.project.editor.datadomain.graph.action.Show
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.classname.ClassNameUpdaterController;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.duplicates.DuplicatedAttributesDialog;
 import 
org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.Util;
 import org.apache.cayenne.validation.ValidationException;
@@ -281,7 +281,7 @@ public class ObjEntityMainView extends ProjectPanel 
implements ObjEntityDisplayL
         EntityResolver resolver = session.entityResolver();
         DataMap map = session.getSelectedDataMap();
         DbEntity[] dbEntities = resolver.getDbEntities().toArray(new 
DbEntity[0]);
-        Arrays.sort(dbEntities, Comparators.forDataMapChildren());
+        Arrays.sort(dbEntities, ProjectComparators.forDataMapChildren());
 
         DefaultComboBoxModel<DbEntity> dbModel = new 
DefaultComboBoxModel<>(dbEntities);
         dbModel.setSelectedItem(entity.getDbEntity());
@@ -297,7 +297,7 @@ public class ObjEntityMainView extends ProjectPanel 
implements ObjEntityDisplayL
         // do not show this entity or any of the subentities
         List<ObjEntity> objEntities = map.getObjEntities().stream()
                 .filter(object -> entity != object && 
!object.isSubentityOf(entity))
-                .sorted(Comparators.forDataMapChildren())
+                .sorted(ProjectComparators.forDataMapChildren())
                 .collect(Collectors.toList());
         objEntities.add(0, NO_INHERITANCE);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbAttributePathComboBoxEditor.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbAttributePathComboBoxEditor.java
index 3768e398a..4f6e817df 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbAttributePathComboBoxEditor.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbAttributePathComboBoxEditor.java
@@ -27,8 +27,8 @@ import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.toolkit.Renderers;
-import org.apache.cayenne.modeler.util.EntityTreeAttributeRelationshipFilter;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
+import 
org.apache.cayenne.modeler.toolkit.tree.EntityTreeAttributeRelationshipFilter;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbRelationshipPathComboBoxEditor.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbRelationshipPathComboBoxEditor.java
index 5fa3f4741..9969f61bc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbRelationshipPathComboBoxEditor.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/DbRelationshipPathComboBoxEditor.java
@@ -24,8 +24,8 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.toolkit.Renderers;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
-import org.apache.cayenne.modeler.util.EntityTreeRelationshipFilter;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeRelationshipFilter;
 
 import javax.swing.*;
 import javax.swing.text.JTextComponent;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
index 7b8cbcebe..b054c4e04 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributePanel.java
@@ -50,7 +50,7 @@ import org.apache.cayenne.modeler.ui.action.PasteAction;
 import org.apache.cayenne.modeler.ui.action.RemoveAttributeRelationshipAction;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import 
org.apache.cayenne.modeler.ui.project.editor.objentity.attrinfo.ObjAttributeInfoDialog;
-import org.apache.cayenne.modeler.toolkit.ValueTypes;
+import org.apache.cayenne.modeler.toolkit.valuetype.ValueTypes;
 
 import javax.swing.*;
 import javax.swing.event.ListSelectionEvent;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
index f4491807c..2e9a80894 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/ObjAttributeTableModel.java
@@ -35,7 +35,7 @@ import 
org.apache.cayenne.modeler.event.display.ObjEntityDisplayEvent;
 import org.apache.cayenne.modeler.event.model.ObjAttributeEvent;
 import org.apache.cayenne.modeler.event.model.ObjEntityEvent;
 import org.apache.cayenne.modeler.project.DbEntityOps;
-import org.apache.cayenne.modeler.toolkit.ValueTypes;
+import org.apache.cayenne.modeler.toolkit.valuetype.ValueTypes;
 import org.apache.cayenne.modeler.toolkit.table.CMTableModel;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/PathChooserComboBoxCellEditor.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/PathChooserComboBoxCellEditor.java
index b118311b8..6c35728de 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/PathChooserComboBoxCellEditor.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/properties/PathChooserComboBoxCellEditor.java
@@ -29,7 +29,7 @@ import 
org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
 import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 import org.apache.cayenne.modeler.toolkit.table.CMTableModel;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
 import org.apache.cayenne.util.Util;
 
 import javax.swing.*;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
index e31d6da9f..094dc6c12 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipInfoDialog.java
@@ -32,7 +32,7 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.modeler.event.display.ObjRelationshipDisplayEvent;
 import org.apache.cayenne.modeler.event.model.ObjRelationshipEvent;
-import org.apache.cayenne.modeler.toolkit.MultiColumnBrowser;
+import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel;
 import org.apache.cayenne.modeler.toolkit.buttons.CMButtonPanel;
 import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
 import org.apache.cayenne.modeler.toolkit.ProjectDialog;
@@ -40,9 +40,9 @@ import 
org.apache.cayenne.modeler.ui.dbrelationship.DbRelationshipDialog;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.undo.CreateRelationshipUndoableEdit;
 import org.apache.cayenne.modeler.undo.RelationshipUndoableEdit;
-import org.apache.cayenne.modeler.util.Comparators;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
-import org.apache.cayenne.modeler.util.EntityTreeRelationshipFilter;
+import org.apache.cayenne.modeler.project.ProjectComparators;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeRelationshipFilter;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 import org.apache.cayenne.util.Util;
@@ -100,7 +100,7 @@ public class ObjRelationshipInfoDialog extends 
ProjectDialog implements TreeSele
     private final JComboBox<String> deleteRule;
     private final JCheckBox usedForLocking;
     private final JTextField comment;
-    private final MultiColumnBrowser pathBrowser;
+    private final ColumnViewPanel pathBrowser;
     private final JButton newRelButton;
     private final JButton saveButton;
     private final JButton cancelButton;
@@ -135,7 +135,7 @@ public class ObjRelationshipInfoDialog extends 
ProjectDialog implements TreeSele
         this.usedForLocking = new JCheckBox();
         this.comment = new JTextField();
 
-        this.pathBrowser = new ObjRelationshipPathBrowser();
+        this.pathBrowser = new ObjRelationshipPathNavigatorPanel();
         this.pathBrowser.setPreferredColumnSize(BROWSER_CELL_DIM);
         this.pathBrowser.setDefaultRenderer();
 
@@ -462,7 +462,7 @@ public class ObjRelationshipInfoDialog extends 
ProjectDialog implements TreeSele
         objectTargets = new ArrayList<>();
         if (dbTarget != null) {
             
objectTargets.addAll(dbTarget.getDataMap().getMappedEntities(dbTarget));
-            objectTargets.sort(Comparators.forNamedObjects());
+            objectTargets.sort(ProjectComparators.forNamedObjects());
         }
         targetCombo.removeAllItems();
         for (ObjEntity s : objectTargets) {
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipPathBrowser.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipPathNavigatorPanel.java
similarity index 93%
rename from 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipPathBrowser.java
rename to 
modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipPathNavigatorPanel.java
index e11c339fd..e829a4ca6 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipPathBrowser.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/objentity/relinfo/ObjRelationshipPathNavigatorPanel.java
@@ -18,22 +18,21 @@
  ****************************************************************/
 package org.apache.cayenne.modeler.ui.project.editor.objentity.relinfo;
 
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseListener;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel;
 
-import javax.swing.SwingUtilities;
+import javax.swing.*;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.tree.TreePath;
-
-import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.modeler.toolkit.MultiColumnBrowser;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
 
 /**
  * Multi-column browser for obj relationships
  */
-public class ObjRelationshipPathBrowser extends MultiColumnBrowser {
+public class ObjRelationshipPathNavigatorPanel extends ColumnViewPanel {
 
     /**
      * Listener, which performs adding of new column
@@ -45,11 +44,11 @@ public class ObjRelationshipPathBrowser extends 
MultiColumnBrowser {
      */
     protected ListSelectionListener panelRemover;
 
-    public ObjRelationshipPathBrowser() {
+    public ObjRelationshipPathNavigatorPanel() {
         this(DEFAULT_MIN_COLUMNS_COUNT);
     }
 
-    public ObjRelationshipPathBrowser(int minColumns) {
+    public ObjRelationshipPathNavigatorPanel(int minColumns) {
         super(minColumns);
     }
 
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 fc4a76302..45854a8a5 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
@@ -30,33 +30,29 @@ import 
org.apache.cayenne.modeler.event.display.TablePopupHandler;
 import org.apache.cayenne.modeler.event.model.ProcedureEvent;
 import org.apache.cayenne.modeler.event.model.ProcedureParameterEvent;
 import org.apache.cayenne.modeler.event.model.ProcedureParameterListener;
-import org.apache.cayenne.modeler.toolkit.table.CMTablePrefs;
+import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.service.action.GlobalActions;
+import org.apache.cayenne.modeler.toolkit.AppAction;
+import org.apache.cayenne.modeler.toolkit.ProjectPanel;
 import org.apache.cayenne.modeler.toolkit.combobox.AutoCompletion;
 import org.apache.cayenne.modeler.toolkit.combobox.CMComboBox;
-import org.apache.cayenne.modeler.toolkit.table.CMComboBoxCellEditor;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
+import org.apache.cayenne.modeler.toolkit.table.CMComboBoxCellEditor;
 import org.apache.cayenne.modeler.toolkit.table.CMTable;
 import org.apache.cayenne.modeler.toolkit.table.CMTablePanel;
-import org.apache.cayenne.modeler.toolkit.table.CMTextFieldCellEditor;
-import org.apache.cayenne.modeler.toolkit.text.LimitedTextField;
+import org.apache.cayenne.modeler.toolkit.table.CMTablePrefs;
 import org.apache.cayenne.modeler.ui.action.CopyAttributeRelationshipAction;
 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.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;
-import org.apache.cayenne.modeler.toolkit.ProjectPanel;
-import org.apache.cayenne.modeler.project.ProjectSession;
 import 
org.apache.cayenne.modeler.ui.project.editor.query.ExistingSelectionProcessor;
 
 import javax.swing.*;
 import javax.swing.event.ChangeEvent;
-import javax.swing.event.ListSelectionEvent;
-import javax.swing.event.ListSelectionListener;
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.TableColumn;
 import java.awt.*;
@@ -90,12 +86,7 @@ public class ProcedureParameterTab extends ProjectPanel 
implements ProcedurePara
         session.addProcedureDisplayListener(this);
         session.addProcedureParameterListener(this);
 
-        table.getSelectionModel().addListSelectionListener(new 
ListSelectionListener() {
-
-            public void valueChanged(ListSelectionEvent e) {
-                processExistingSelection(e);
-            }
-        });
+        
table.getSelectionModel().addListSelectionListener(this::processExistingSelection);
 
         moveDown.addActionListener(this);
         moveUp.addActionListener(this);
@@ -281,26 +272,18 @@ public class ProcedureParameterTab extends ProjectPanel 
implements ProcedurePara
                 .getColumn(ProcedureParameterTableModel.PARAMETER_TYPE);
         String[] dbTypes = TypesMapping.getDatabaseTypes();
         Arrays.sort(dbTypes);
-        JComboBox typesEditor = new CMComboBox<>(dbTypes);
+        JComboBox<String> typesEditor = new CMComboBox<>(dbTypes);
         AutoCompletion.enable(typesEditor, session::getSelectedDataMap);
         typesColumn.setCellEditor(new CMComboBoxCellEditor(typesEditor));
 
         // direction column tweaking
         TableColumn directionColumn = table.getColumnModel()
                 .getColumn(ProcedureParameterTableModel.PARAMETER_DIRECTION);
-        JComboBox directionEditor = new CMComboBox<>(
+        JComboBox<String> directionEditor = new CMComboBox<>(
                 ProcedureParameterTableModel.PARAMETER_DIRECTION_NAMES);
         directionEditor.setEditable(false);
         directionColumn.setCellEditor(new 
CMComboBoxCellEditor(directionEditor));
 
-        TableColumn precisionColumn = 
table.getColumnModel().getColumn(ProcedureParameterTableModel.PARAMETER_PRECISION);
-        LimitedTextField limitedPrecisionField = new LimitedTextField(10);
-        precisionColumn.setCellEditor(new 
CMTextFieldCellEditor(limitedPrecisionField));
-
-        TableColumn lengthColumn = 
table.getColumnModel().getColumn(ProcedureParameterTableModel.PARAMETER_LENGTH);
-        LimitedTextField limitedLengthField = new LimitedTextField(10);
-        lengthColumn.setCellEditor(new 
CMTextFieldCellEditor(limitedLengthField));
-
         moveUp.setEnabled(false);
         moveDown.setEnabled(false);
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
index 703f7aa15..f862a4b8a 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureQueryView.java
@@ -38,7 +38,7 @@ import org.apache.cayenne.modeler.toolkit.ProjectPanel;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.toolkit.Renderers;
 import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.query.CapsStrategy;
 import org.apache.cayenne.query.ProcedureQuery;
@@ -160,7 +160,7 @@ public class ProcedureQueryView extends ProjectPanel {
         Procedure[] roots = map.getProcedures().toArray(new Procedure[0]);
 
         if (roots.length > 1) {
-            Arrays.sort(roots, Comparators.forDataMapChildren());
+            Arrays.sort(roots, ProjectComparators.forDataMapChildren());
         }
 
         DefaultComboBoxModel<Procedure> model = new 
DefaultComboBoxModel<>(roots);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java
index 8dc5bfaa8..d88714e94 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/procedure/ProcedureTabbedView.java
@@ -52,8 +52,8 @@ public class ProcedureTabbedView extends ProjectTabbedPane {
     }
 
     private void initBindings() {
-        session().addProcedureDisplayListener(this::currentProcedureChanged);
-        
session().addProcedureParameterDisplayListener(this::currentProcedureParameterChanged);
+        session.addProcedureDisplayListener(this::currentProcedureChanged);
+        
session.addProcedureParameterDisplayListener(this::currentProcedureParameterChanged);
         addChangeListener(this::stateChanged);
     }
 
@@ -67,8 +67,7 @@ public class ProcedureTabbedView extends ProjectTabbedPane {
     }
 
     private void currentProcedureChanged(ProcedureDisplayEvent e) {
-        app().getActionManager().getAction(
-                RemoveProcedureParameterAction.class).setEnabled(false);
+        
app.getActionManager().getAction(RemoveProcedureParameterAction.class).setEnabled(false);
 
         if (e.getProcedure() == null)
             setVisible(false);
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
index 4a0f97bb5..b4e0c12dc 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/RawQueryPropertiesPanel.java
@@ -33,7 +33,7 @@ import org.apache.cayenne.modeler.toolkit.checkbox.CMCheckBox;
 import org.apache.cayenne.modeler.toolkit.combobox.CMUndoableComboBox;
 import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.toolkit.Renderers;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 
 import com.jgoodies.forms.builder.PanelBuilder;
 import com.jgoodies.forms.layout.CellConstraints;
@@ -123,7 +123,7 @@ public abstract class RawQueryPropertiesPanel extends 
SelectPropertiesPanel {
         List<ObjEntity> objEntities = new ArrayList<>(map.getObjEntities());
 
         if (objEntities.size() > 1) {
-            objEntities.sort(Comparators.forDataMapChildren());
+            objEntities.sort(ProjectComparators.forDataMapChildren());
         }
 
         entities.setEnabled(fetchingDO && isEnabled());
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
index 5eba1f394..d44424f21 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/ejbql/EjbqlTabbedView.java
@@ -47,7 +47,7 @@ public class EjbqlTabbedView extends ProjectTabbedPane {
     }
 
     private void initBindings() {
-        session().addQueryDisplayListener(e -> initFromModel());
+        session.addQueryDisplayListener(e -> initFromModel());
         addChangeListener(this::stateChanged);
     }
 
@@ -57,7 +57,7 @@ public class EjbqlTabbedView extends ProjectTabbedPane {
     }
 
     private void initFromModel() {
-        if 
(!QueryDescriptor.EJBQL_QUERY.equals(session().getSelectedQuery().getType())) {
+        if 
(!QueryDescriptor.EJBQL_QUERY.equals(session.getSelectedQuery().getType())) {
             setVisible(false);
             return;
         }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
index f15e7022e..b2e17669c 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryMainTab.java
@@ -37,7 +37,7 @@ import org.apache.cayenne.modeler.project.ProjectSession;
 import org.apache.cayenne.modeler.ui.project.editor.ExpressionConvertor;
 import org.apache.cayenne.modeler.ui.project.editor.query.BaseQueryMainTab;
 import 
org.apache.cayenne.modeler.ui.project.editor.query.ObjectQueryPropertiesPanel;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.util.CayenneMapEntry;
 import org.apache.cayenne.util.Util;
@@ -150,7 +150,7 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
         ObjEntity[] roots = map.getObjEntities().toArray(new ObjEntity[0]);
 
         if (roots.length > 1) {
-            Arrays.sort(roots, Comparators.forDataMapChildren());
+            Arrays.sort(roots, ProjectComparators.forDataMapChildren());
         }
 
         DefaultComboBoxModel<ObjEntity> model = new 
DefaultComboBoxModel<>(roots);
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 05070baec..01bc19698 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
@@ -23,14 +23,14 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.apache.cayenne.modeler.event.model.QueryEvent;
-import org.apache.cayenne.modeler.toolkit.MultiColumnBrowser;
+import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel;
 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.toolkit.AppAction;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
 import org.apache.cayenne.query.Ordering;
 import org.apache.cayenne.query.SortOrder;
 import org.apache.cayenne.util.CayenneMapEntry;
@@ -59,7 +59,7 @@ public class SelectQueryOrderingTab extends ProjectPanel {
 
     protected SelectQueryDescriptor selectQuery;
 
-    protected MultiColumnBrowser browser;
+    protected ColumnViewPanel browser;
     protected CMTable table;
 
     protected CardLayout cardLayout;
@@ -147,7 +147,7 @@ public class SelectQueryOrderingTab extends ProjectPanel {
     }
 
     protected JPanel createSelectorPanel() {
-        browser = new MultiColumnBrowser();
+        browser = new ColumnViewPanel();
         browser.setPreferredColumnSize(BROWSER_CELL_DIM);
         browser.setDefaultRenderer();
 
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 6541301be..addf8dd9c 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
@@ -26,8 +26,8 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.project.ProjectSession;
 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.tree.EntityTreeFilter;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 
 import javax.swing.BorderFactory;
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
index 409df75fd..147afc680 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/selectquery/SelectQueryTabbedView.java
@@ -19,13 +19,12 @@
 
 package org.apache.cayenne.modeler.ui.project.editor.query.selectquery;
 
-import javax.swing.JScrollPane;
-import javax.swing.JTabbedPane;
-import javax.swing.event.ChangeEvent;
-
 import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.modeler.toolkit.ProjectTabbedPane;
 import org.apache.cayenne.modeler.project.ProjectSession;
+import org.apache.cayenne.modeler.toolkit.ProjectTabbedPane;
+
+import javax.swing.*;
+import javax.swing.event.ChangeEvent;
 
 public class SelectQueryTabbedView extends ProjectTabbedPane {
 
@@ -51,7 +50,7 @@ public class SelectQueryTabbedView extends ProjectTabbedPane {
     }
 
     private void initBindings() {
-        session().addQueryDisplayListener(e -> initFromModel());
+        session.addQueryDisplayListener(e -> initFromModel());
         addChangeListener(this::stateChanged);
     }
 
@@ -61,13 +60,13 @@ public class SelectQueryTabbedView extends 
ProjectTabbedPane {
     }
 
     private void initFromModel() {
-        if 
(!QueryDescriptor.SELECT_QUERY.equals(session().getSelectedQuery().getType())) {
+        if 
(!QueryDescriptor.SELECT_QUERY.equals(session.getSelectedQuery().getType())) {
             setVisible(false);
             return;
         }
 
         // if no root, reset tabs to show the first panel..
-        if (session().getSelectedQuery().getRoot() == null) {
+        if (session.getSelectedQuery().getRoot() == null) {
             lastSelectionIndex = 0;
         }
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
index c954b116c..fcfa2d3ab 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateMainTab.java
@@ -34,7 +34,7 @@ import org.apache.cayenne.map.QueryDescriptor;
 import org.apache.cayenne.modeler.toolkit.combobox.CMUndoableComboBox;
 import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextField;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.project.extension.info.ObjectInfo;
 import org.apache.cayenne.query.CapsStrategy;
 import org.apache.cayenne.query.SQLTemplate;
@@ -132,7 +132,7 @@ public class SQLTemplateMainTab extends BaseQueryMainTab {
         ObjEntity[] roots = map.getObjEntities().toArray(new ObjEntity[0]);
 
         if (roots.length > 1) {
-            Arrays.sort(roots, Comparators.forDataMapChildren());
+            Arrays.sort(roots, ProjectComparators.forDataMapChildren());
         }
 
         DefaultComboBoxModel<ObjEntity> model = new 
DefaultComboBoxModel<>(roots);
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 8025c309b..7c26515d8 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
@@ -30,9 +30,9 @@ 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.toolkit.AppAction;
-import org.apache.cayenne.modeler.util.EntityTreeFilter;
-import org.apache.cayenne.modeler.util.EntityTreeModel;
-import org.apache.cayenne.modeler.toolkit.MultiColumnBrowser;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeFilter;
+import org.apache.cayenne.modeler.toolkit.tree.EntityTreeModel;
+import org.apache.cayenne.modeler.toolkit.columnview.ColumnViewPanel;
 import org.apache.cayenne.modeler.toolkit.icon.IconFactory;
 import org.apache.cayenne.modeler.toolkit.splitpane.CMSplitPanePrefs;
 import org.apache.cayenne.modeler.toolkit.table.CMTable;
@@ -71,7 +71,7 @@ public class SQLTemplatePrefetchTab extends ProjectPanel {
 
     protected SQLTemplateDescriptor sqlTemplate;
 
-    protected MultiColumnBrowser browser;
+    protected ColumnViewPanel browser;
     protected CMTable table;
 
     protected CardLayout cardLayout;
@@ -174,7 +174,7 @@ public class SQLTemplatePrefetchTab extends ProjectPanel {
 
     protected JPanel createSelectorPanel() {
 
-        browser = new MultiColumnBrowser();
+        browser = new ColumnViewPanel();
         browser.setPreferredColumnSize(BROWSER_CELL_DIM);
         browser.setDefaultRenderer();
 
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateScriptsTab.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateScriptsTab.java
index 9c665c8cd..af118a37d 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateScriptsTab.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateScriptsTab.java
@@ -27,7 +27,7 @@ import org.apache.cayenne.map.QueryDescriptor;
 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.util.DbAdapterInfo;
+import org.apache.cayenne.modeler.dbadapter.DbAdapters;
 import org.apache.cayenne.modeler.toolkit.text.CMUndoableTextPane;
 import org.apache.cayenne.modeler.toolkit.text.CMTextPane;
 import org.apache.cayenne.util.Util;
@@ -78,7 +78,7 @@ public class SQLTemplateScriptsTab extends ProjectPanel {
     }
 
     private void prepareScriptAreas() {
-        for(String key : DbAdapterInfo.getStandardAdapters()) {
+        for(String key : DbAdapters.standardAdapters()) {
             CMTextPane currPane = new CMUndoableTextPane(app.getUndoManager(), 
new SQLSyntax());
             currPane.setName(key);
             currPane.getDocument().addDocumentListener(new 
CustomListener(currPane.getName()));
@@ -101,10 +101,10 @@ public class SQLTemplateScriptsTab extends ProjectPanel {
 
         scripts = new JList<>();
         scripts.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-        scripts.setCellRenderer(new 
DbAdapterListRenderer(DbAdapterInfo.getStandardAdapterLabels()));
+        scripts.setCellRenderer(new 
DbAdapterListRenderer(DbAdapters.getStandardAdapterLabels()));
 
-        keys = new ArrayList<>(DbAdapterInfo.getStandardAdapters().length + 1);
-        keys.addAll(Arrays.asList(DbAdapterInfo.getStandardAdapters()));
+        keys = new ArrayList<>(DbAdapters.standardAdapters().length + 1);
+        keys.addAll(Arrays.asList(DbAdapters.standardAdapters()));
         Collections.sort(keys);
         keys.add(0, DEFAULT_LABEL);
         scripts.setModel(new DefaultComboBoxModel<>(keys.toArray(new 
String[0])));
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
index 31c8f458c..0d0bb40f3 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/editor/query/sqltemplate/SQLTemplateTabbedView.java
@@ -51,7 +51,7 @@ public class SQLTemplateTabbedView extends ProjectTabbedPane {
     }
 
     private void initBindings() {
-        session().addQueryDisplayListener(e -> initFromModel());
+        session.addQueryDisplayListener(e -> initFromModel());
         addChangeListener(this::stateChanged);
     }
 
@@ -61,13 +61,13 @@ public class SQLTemplateTabbedView extends 
ProjectTabbedPane {
     }
 
     private void initFromModel() {
-        if 
(!QueryDescriptor.SQL_TEMPLATE.equals(session().getSelectedQuery().getType())) {
+        if 
(!QueryDescriptor.SQL_TEMPLATE.equals(session.getSelectedQuery().getType())) {
             setVisible(false);
             return;
         }
 
         // if no root, reset tabs to show the first panel..
-        if (session().getSelectedQuery().getRoot() == null) {
+        if (session.getSelectedQuery().getRoot() == null) {
             lastSelectionIndex = 0;
         }
 
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 b56c026f4..a1b1c5d4f 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
@@ -81,7 +81,7 @@ import 
org.apache.cayenne.modeler.ui.action.ObjEntitySyncAction;
 import org.apache.cayenne.modeler.ui.action.PasteAction;
 import org.apache.cayenne.modeler.ui.action.RemoveAction;
 import org.apache.cayenne.modeler.project.ProjectSession;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 import org.apache.cayenne.project.Project;
 import org.apache.cayenne.reflect.PropertyUtils;
 import org.apache.cayenne.resource.Resource;
@@ -469,7 +469,7 @@ public class ProjectTree extends JTree
 
         Procedure procedure = e.getProcedure();
         DefaultMutableTreeNode currentNode = new 
DefaultMutableTreeNode(procedure, false);
-        positionNode(node, currentNode, Comparators.forDataMapChildren());
+        positionNode(node, currentNode, 
ProjectComparators.forDataMapChildren());
         navigateTo(currentNode);
     }
 
@@ -482,7 +482,7 @@ public class ProjectTree extends JTree
             };
 
             updateNode(path);
-            positionNode(Comparators.forDataMapChildren(), path);
+            positionNode(ProjectComparators.forDataMapChildren(), path);
             navigateTo(path);
         }
     }
@@ -505,7 +505,7 @@ public class ProjectTree extends JTree
 
         QueryDescriptor query = e.getQuery();
         DefaultMutableTreeNode currentNode = new DefaultMutableTreeNode(query, 
false);
-        positionNode(node, currentNode, Comparators.forDataMapChildren());
+        positionNode(node, currentNode, 
ProjectComparators.forDataMapChildren());
         navigateTo(currentNode);
     }
 
@@ -518,7 +518,7 @@ public class ProjectTree extends JTree
             };
 
             updateNode(path);
-            positionNode(Comparators.forDataMapChildren(), path);
+            positionNode(ProjectComparators.forDataMapChildren(), path);
             navigateTo(path);
         }
     }
@@ -533,7 +533,7 @@ public class ProjectTree extends JTree
         Object[] path = new Object[]{e.getDomain()};
         updateNode(path);
         if (e.isNameChange()) {
-            positionNode(Comparators.forNamedObjects(), path);
+            positionNode(ProjectComparators.forNamedObjects(), path);
             navigateTo(path);
         }
     }
@@ -547,7 +547,7 @@ public class ProjectTree extends JTree
         if (node != null) {
             if (e.isNameChange()) {
                 positionNode((DefaultMutableTreeNode) node.getParent(), node,
-                        Comparators.forDataDomainChildren());
+                        ProjectComparators.forDataDomainChildren());
                 navigateTo(node);
             } else {
                 getProjectModel().nodeChanged(node);
@@ -572,7 +572,7 @@ public class ProjectTree extends JTree
                         if (!found) {
                             DefaultMutableTreeNode newMapNode =
                                     new 
DefaultMutableTreeNode(domain.getDataMap(aMapsName), false);
-                            positionNode(node, newMapNode, 
Comparators.forNamedObjects());
+                            positionNode(node, newMapNode, 
ProjectComparators.forNamedObjects());
                             break;
                         }
                     }
@@ -612,7 +612,7 @@ public class ProjectTree extends JTree
 
         DataNodeDescriptor dataNode = e.getDataNode();
         DefaultMutableTreeNode currentNode = 
ProjectTreeFactory.wrapProjectNode(dataNode);
-        positionNode(node, currentNode, Comparators.forDataDomainChildren());
+        positionNode(node, currentNode, 
ProjectComparators.forDataDomainChildren());
         navigateTo(currentNode);
     }
 
@@ -637,7 +637,7 @@ public class ProjectTree extends JTree
 
         if (e.isNameChange()) {
             session.updateEntityResolver();
-            positionNode(Comparators.forDataDomainChildren(), path);
+            positionNode(ProjectComparators.forDataDomainChildren(), path);
             navigateTo(path);
         }
     }
@@ -652,7 +652,7 @@ public class ProjectTree extends JTree
 
         session.entityResolver().addDataMap(e.getDataMap());
 
-        positionNode(domainNode, newMapNode, 
Comparators.forDataDomainChildren());
+        positionNode(domainNode, newMapNode, 
ProjectComparators.forDataDomainChildren());
         if 
(session.app().getFrame().getDbImportResultDialog().isGlobalImport()) {
             setSelected(newMapNode);
         } else {
@@ -728,7 +728,7 @@ public class ProjectTree extends JTree
             };
 
             updateNode(path);
-            positionNode(Comparators.forDataMapChildren(), path);
+            positionNode(ProjectComparators.forDataMapChildren(), path);
             navigateTo(path);
         }
     }
@@ -748,7 +748,7 @@ public class ProjectTree extends JTree
         }
 
         DefaultMutableTreeNode currentNode = new 
DefaultMutableTreeNode(entity, false);
-        positionNode(mapNode, currentNode, Comparators.forDataMapChildren());
+        positionNode(mapNode, currentNode, 
ProjectComparators.forDataMapChildren());
         navigateTo(currentNode);
     }
 
@@ -778,7 +778,7 @@ public class ProjectTree extends JTree
         }
 
         DefaultMutableTreeNode currentNode = new 
DefaultMutableTreeNode(embeddable, false);
-        positionNode(mapNode, currentNode, Comparators.forDataMapChildren());
+        positionNode(mapNode, currentNode, 
ProjectComparators.forDataMapChildren());
         navigateTo(currentNode);
     }
 
@@ -791,7 +791,7 @@ public class ProjectTree extends JTree
             };
 
             updateNode(path);
-            positionNode(Comparators.forDataMapChildren(), path);
+            positionNode(ProjectComparators.forDataMapChildren(), path);
             navigateTo(path);
         }
     }
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java
index f84a23c06..b4bf2c0bd 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ui/project/tree/ProjectTreeFactory.java
@@ -23,7 +23,7 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.modeler.util.Comparators;
+import org.apache.cayenne.modeler.project.ProjectComparators;
 
 import javax.swing.tree.DefaultMutableTreeNode;
 import java.util.ArrayList;
@@ -133,23 +133,23 @@ class ProjectTreeFactory {
 
             //Should be sorted manually because dataMap don't provide sorted 
collection.
             dataMap.getObjEntities().stream()
-                    .sorted(Comparators.forDataMapChildren())
+                    .sorted(ProjectComparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getEmbeddables().stream()
-                    .sorted(Comparators.forDataMapChildren())
+                    .sorted(ProjectComparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getDbEntities().stream()
-                    .sorted(Comparators.forDataMapChildren())
+                    .sorted(ProjectComparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getProcedures().stream()
-                    .sorted(Comparators.forDataMapChildren())
+                    .sorted(ProjectComparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             dataMap.getQueryDescriptors().stream()
-                    .sorted(Comparators.forDataMapChildren())
+                    .sorted(ProjectComparators.forDataMapChildren())
                     .forEach(e -> makeNode(e));
 
             return popNode();
diff --git 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/ApplicationFileFilterTest.java
 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/ApplicationFileFilterTest.java
index 65e0370b5..339ad739a 100644
--- 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/ApplicationFileFilterTest.java
+++ 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/ApplicationFileFilterTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.util;
 
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/DataMapFileFilterTest.java
 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/DataMapFileFilterTest.java
index 3193aabd1..8c0df1e3b 100644
--- 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/DataMapFileFilterTest.java
+++ 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/DataMapFileFilterTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.util;
 
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
diff --git 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/EOModelFileFilterTest.java
 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/EOModelFileFilterTest.java
index 27616923b..a99ce4d74 100644
--- 
a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/EOModelFileFilterTest.java
+++ 
b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/util/EOModelFileFilterTest.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler.util;
 
+import org.apache.cayenne.modeler.toolkit.filechooser.FileFilters;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 

Reply via email to