http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportSaverDelegate.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportSaverDelegate.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportSaverDelegate.java
new file mode 100644
index 0000000..dceb3ee
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/DbImportSaverDelegate.java
@@ -0,0 +1,46 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.project.extension.BaseSaverDelegate;
+
+/**
+ * @since 4.1
+ */
+class DbImportSaverDelegate extends BaseSaverDelegate {
+
+    private DataChannelMetaData metaData;
+
+    DbImportSaverDelegate(DataChannelMetaData metaData) {
+        this.metaData = metaData;
+    }
+
+    @Override
+    public Void visitDataMap(DataMap dataMap) {
+        ReverseEngineering reverseEngineering = metaData.get(dataMap, 
ReverseEngineering.class);
+        if(reverseEngineering != null) {
+            encoder.nested(reverseEngineering, getParentDelegate());
+        }
+        return null;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/IncludeTableHandler.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/IncludeTableHandler.java
 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/IncludeTableHandler.java
new file mode 100644
index 0000000..edac2b8
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/IncludeTableHandler.java
@@ -0,0 +1,112 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+/**
+ * @since 4.1
+ */
+class IncludeTableHandler extends NamespaceAwareNestedTagHandler {
+
+    private static final String INCLUDE_TABLE_TAG = "includeTable";
+    private static final String INCLUDE_TABLE_NAME_TAG = "name";
+    private static final String INCLUDE_COLUMN_TAG = "includeColumn";
+    private static final String EXCLUDE_COLUMN_TAG = "excludeColumn";
+
+    private IncludeTable includeTable;
+
+    private FilterContainer entity;
+
+    IncludeTableHandler(NamespaceAwareNestedTagHandler 
parentHandler,FilterContainer entity) {
+        super(parentHandler);
+        this.entity = entity;
+    }
+
+    @Override
+    protected boolean processElement(String namespaceURI, String localName, 
Attributes attributes) throws SAXException {
+        switch (localName) {
+            case INCLUDE_TABLE_TAG:
+                return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    protected void processCharData(String localName, String data) {
+        switch (localName) {
+            case INCLUDE_TABLE_NAME_TAG:
+                createIncludeTableName(data);
+                break;
+            case INCLUDE_COLUMN_TAG:
+                createIncludeColumn(data);
+                break;
+            case EXCLUDE_COLUMN_TAG:
+                createExcludeColumn(data);
+                break;
+        }
+    }
+
+    private void createExcludeColumn(String excludeColumn) {
+        if (excludeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (includeTable != null) {
+            includeTable.addExcludeColumn(new ExcludeColumn(excludeColumn));
+        }
+    }
+
+    private void createIncludeColumn(String includeColumn) {
+        if (includeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (includeTable != null) {
+            includeTable.addIncludeColumn(new IncludeColumn(includeColumn));
+        }
+    }
+
+    private void createIncludeTableName(String includeTableName) {
+        if (includeTableName.trim().length() == 0) {
+            return;
+        }
+
+        if (includeTable == null) {
+            createIncludeTable();
+        }
+
+        if (includeTable != null) {
+            includeTable.setName(includeTableName);
+        }
+    }
+
+    private void createIncludeTable() {
+        includeTable = new IncludeTable();
+        entity.addIncludeTable(includeTable);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/SchemaHandler.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/SchemaHandler.java 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/SchemaHandler.java
new file mode 100644
index 0000000..7476789
--- /dev/null
+++ 
b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/xml/SchemaHandler.java
@@ -0,0 +1,186 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.dbsync.xml;
+
+import org.apache.cayenne.configuration.xml.NamespaceAwareNestedTagHandler;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
+import org.apache.cayenne.dbsync.reverse.dbimport.SchemaContainer;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.SAXException;
+
+/**
+ * @since 4.1
+ */
+class SchemaHandler extends NamespaceAwareNestedTagHandler {
+
+    private static final String SCHEMA_TAG = "schema";
+    private static final String SCHEMA_NAME_TAG = "name";
+    private static final String INCLUDE_TABLE_TAG = "includeTable";
+    private static final String EXCLUDE_TABLE_TAG = "excludeTable";
+    private static final String INCLUDE_COLUMN_TAG = "includeColumn";
+    private static final String EXCLUDE_COLUMN_TAG = "excludeColumn";
+    private static final String INCLUDE_PROCEDURE_TAG = "includeProcedure";
+    private static final String EXCLUDE_PROCEDURE_TAG = "excludeProcedure";
+
+    private SchemaContainer entity;
+
+    private Schema schema;
+
+    SchemaHandler(NamespaceAwareNestedTagHandler parentHandler, 
SchemaContainer entity) {
+        super(parentHandler);
+        this.entity = entity;
+    }
+
+    @Override
+    protected boolean processElement(String namespaceURI, String localName, 
Attributes attributes) throws SAXException {
+        switch (localName) {
+            case SCHEMA_TAG:
+                createSchema();
+                return true;
+        }
+
+        return false;
+    }
+
+    @Override
+    protected ContentHandler createChildTagHandler(String namespaceURI, String 
localName,
+                                                   String qName, Attributes 
attributes) {
+
+        if (namespaceURI.equals(targetNamespace)) {
+            switch (localName) {
+                case INCLUDE_TABLE_TAG:
+                    return new IncludeTableHandler(this, schema);
+            }
+        }
+
+        return super.createChildTagHandler(namespaceURI, localName, qName, 
attributes);
+    }
+
+    @Override
+    protected void processCharData(String localName, String data) {
+        switch (localName) {
+            case INCLUDE_TABLE_TAG:
+                createIncludeTable(data);
+                break;
+            case SCHEMA_NAME_TAG:
+                createSchemaName(data);
+                break;
+            case EXCLUDE_TABLE_TAG:
+                createExcludeTable(data);
+                break;
+            case INCLUDE_COLUMN_TAG:
+                createIncludeColumn(data);
+                break;
+            case EXCLUDE_COLUMN_TAG:
+                createExcludeColumn(data);
+                break;
+            case INCLUDE_PROCEDURE_TAG:
+                createIncludeProcedure(data);
+                break;
+            case EXCLUDE_PROCEDURE_TAG:
+                createExcludeProcedure(data);
+                break;
+        }
+    }
+
+    private void createIncludeTable(String includeTableData) {
+        if (includeTableData.trim().length() == 0) {
+            return;
+        }
+
+        if (schema != null) {
+            IncludeTable includeTable = new IncludeTable();
+            includeTable.setName(includeTableData);
+            schema.addIncludeTable(includeTable);
+        }
+    }
+
+    private void createExcludeProcedure(String excludeProcedure) {
+        if (excludeProcedure.trim().length() == 0) {
+            return;
+        }
+
+        if (schema != null) {
+            schema.addExcludeProcedure(new ExcludeProcedure(excludeProcedure));
+        }
+    }
+
+    private void createIncludeProcedure(String includeProcedure) {
+        if (includeProcedure.trim().length() == 0) {
+            return;
+        }
+
+        if (schema != null) {
+            schema.addIncludeProcedure(new IncludeProcedure(includeProcedure));
+        }
+    }
+
+    private void createExcludeColumn(String excludeColumn) {
+        if (excludeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (schema != null) {
+            schema.addExcludeColumn(new ExcludeColumn(excludeColumn));
+        }
+    }
+
+    private void createIncludeColumn(String includeColumn) {
+        if (includeColumn.trim().length() == 0) {
+            return;
+        }
+
+        if (schema != null) {
+            schema.addIncludeColumn(new IncludeColumn(includeColumn));
+        }
+    }
+
+    private void createExcludeTable(String excludeTable) {
+        if (excludeTable.trim().length() == 0) {
+            return;
+        }
+
+        if (schema != null) {
+            schema.addExcludeTable(new ExcludeTable(excludeTable));
+        }
+    }
+
+    private void createSchemaName(String schemaName) {
+        if (schemaName.trim().length() == 0) {
+            return;
+        }
+
+        if (schema != null) {
+            schema.setName(schemaName);
+        }
+    }
+
+    private void createSchema() {
+        schema = new Schema();
+        entity.addSchema(schema);
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
index 094a904..5acb389 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/merge/builders/DbAttributeBuilder.java
@@ -100,7 +100,7 @@ public class DbAttributeBuilder extends 
DefaultBuilder<DbAttribute> {
 
     @Override
     public DbAttribute build() {
-        if (Util.isEmptyString(obj.getName())) {
+        if (Util.isEmptyString((obj.getName()))) {
             name();
         }
 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
index 364f770..910a8e0 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/DefaultDbImportActionTest.java
@@ -24,6 +24,7 @@ import org.apache.cayenne.configuration.DataMapLoader;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.configuration.server.DataSourceFactory;
 import org.apache.cayenne.configuration.server.DbAdapterFactory;
+import org.apache.cayenne.configuration.xml.DataChannelMetaData;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dbsync.DbSyncModule;
 import org.apache.cayenne.dbsync.filter.NamePatternMatcher;
@@ -297,13 +298,13 @@ public class DefaultDbImportActionTest {
         DataSourceFactory dataSourceFactory = mock(DataSourceFactory.class);
         DataSource mock = mock(DataSource.class);
         
when(dataSourceFactory.getDataSource((DataNodeDescriptor)any())).thenReturn(mock);
-
+        DataChannelMetaData metaData = mock(DataChannelMetaData.class);
         MergerTokenFactoryProvider mergerTokenFactoryProvider = 
mock(MergerTokenFactoryProvider.class);
         when(mergerTokenFactoryProvider.get((DbAdapter)any())).thenReturn(new 
DefaultMergerTokenFactory());
 
         DataChannelDescriptorLoader dataChannelDescriptorLoader = 
mock(DataChannelDescriptorLoader.class);
 
-        return new DefaultDbImportAction(log, projectSaver, dataSourceFactory, 
adapterFactory, mapLoader, mergerTokenFactoryProvider, 
dataChannelDescriptorLoader) {
+        return new DefaultDbImportAction(log, projectSaver, dataSourceFactory, 
adapterFactory, mapLoader, mergerTokenFactoryProvider, 
dataChannelDescriptorLoader, metaData) {
 
             protected DbLoader createDbLoader(DbAdapter adapter,
                                                Connection connection,

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilderTest.java
----------------------------------------------------------------------
diff --git 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilderTest.java
 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilderTest.java
index 4ce8ef3..6aba638 100644
--- 
a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilderTest.java
+++ 
b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/filters/FiltersConfigBuilderTest.java
@@ -54,7 +54,8 @@ public class FiltersConfigBuilderTest {
                 "      IncludeTable: table2\n" +
                 "        IncludeColumn: includeColumn\n" +
                 "      IncludeTable: table3\n" +
-                "        IncludeColumn: includeColumn\n", 
engineering.toString());
+                "        IncludeColumn: includeColumn\n\n" +
+                "  Use primitives", engineering.toString());
     }
 
     @Test
@@ -81,7 +82,8 @@ public class FiltersConfigBuilderTest {
                 "    Schema: schemaName02\n" +
                 "      IncludeTable: table1\n" +
                 "        IncludeColumn: includeColumn\n" +
-                "      ExcludeTable: table2\n", engineering.toString());
+                "      ExcludeTable: table2\n\n"+
+                "  Use primitives", engineering.toString());
     }
 
     @Test
@@ -106,7 +108,8 @@ public class FiltersConfigBuilderTest {
                 "    Schema: null\n" +
                 "      IncludeTable: null\n" +
                 "        ExcludeColumn: calculated_.*\n" +
-                "      ExcludeTable: SYS_.*\n", engineering.toString());
+                "      ExcludeTable: SYS_.*\n\n" +
+                "  Use primitives", engineering.toString());
     }
 
     @Test
@@ -120,7 +123,8 @@ public class FiltersConfigBuilderTest {
                 "ReverseEngineering: \n" +
                 "  Catalog: null\n" +
                 "    Schema: s\n" +
-                "      IncludeTable: null\n", engineering.toString());
+                "      IncludeTable: null\n\n" +
+                "  Use primitives", engineering.toString());
     }
 
     @Test
@@ -203,7 +207,8 @@ public class FiltersConfigBuilderTest {
                 "    IncludeColumn: c_xxx1\n" +
                 "    ExcludeColumn: c_xxx2\n" +
                 "    IncludeProcedure: p7\n" +
-                "    ExcludeProcedure: p8\n", engineering.toString());
+                "    ExcludeProcedure: p8\n\n" +
+                "  Use primitives", engineering.toString());
 
 
         builder.compact();
@@ -259,7 +264,8 @@ public class FiltersConfigBuilderTest {
                         "      IncludeProcedure: p5\n" +
                         "      IncludeProcedure: p7\n" +
                         "      ExcludeProcedure: p6\n" +
-                        "      ExcludeProcedure: p8\n", 
engineering.toString());
+                        "      ExcludeProcedure: p8\n\n" +
+                        "  Use primitives", engineering.toString());
     }
 
     protected IncludeTable includeTable(String name, String incCol, String 
excCol) {

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java
----------------------------------------------------------------------
diff --git a/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java 
b/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java
index 49edbe0..4aa2c59 100644
--- a/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java
+++ b/cayenne-di/src/main/java/org/apache/cayenne/di/BindingBuilder.java
@@ -18,9 +18,6 @@
  ****************************************************************/
 package org.apache.cayenne.di;
 
-import org.apache.cayenne.di.DIRuntimeException;
-
-
 /**
  * A binding builder that helps with fluent binding creation.
  * 

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
----------------------------------------------------------------------
diff --git 
a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
 
b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
index e5a9bd1..d4e50a4 100644
--- 
a/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
+++ 
b/cayenne-gradle-plugin/src/main/java/org/apache/cayenne/tools/DbImportTask.java
@@ -82,8 +82,8 @@ public class DbImportTask extends BaseCayenneTask {
         DbImportConfiguration config = createConfig();
 
         Injector injector = DIBootstrap.createInjector(new DbSyncModule(), new 
ToolsModule(getLogger()), new DbImportModule());
-
         DbImportConfigurationValidator validator = new 
DbImportConfigurationValidator(reverseEngineering, config, injector);
+
         try {
             validator.validate();
         } catch (Exception ex) {
@@ -109,25 +109,27 @@ public class DbImportTask extends BaseCayenneTask {
     DbImportConfiguration createConfig() {
 
         reverseEngineering = config.toReverseEngineering();
-
         DbImportConfiguration config = new DbImportConfiguration();
+        if (reverseEngineering.getCatalogs().size() == 0 && 
reverseEngineering.isEmptyContainer()) {
+            config.setUseDataMapReverseEngineering(true);
+        }
         config.setAdapter(adapter);
-        config.setDefaultPackage(reverseEngineering.getDefaultPackage());
         config.setDriver(dataSource.getDriver());
-        config.setFiltersConfig(new 
FiltersConfigBuilder(reverseEngineering).build());
-        
config.setForceDataMapCatalog(reverseEngineering.isForceDataMapCatalog());
-        
config.setForceDataMapSchema(reverseEngineering.isForceDataMapSchema());
         config.setLogger(getLogger());
-        
config.setMeaningfulPkTables(reverseEngineering.getMeaningfulPkTables());
-        config.setNamingStrategy(reverseEngineering.getNamingStrategy());
         config.setPassword(dataSource.getPassword());
+        config.setTargetDataMap(getDataMapFile());
+        config.setUrl(dataSource.getUrl());
+        config.setUsername(dataSource.getUsername());
         
config.setSkipRelationshipsLoading(reverseEngineering.getSkipRelationshipsLoading());
         
config.setSkipPrimaryKeyLoading(reverseEngineering.getSkipPrimaryKeyLoading());
         
config.setStripFromTableNames(reverseEngineering.getStripFromTableNames());
         config.setTableTypes(reverseEngineering.getTableTypes());
-        config.setTargetDataMap(getDataMapFile());
-        config.setUrl(dataSource.getUrl());
-        config.setUsername(dataSource.getUsername());
+        
config.setMeaningfulPkTables(reverseEngineering.getMeaningfulPkTables());
+        config.setNamingStrategy(reverseEngineering.getNamingStrategy());
+        config.setFiltersConfig(new 
FiltersConfigBuilder(reverseEngineering).build());
+        
config.setForceDataMapCatalog(reverseEngineering.isForceDataMapCatalog());
+        
config.setForceDataMapSchema(reverseEngineering.isForceDataMapSchema());
+        config.setDefaultPackage(reverseEngineering.getDefaultPackage());
         config.setUsePrimitives(reverseEngineering.isUsePrimitives());
         config.setUseJava7Types(reverseEngineering.isUseJava7Types());
         config.setCayenneProject(cayenneProject);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
----------------------------------------------------------------------
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java 
b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
index 3cad849..512f712 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/CayenneDataObject.java
@@ -47,6 +47,8 @@ public class CayenneDataObject extends BaseDataObject {
 
        private static final long serialVersionUID = -313743913882350400L;
 
+       protected long snapshotVersion = DEFAULT_VERSION;
+
        protected Map<String, Object> values = new HashMap<>();
 
        @Override

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
----------------------------------------------------------------------
diff --git 
a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
 
b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
index e6422c5..7da60af 100644
--- 
a/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
+++ 
b/maven-plugins/cayenne-maven-plugin/src/main/java/org/apache/cayenne/tools/DbImporterMojo.java
@@ -122,6 +122,9 @@ public class DbImporterMojo extends AbstractMojo {
     DbImportConfiguration createConfig(Logger logger) {
 
         DbImportConfiguration config = new DbImportConfiguration();
+        if (dbImportConfig.getCatalogs().size() == 0 && 
dbImportConfig.isEmptyContainer()) {
+            config.setUseDataMapReverseEngineering(true);
+        }
         config.setAdapter(adapter);
         config.setDefaultPackage(dbImportConfig.getDefaultPackage());
         config.setDriver(dataSource.getDriver());

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
----------------------------------------------------------------------
diff --git 
a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
 
b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
index 734e93c..40338fb 100644
--- 
a/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
+++ 
b/maven-plugins/cayenne-maven-plugin/src/test/java/org/apache/cayenne/tools/CayenneGeneratorMojoTest.java
@@ -31,31 +31,22 @@ public class CayenneGeneratorMojoTest extends 
AbstractMojoTestCase {
         assertNotNull(pom);
         assertTrue(pom.exists());
 
-        CayenneGeneratorMojo myMojo = (CayenneGeneratorMojo) lookupMojo("cgen",
-                pom);
+        CayenneGeneratorMojo myMojo = (CayenneGeneratorMojo) 
lookupMojo("cgen", pom);
         assertNotNull(myMojo);
         myMojo.execute();
 
-        File superTestEntity = new File(
-                "target/cayenneGeneratedClasses/superPkg/_TestEntity.txt");
-        File testEntity = new File(
-                "target/cayenneGeneratedClasses/pack/TestEntity.txt");
+        File superTestEntity = new 
File("target/cayenneGeneratedClasses/superPkg/_TestEntity.txt");
+        File testEntity = new 
File("target/cayenneGeneratedClasses/pack/TestEntity.txt");
 
-        File superEmbeddable = new File(
-                "target/cayenneGeneratedClasses/superPkg/_Embeddable.txt");
-        File embeddable = new File(
-                "target/cayenneGeneratedClasses/pack/Embeddable.txt");
+        File superEmbeddable = new 
File("target/cayenneGeneratedClasses/superPkg/_Embeddable.txt");
+        File embeddable = new 
File("target/cayenneGeneratedClasses/pack/Embeddable.txt");
 
-        File superNotIncludedEntity = new File(
-                "target/cayenneGeneratedClasses/pack/_NotIncludedEntity.txt");
+        File superNotIncludedEntity = new 
File("target/cayenneGeneratedClasses/pack/_NotIncludedEntity.txt");
 
-        File notIncludedEntity = new File(
-                "target/cayenneGeneratedClasses/pack/NotIncludedEntity.txt");
+        File notIncludedEntity = new 
File("target/cayenneGeneratedClasses/pack/NotIncludedEntity.txt");
 
-        File superExcludedEntity = new File(
-                "target/cayenneGeneratedClasses/pack/_TestExcludedEntity.txt");
-        File excludedEntity = new File(
-                "target/cayenneGeneratedClasses/pack/TestExcludedEntity.txt");
+        File superExcludedEntity = new 
File("target/cayenneGeneratedClasses/pack/_TestExcludedEntity.txt");
+        File excludedEntity = new 
File("target/cayenneGeneratedClasses/pack/TestExcludedEntity.txt");
 
         assertTrue(superTestEntity.exists());
         assertTrue(testEntity.exists());
@@ -73,6 +64,5 @@ public class CayenneGeneratorMojoTest extends 
AbstractMojoTestCase {
         assertTrue(content.contains("public static final 
Property<List<TestRelEntity>> ADDITIONAL_REL = 
Property.create(\"additionalRel\", List.class);"));
         assertTrue(content.contains("public void 
addToAdditionalRel(TestRelEntity obj)"));
         assertTrue(content.contains("public void 
removeFromAdditionalRel(TestRelEntity obj)"));
-
     }
 }

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testImportWithoutChanges-pom.xml
----------------------------------------------------------------------
diff --git 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testImportWithoutChanges-pom.xml
 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testImportWithoutChanges-pom.xml
index 69831e9..56995b3 100644
--- 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testImportWithoutChanges-pom.xml
+++ 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testImportWithoutChanges-pom.xml
@@ -21,7 +21,7 @@
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/xsd/maven-4.0.0.xsd";>
 
-       <name>DbImporterMojo Test1</name>       
+       <name>DbImporterMojo Test1</name>
 
        <build>
                <plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
----------------------------------------------------------------------
diff --git 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
index 37c18d4..27fca57 100644
--- 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
+++ 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimport/testInheritance-pom.xml
@@ -21,7 +21,7 @@
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/xsd/maven-4.0.0.xsd";>
 
-       <name>DbImporterMojo Test1</name>       
+       <name>DbImporterMojo Test1</name>
 
        <build>
                <plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom1.xml
----------------------------------------------------------------------
diff --git 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom1.xml
 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom1.xml
index 3bb6207..76bd257 100644
--- 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom1.xml
+++ 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom1.xml
@@ -21,7 +21,7 @@
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/xsd/maven-4.0.0.xsd";>
 
-       <name>DbImporterMojo Test1</name>       
+       <name>DbImporterMojo Test1</name>
 
        <build>
                <plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
----------------------------------------------------------------------
diff --git 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
index be64020..04bc4ff 100644
--- 
a/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
+++ 
b/maven-plugins/cayenne-maven-plugin/src/test/resources/org/apache/cayenne/tools/dbimporter-pom3.xml
@@ -21,7 +21,7 @@
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
        http://maven.apache.org/xsd/maven-4.0.0.xsd";>
 
-       <name>DbImporterMojo Test1</name>       
+       <name>DbImporterMojo Test1</name>
 
        <build>
                <plugins>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/pom.xml
----------------------------------------------------------------------
diff --git a/modeler/cayenne-modeler/pom.xml b/modeler/cayenne-modeler/pom.xml
index ef96ba8..794ebd3 100644
--- a/modeler/cayenne-modeler/pom.xml
+++ b/modeler/cayenne-modeler/pom.xml
@@ -20,8 +20,20 @@
 <project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
http://maven.apache.org/maven-v4_0_0.xsd";>
 
        <modelVersion>4.0.0</modelVersion>
-
-       <parent>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+    <parent>
                <groupId>org.apache.cayenne.modeler</groupId>
                <artifactId>cayenne-modeler-parent</artifactId>
                <version>4.1.M2-SNAPSHOT</version>

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
index 52cfcd3..ffc02fa 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/CayenneModelerFrame.java
@@ -232,7 +232,6 @@ public class CayenneModelerFrame extends JFrame implements 
DataNodeDisplayListen
         projectMenu.addSeparator();
         projectMenu.add(getAction(RemoveAction.class).buildMenu());
 
-        toolMenu.add(getAction(ReverseEngineeringAction.class).buildMenu());
         toolMenu.add(getAction(InferRelationshipsAction.class).buildMenu());
         toolMenu.add(getAction(ImportEOModelAction.class).buildMenu());
         toolMenu.addSeparator();

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddCatalogAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddCatalogAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddCatalogAction.java
new file mode 100644
index 0000000..50ebe74
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddCatalogAction.java
@@ -0,0 +1,91 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
+import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
+
+import javax.swing.tree.TreePath;
+import java.awt.event.ActionEvent;
+
+/**
+ * @since 4.1
+ */
+public class AddCatalogAction extends TreeManipulationAction {
+
+    private static final String ACTION_NAME = "Add Catalog";
+    private static final String ICON_NAME = "icon-dbi-catalog.png";
+
+    AddCatalogAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = Catalog.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        boolean updateSelected = false;
+        tree.stopEditing();
+        String name = insertableNodeName != null ? insertableNodeName : 
EMPTY_NAME;
+        if (tree.getSelectionPath() == null) {
+            TreePath root = new TreePath(tree.getRootNode());
+            tree.setSelectionPath(root);
+        }
+        if (foundNode == null) {
+            selectedElement = tree.getSelectedNode();
+        } else {
+            selectedElement = foundNode;
+        }
+        parentElement = (DbImportTreeNode) selectedElement.getParent();
+        if (parentElement == null) {
+            parentElement = selectedElement;
+        }
+        Catalog newCatalog = new Catalog(name);
+        ReverseEngineering reverseEngineeringOldCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        if (reverseEngineeringIsEmpty()) {
+            tree.getRootNode().removeAllChildren();
+        }
+        if (canBeInserted(selectedElement)) {
+            ((ReverseEngineering) 
selectedElement.getUserObject()).addCatalog(newCatalog);
+            selectedElement.add(new DbImportTreeNode(newCatalog));
+            updateSelected = true;
+        } else if (canInsert()) {
+            ((ReverseEngineering) 
parentElement.getUserObject()).addCatalog(newCatalog);
+            parentElement.add(new DbImportTreeNode(newCatalog));
+            updateSelected = false;
+        }
+        if (!isMultipleAction) {
+            updateAfterInsert(updateSelected);
+        }
+        ReverseEngineering reverseEngineeringNewCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        if ((!isMultipleAction) && (!insertableNodeName.equals(EMPTY_NAME))) {
+            DbImportTreeUndoableEdit undoableEdit = new 
DbImportTreeUndoableEdit(
+                    reverseEngineeringOldCopy, reverseEngineeringNewCopy, 
tree, getProjectController()
+            );
+            
getProjectController().getApplication().getUndoManager().addEdit(undoableEdit);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeColumnAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeColumnAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeColumnAction.java
new file mode 100644
index 0000000..d36c7e2
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeColumnAction.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.apache.cayenne.modeler.Application;
+
+/**
+ * @since 4.1
+ */
+public class AddExcludeColumnAction extends AddPatternParamAction {
+
+    private static final String ACTION_NAME = "Add Exclude Column";
+    private static final String ICON_NAME = "icon-dbi-excludeColumn.png";
+
+    public AddExcludeColumnAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = ExcludeColumn.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeProcedureAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeProcedureAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeProcedureAction.java
new file mode 100644
index 0000000..09ec188
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeProcedureAction.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
+import org.apache.cayenne.modeler.Application;
+
+/**
+ * @since 4.1
+ */
+public class AddExcludeProcedureAction extends AddPatternParamAction {
+
+    private static final String ACTION_NAME = "Add Exclude Procedure";
+    private static final String ICON_NAME = "icon-dbi-excludeProcedure.png";
+
+    public AddExcludeProcedureAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = ExcludeProcedure.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeTableAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeTableAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeTableAction.java
new file mode 100644
index 0000000..58baef2
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddExcludeTableAction.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
+import org.apache.cayenne.modeler.Application;
+
+/**
+ * @since 4.1
+ */
+public class AddExcludeTableAction extends AddPatternParamAction {
+
+    private static final String ACTION_NAME = "Add Exclude Table";
+    private static final String ICON_NAME = "icon-dbi-excludeTable.png";
+
+    public AddExcludeTableAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = ExcludeTable.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeColumnAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeColumnAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeColumnAction.java
new file mode 100644
index 0000000..e2b27b1
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeColumnAction.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.modeler.Application;
+
+/**
+ * @since 4.1
+ */
+public class AddIncludeColumnAction extends AddPatternParamAction {
+
+    private static final String ACTION_NAME = "Add Include Column";
+    private static final String ICON_NAME = "icon-dbi-includeColumn.png";
+
+    public AddIncludeColumnAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = IncludeColumn.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeProcedureAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeProcedureAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeProcedureAction.java
new file mode 100644
index 0000000..6a04a63
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeProcedureAction.java
@@ -0,0 +1,41 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
+import org.apache.cayenne.modeler.Application;
+
+/**
+ * @since 4.1
+ */
+public class AddIncludeProcedureAction extends AddPatternParamAction {
+
+    private static final String ACTION_NAME = "Add Include Procedure";
+    private static final String ICON_NAME = "icon-dbi-includeProcedure.png";
+
+    public AddIncludeProcedureAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = IncludeProcedure.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeTableAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeTableAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeTableAction.java
new file mode 100644
index 0000000..136a166
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddIncludeTableAction.java
@@ -0,0 +1,92 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
+import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
+
+import javax.swing.tree.TreePath;
+import java.awt.event.ActionEvent;
+
+/**
+ * @since 4.1
+ */
+public class AddIncludeTableAction extends TreeManipulationAction {
+
+    private static final String ACTION_NAME = "Add Include Table";
+    private static final String ICON_NAME = "icon-dbi-includeTable.png";
+
+    AddIncludeTableAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = IncludeTable.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        boolean updateSelected = false;
+        tree.stopEditing();
+        String name = insertableNodeName != null ? insertableNodeName : 
EMPTY_NAME;
+        if (tree.getSelectionPath() == null) {
+            TreePath root = new TreePath(tree.getRootNode());
+            tree.setSelectionPath(root);
+        }
+        if (foundNode == null) {
+            selectedElement = tree.getSelectedNode();
+        } else {
+            selectedElement = foundNode;
+        }
+        parentElement = (DbImportTreeNode) selectedElement.getParent();
+        ReverseEngineering reverseEngineeringOldCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        IncludeTable newTable = new IncludeTable(name);
+        if (reverseEngineeringIsEmpty()) {
+            tree.getRootNode().removeAllChildren();
+        }
+        if (canBeInserted(selectedElement)) {
+            ((FilterContainer) 
selectedElement.getUserObject()).addIncludeTable(newTable);
+            selectedElement.add(new DbImportTreeNode(newTable));
+            updateSelected = true;
+        } else {
+            if (parentElement == null) {
+                parentElement = tree.getRootNode();
+            }
+            ((FilterContainer) 
parentElement.getUserObject()).addIncludeTable(newTable);
+            parentElement.add(new DbImportTreeNode(newTable));
+            updateSelected = false;
+        }
+        if (!isMultipleAction) {
+            updateAfterInsert(updateSelected);
+        }
+        ReverseEngineering reverseEngineeringNewCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        if ((!isMultipleAction) && (!insertableNodeName.equals(EMPTY_NAME))) {
+            DbImportTreeUndoableEdit undoableEdit = new 
DbImportTreeUndoableEdit(
+                    reverseEngineeringOldCopy, reverseEngineeringNewCopy, 
tree, getProjectController()
+            );
+            
getProjectController().getApplication().getUndoManager().addEdit(undoableEdit);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddPatternParamAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddPatternParamAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddPatternParamAction.java
new file mode 100644
index 0000000..78479fc
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddPatternParamAction.java
@@ -0,0 +1,140 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
+import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
+
+import javax.swing.tree.TreePath;
+import java.awt.event.ActionEvent;
+
+/**
+ * @since 4.1
+ */
+public abstract class AddPatternParamAction extends TreeManipulationAction {
+
+    private Class paramClass;
+
+    AddPatternParamAction(String name, Application application) {
+        super(name, application);
+    }
+
+    private void addPatternParamToContainer(Class paramClass, Object 
selectedObject, String name, DbImportTreeNode node) {
+        FilterContainer container = (FilterContainer) selectedObject;
+        PatternParam element = null;
+        if (paramClass == ExcludeTable.class) {
+            element = new ExcludeTable(name);
+            container.addExcludeTable((ExcludeTable) element);
+        } else if (paramClass == IncludeColumn.class) {
+            element = new IncludeColumn(name);
+            container.addIncludeColumn((IncludeColumn) element);
+        } else if (paramClass == ExcludeColumn.class) {
+            element = new ExcludeColumn(name);
+            container.addExcludeColumn((ExcludeColumn) element);
+        } else if (paramClass == IncludeProcedure.class) {
+            element = new IncludeProcedure(name);
+            container.addIncludeProcedure((IncludeProcedure) element);
+        } else if (paramClass == ExcludeProcedure.class) {
+            element = new ExcludeProcedure(name);
+            container.addExcludeProcedure((ExcludeProcedure) element);
+        }
+        node.add(new DbImportTreeNode(element));
+    }
+
+    private void addPatternParamToIncludeTable(Class paramClass, Object 
selectedObject, String name, DbImportTreeNode node) {
+        IncludeTable includeTable = (IncludeTable) selectedObject;
+        PatternParam element = null;
+        if (paramClass == IncludeColumn.class) {
+            element = new IncludeColumn(name);
+            includeTable.addIncludeColumn((IncludeColumn) element);
+
+        } else if (paramClass == ExcludeColumn.class) {
+            element = new ExcludeColumn(name);
+            includeTable.addExcludeColumn((ExcludeColumn) element);
+        }
+        node.add(new DbImportTreeNode(element));
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        tree.stopEditing();
+        String name = insertableNodeName != null ? insertableNodeName : 
EMPTY_NAME;
+        boolean updateSelected;
+        if (tree.getSelectionPath() == null) {
+            TreePath root = new TreePath(tree.getRootNode());
+            tree.setSelectionPath(root);
+        }
+        if (foundNode == null) {
+            selectedElement = tree.getSelectedNode();
+        } else {
+            selectedElement = foundNode;
+        }
+        parentElement = (DbImportTreeNode) selectedElement.getParent();
+        Object selectedObject;
+        ReverseEngineering reverseEngineeringOldCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        if (reverseEngineeringIsEmpty()) {
+            tree.getRootNode().removeAllChildren();
+        }
+        if (canBeInserted(selectedElement)) {
+            selectedObject = selectedElement.getUserObject();
+            if (selectedObject instanceof FilterContainer) {
+                addPatternParamToContainer(paramClass, selectedObject, name, 
selectedElement);
+            } else if (selectedObject instanceof IncludeTable) {
+                addPatternParamToIncludeTable(paramClass, selectedObject, 
name, selectedElement);
+            }
+            updateSelected = true;
+        } else {
+            if (parentElement == null) {
+                parentElement = tree.getRootNode();
+            }
+            selectedObject = parentElement.getUserObject();
+            if (selectedObject instanceof FilterContainer) {
+                addPatternParamToContainer(paramClass, selectedObject, name, 
parentElement);
+            } else if (selectedObject instanceof IncludeTable) {
+                addPatternParamToIncludeTable(paramClass, selectedObject, 
name, parentElement);
+            }
+            updateSelected = false;
+        }
+        if (!isMultipleAction) {
+            updateAfterInsert(updateSelected);
+        }
+        ReverseEngineering reverseEngineeringNewCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        if ((!isMultipleAction) && (!insertableNodeName.equals(EMPTY_NAME))) {
+            DbImportTreeUndoableEdit undoableEdit = new 
DbImportTreeUndoableEdit(
+                    reverseEngineeringOldCopy, reverseEngineeringNewCopy, 
tree, getProjectController()
+            );
+            
getProjectController().getApplication().getUndoManager().addEdit(undoableEdit);
+        }
+    }
+
+    public void setParamClass(Class paramClass) {
+        this.paramClass = paramClass;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddSchemaAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddSchemaAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddSchemaAction.java
new file mode 100644
index 0000000..817b17c
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/AddSchemaAction.java
@@ -0,0 +1,97 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
+import org.apache.cayenne.dbsync.reverse.dbimport.SchemaContainer;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
+import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
+
+import javax.swing.tree.TreePath;
+import java.awt.event.ActionEvent;
+
+/**
+ * @since 4.1
+ */
+public class AddSchemaAction extends TreeManipulationAction {
+
+    private static final String ACTION_NAME = "Add Schema";
+    private static final String ICON_NAME = "icon-dbi-schema.png";
+
+    AddSchemaAction(Application application) {
+        super(ACTION_NAME, application);
+        insertableNodeClass = Schema.class;
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        boolean updateSelected = false;
+        tree.stopEditing();
+        String name = insertableNodeName != null ? insertableNodeName : 
EMPTY_NAME;
+        if (tree.getSelectionPath() == null) {
+            TreePath root = new TreePath(tree.getRootNode());
+            tree.setSelectionPath(root);
+        }
+        if (foundNode == null) {
+            selectedElement = tree.getSelectedNode();
+        } else {
+            selectedElement = foundNode;
+        }
+        parentElement = (DbImportTreeNode) selectedElement.getParent();
+        if (parentElement == null) {
+            parentElement = tree.getRootNode();
+        }
+        Schema newSchema = new Schema(name);
+        ReverseEngineering reverseEngineeringOldCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        if (reverseEngineeringIsEmpty()) {
+            tree.getRootNode().removeAllChildren();
+        }
+        if (canBeInserted(selectedElement)) {
+            ((SchemaContainer) 
selectedElement.getUserObject()).addSchema(newSchema);
+            selectedElement.add(new DbImportTreeNode(newSchema));
+            updateSelected = true;
+        } else if (canInsert()) {
+            if (parentElement.isReverseEngineering()) {
+                ((ReverseEngineering) 
parentElement.getUserObject()).addSchema(newSchema);
+            } else {
+                ((Catalog) parentElement.getUserObject()).addSchema(newSchema);
+            }
+            parentElement.add(new DbImportTreeNode(newSchema));
+            updateSelected = false;
+        }
+        if (!isMultipleAction) {
+            updateAfterInsert(updateSelected);
+        }
+        ReverseEngineering reverseEngineeringNewCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+        if ((!isMultipleAction) && (!insertableNodeName.equals(EMPTY_NAME))) {
+            DbImportTreeUndoableEdit undoableEdit = new 
DbImportTreeUndoableEdit(
+                    reverseEngineeringOldCopy, reverseEngineeringNewCopy, 
tree, getProjectController()
+            );
+            
getProjectController().getApplication().getUndoManager().addEdit(undoableEdit);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
index cd5de6f..0fbaac3 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DBWizardAction.java
@@ -25,7 +25,7 @@ import java.util.Collections;
 import java.util.List;
 
 import javax.swing.JOptionPane;
-       
+
 import org.apache.cayenne.dbsync.reverse.dbload.DbLoader;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.dialog.db.DataSourceWizard;
@@ -44,6 +44,7 @@ public abstract class DBWizardAction<T extends 
DbActionOptionsDialog> extends Ca
     protected DataSourceWizard dataSourceWizardDialog(String title) {
         // connect
         DataSourceWizard connectWizard = new 
DataSourceWizard(getProjectController(), title);
+        connectWizard.setProjectController(getProjectController());
         if (!connectWizard.startupAction()) {
             return null;
         }
@@ -51,7 +52,7 @@ public abstract class DBWizardAction<T extends 
DbActionOptionsDialog> extends Ca
         return connectWizard;
     }
 
-    protected abstract T createDialog(Collection<String> catalogs, 
Collection<String> schemas, String currentCatalog, String currentSchema);
+    protected abstract T createDialog(Collection<String> catalogs, 
Collection<String> schemas, String currentCatalog, String currentSchema, int 
command);
 
     protected T loaderOptionDialog(DataSourceWizard connectWizard) {
 
@@ -81,16 +82,24 @@ public abstract class DBWizardAction<T extends 
DbActionOptionsDialog> extends Ca
                     JOptionPane.ERROR_MESSAGE);
             return null;
         }
-
-        final T optionsDialog = createDialog(catalogs, schemas, 
currentCatalog, currentSchema);
+        T optionsDialog = getStartDialog(catalogs, schemas, currentCatalog, 
currentSchema);
         optionsDialog.setVisible(true);
-        if (optionsDialog.getChoice() == DbActionOptionsDialog.SELECT) {
-            return optionsDialog;
+        while ((optionsDialog.getChoice() != DbActionOptionsDialog.CANCEL)) {
+            if (optionsDialog.getChoice() == DbActionOptionsDialog.SELECT) {
+                return optionsDialog;
+            }
+            optionsDialog = createDialog(catalogs, schemas, currentCatalog, 
currentSchema, optionsDialog.getChoice());
+            optionsDialog.setVisible(true);
         }
 
         return null;
     }
 
+    private T getStartDialog(List<String> catalogs, List<String> schemas, 
String currentCatalog, String currentSchema) {
+        int command = DbActionOptionsDialog.SELECT;
+        return createDialog(catalogs, schemas, currentCatalog, currentSchema, 
command);
+    }
+
     @SuppressWarnings("unchecked")
     private List<String> getCatalogs(DataSourceWizard connectWizard, 
Connection connection) throws Exception {
         if(!connectWizard.getAdapter().supportsCatalogsOnReverseEngineering()) 
{

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java
index 700b951..b3755cd 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DbEntityCounterpartAction.java
@@ -21,6 +21,9 @@ package org.apache.cayenne.modeler.action;
 
 import java.util.Iterator;
 
+import javax.swing.tree.TreePath;
+
+import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjEntity;

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
index fa427f8..a626365 100644
--- 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DefaultActionManager.java
@@ -98,6 +98,20 @@ public class DefaultActionManager implements ActionManager {
         registerAction(new ImportEOModelAction(application));
         registerAction(new GenerateDBAction(application));
         registerAction(new MigrateAction(application));
+        registerAction(new AddSchemaAction(application)).setAlwaysOn(true);
+        registerAction(new AddCatalogAction(application)).setAlwaysOn(true);
+        registerAction(new 
AddIncludeTableAction(application)).setAlwaysOn(true);
+        registerAction(new 
AddExcludeTableAction(application)).setAlwaysOn(true);
+        registerAction(new 
AddIncludeColumnAction(application)).setAlwaysOn(true);
+        registerAction(new 
AddExcludeColumnAction(application)).setAlwaysOn(true);
+        registerAction(new 
AddIncludeProcedureAction(application)).setAlwaysOn(true);
+        registerAction(new 
AddExcludeProcedureAction(application)).setAlwaysOn(true);
+        registerAction(new 
GetDbConnectionAction(application)).setAlwaysOn(true);
+        registerAction(new EditNodeAction(application)).setAlwaysOn(true);
+        registerAction(new DeleteNodeAction(application)).setAlwaysOn(true);
+        registerAction(new 
MoveImportNodeAction(application)).setAlwaysOn(true);
+        registerAction(new LoadDbSchemaAction(application)).setAlwaysOn(true);
+        registerAction(new 
MoveInvertNodeAction(application)).setAlwaysOn(true);
         registerAction(new AboutAction(application)).setAlwaysOn(true);
         registerAction(new DocumentationAction(application)).setAlwaysOn(true);
         registerAction(new 
ConfigurePreferencesAction(application)).setAlwaysOn(true);

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DeleteNodeAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DeleteNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DeleteNodeAction.java
new file mode 100644
index 0000000..4645ee7
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/DeleteNodeAction.java
@@ -0,0 +1,175 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.Catalog;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.ExcludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeColumn;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeProcedure;
+import org.apache.cayenne.dbsync.reverse.dbimport.IncludeTable;
+import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.dbsync.reverse.dbimport.Schema;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
+import org.apache.cayenne.modeler.editor.DbImportModel;
+import org.apache.cayenne.modeler.editor.DbImportView;
+import org.apache.cayenne.modeler.editor.DraggableTreePanel;
+import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
+
+import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreePath;
+import java.awt.event.ActionEvent;
+import java.util.ArrayList;
+
+/**
+ * @since 4.1
+ */
+public class DeleteNodeAction extends TreeManipulationAction {
+
+    private static final String ACTION_NAME = "Delete";
+    private static final String ICON_NAME = "icon-trash.png";
+
+    private DraggableTreePanel panel;
+
+    DeleteNodeAction(Application application) {
+        super(ACTION_NAME, application);
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+
+    private void removePatternParams(FilterContainer container, Object 
selectedObject) {
+        container.getExcludeTables().remove(selectedObject);
+        container.getIncludeColumns().remove(selectedObject);
+        container.getExcludeColumns().remove(selectedObject);
+        container.getIncludeProcedures().remove(selectedObject);
+        container.getExcludeProcedures().remove(selectedObject);
+    }
+
+    private void deleteChilds(Catalog catalog) {
+        Object selectedObject = this.selectedElement.getUserObject();
+        if (selectedObject instanceof Schema) {
+            catalog.getSchemas().remove(selectedObject);
+        } else if (selectedObject instanceof IncludeTable) {
+            catalog.getIncludeTables().remove(selectedObject);
+        } else if (selectedObject instanceof PatternParam) {
+            removePatternParams(catalog, selectedObject);
+        }
+    }
+
+    private void deleteChilds(Schema schema) {
+        Object selectedObject = this.selectedElement.getUserObject();
+        if (selectedObject instanceof IncludeTable) {
+            schema.getIncludeTables().remove(selectedObject);
+        } else if (selectedObject instanceof PatternParam) {
+            removePatternParams(schema, selectedObject);
+        }
+    }
+
+    private void deleteChilds(IncludeTable includeTable) {
+        Object selectedObject = this.selectedElement.getUserObject();
+        includeTable.getIncludeColumns().remove(selectedObject);
+        includeTable.getExcludeColumns().remove(selectedObject);
+    }
+
+    private void deleteChilds(ReverseEngineering reverseEngineering) {
+        Object selectedObject = this.selectedElement.getUserObject();
+        if (selectedObject instanceof Catalog) {
+            reverseEngineering.getCatalogs().remove(selectedObject);
+        } else if (selectedObject instanceof Schema) {
+            reverseEngineering.getSchemas().remove(selectedObject);
+        } else if (selectedObject instanceof IncludeTable) {
+            reverseEngineering.getIncludeTables().remove(selectedObject);
+        } else if (selectedObject instanceof ExcludeTable) {
+            reverseEngineering.getExcludeTables().remove(selectedObject);
+        } else if (selectedObject instanceof IncludeColumn) {
+            reverseEngineering.getIncludeColumns().remove(selectedObject);
+        } else if (selectedObject instanceof ExcludeColumn) {
+            reverseEngineering.getExcludeColumns().remove(selectedObject);
+        } else if (selectedObject instanceof IncludeProcedure) {
+            reverseEngineering.getIncludeProcedures().remove(selectedObject);
+        } else if (selectedObject instanceof ExcludeProcedure) {
+            reverseEngineering.getExcludeProcedures().remove(selectedObject);
+        }
+    }
+
+    private void updateParentChilds() {
+        DbImportModel model = (DbImportModel) tree.getModel();
+        model.removeNodeFromParent(selectedElement);
+        getProjectController().setDirty(true);
+        model.reload(parentElement);
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        tree.stopEditing();
+        final TreePath[] paths = tree.getSelectionPaths();
+        final DbImportView rootParent = ((DbImportView) 
panel.getParent().getParent());
+        rootParent.getLoadDbSchemaButton().setEnabled(false);
+        rootParent.getReverseEngineeringProgress().setVisible(true);
+        if (paths != null) {
+            ReverseEngineering reverseEngineeringOldCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+            rootParent.lockToolbarButtons();
+            for (TreePath path : paths) {
+                selectedElement = (DbImportTreeNode) 
path.getLastPathComponent();
+                parentElement = (DbImportTreeNode) selectedElement.getParent();
+                if (parentElement != null) {
+                    Object parentUserObject = parentElement.getUserObject();
+                    if (parentUserObject instanceof ReverseEngineering) {
+                        ReverseEngineering reverseEngineering = 
(ReverseEngineering) parentUserObject;
+                        deleteChilds(reverseEngineering);
+                    } else if (parentUserObject instanceof Catalog) {
+                        Catalog catalog = (Catalog) parentUserObject;
+                        deleteChilds(catalog);
+                    } else if (parentUserObject instanceof Schema) {
+                        Schema schema = (Schema) parentUserObject;
+                        deleteChilds(schema);
+                    } else if (parentUserObject instanceof IncludeTable) {
+                        IncludeTable includeTable = (IncludeTable) 
parentUserObject;
+                        deleteChilds(includeTable);
+                    }
+                }
+            }
+            if (paths.length > 1) {
+                getProjectController().setDirty(true);
+                ArrayList<DbImportTreeNode> expandList = 
tree.getTreeExpandList();
+                
tree.translateReverseEngineeringToTree(tree.getReverseEngineering(), false);
+                tree.expandTree(expandList);
+            } else {
+                updateParentChilds();
+            }
+            ReverseEngineering reverseEngineeringNewCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+            getProjectController().getApplication().getUndoManager().addEdit(
+                    new DbImportTreeUndoableEdit(reverseEngineeringOldCopy, 
reverseEngineeringNewCopy, tree, getProjectController())
+            );
+            rootParent.getLoadDbSchemaButton().setEnabled(true);
+            rootParent.getReverseEngineeringProgress().setVisible(false);
+        }
+    }
+
+    public void setPanel(DraggableTreePanel panel) {
+        this.panel = panel;
+    }
+}

http://git-wip-us.apache.org/repos/asf/cayenne/blob/2ead78b6/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/EditNodeAction.java
----------------------------------------------------------------------
diff --git 
a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/EditNodeAction.java
 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/EditNodeAction.java
new file mode 100644
index 0000000..ac0fa46
--- /dev/null
+++ 
b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/EditNodeAction.java
@@ -0,0 +1,93 @@
+/*****************************************************************
+ *   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
+ *
+ *    http://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.action;
+
+import org.apache.cayenne.dbsync.reverse.dbimport.FilterContainer;
+import org.apache.cayenne.dbsync.reverse.dbimport.PatternParam;
+import org.apache.cayenne.dbsync.reverse.dbimport.ReverseEngineering;
+import org.apache.cayenne.modeler.Application;
+import org.apache.cayenne.modeler.dialog.db.load.DbImportTreeNode;
+import org.apache.cayenne.modeler.undo.DbImportTreeUndoableEdit;
+import org.apache.cayenne.util.Util;
+
+import java.awt.event.ActionEvent;
+
+/**
+ * @since 4.1
+ */
+public class EditNodeAction extends TreeManipulationAction {
+
+    private static final String ACTION_NAME = "Rename";
+    private static final String ICON_NAME = "icon-edit.png";
+
+    private String actionName;
+
+    EditNodeAction(Application application) {
+        super(ACTION_NAME, application);
+    }
+
+    public String getIconName() {
+        return ICON_NAME;
+    }
+
+    @Override
+    public void performAction(ActionEvent e) {
+        if (tree.isEditing()) {
+            return;
+        }
+        if (e != null) {
+            if (tree.getSelectionPath() != null) {
+                tree.startEditingAtPath(tree.getSelectionPath());
+            }
+        }
+        if (actionName == null) {
+            return;
+        }
+        if (tree.getSelectionPath() != null) {
+            selectedElement = tree.getSelectedNode();
+            parentElement = (DbImportTreeNode) selectedElement.getParent();
+            if (parentElement != null) {
+                Object selectedObject = selectedElement.getUserObject();
+                ReverseEngineering reverseEngineeringOldCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+                if (!Util.isEmptyString(actionName)) {
+                    if (selectedObject instanceof FilterContainer) {
+                        ((FilterContainer) selectedObject).setName(actionName);
+                    } else if (selectedObject instanceof PatternParam) {
+                        ((PatternParam) selectedObject).setPattern(actionName);
+                    }
+                    updateModel(true);
+                    selectedElement = null;
+                }
+                ReverseEngineering reverseEngineeringNewCopy = new 
ReverseEngineering(tree.getReverseEngineering());
+                if (!actionName.equals(EMPTY_NAME)) {
+                    DbImportTreeUndoableEdit undoableEdit = new 
DbImportTreeUndoableEdit(
+                            reverseEngineeringOldCopy, 
reverseEngineeringNewCopy, tree, getProjectController()
+                    );
+                    
getProjectController().getApplication().getUndoManager().addEdit(undoableEdit);
+                }
+            }
+        }
+    }
+
+    public void setActionName(String name) {
+        this.actionName = name;
+    }
+
+}

Reply via email to