You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2022/07/14 14:35:05 UTC

[cayenne] branch master updated: Code cleanup related to added generics in the Entity/Attribute/Relationship hierarchy

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 474de1353 Code cleanup related to added generics in the Entity/Attribute/Relationship hierarchy
474de1353 is described below

commit 474de13531c7b9ecd4ab995b536c69195675cf86
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Thu Jul 14 17:34:54 2022 +0300

    Code cleanup related to added generics in the Entity/Attribute/Relationship hierarchy
---
 .../java/org/apache/cayenne/gen/DataMapUtils.java  |  13 ++-
 .../java/org/apache/cayenne/gen/EntityUtils.java   |   9 +-
 .../org/apache/cayenne/gen/DataMapUtilsTest.java   |  17 +++-
 .../cayenne/dbsync/merge/DbEntityMerger.java       |   9 +-
 .../dbsync/merge/context/EntityMergeSupport.java   |  13 +--
 .../dbsync/reverse/dbload/RelationshipLoader.java  |   1 -
 .../dbimport/ManyToManyCandidateEntityTest.java    |  15 ++-
 .../project/validation/SelectQueryValidator.java   |  14 +--
 .../jdbc/reader/DefaultRowReaderFactory.java       |  20 ++--
 .../org/apache/cayenne/dba/QuotingStrategy.java    |   4 +-
 .../org/apache/cayenne/exp/parser/ASTDbIdPath.java |   4 +-
 .../org/apache/cayenne/exp/parser/ASTDbPath.java   |   5 +-
 .../org/apache/cayenne/exp/parser/ASTObjPath.java  |   7 +-
 .../org/apache/cayenne/exp/parser/ASTPath.java     |   8 +-
 .../org/apache/cayenne/map/AliasPathComponent.java |  17 ++--
 .../java/org/apache/cayenne/map/Attribute.java     |  10 +-
 .../java/org/apache/cayenne/map/DbAttribute.java   |  13 ++-
 .../org/apache/cayenne/map/DbRelationship.java     |   9 +-
 .../main/java/org/apache/cayenne/map/Entity.java   |  50 +++++-----
 .../org/apache/cayenne/map/EntityResolver.java     |   4 +-
 .../java/org/apache/cayenne/map/PathComponent.java |   8 +-
 .../apache/cayenne/map/PathComponentIterator.java  |  28 +++---
 .../java/org/apache/cayenne/map/Relationship.java  |  19 ++--
 .../cayenne/map/RelationshipPathComponent.java     |  18 ++--
 .../apache/cayenne/map/event/AttributeEvent.java   |  12 +--
 .../org/apache/cayenne/map/event/EntityEvent.java  |  12 +--
 .../cayenne/map/event/RelationshipEvent.java       |  16 ++--
 .../cayenne/access/DataContextEJBQLDeletePKIT.java |   3 +-
 .../java/org/apache/cayenne/map/MockAttribute.java |   2 -
 .../apache/cayenne/map/MockObjRelationship.java    |   2 -
 .../org/apache/cayenne/map/MockRelationship.java   |   5 +-
 .../apache/cayenne/modeler/ProjectTreeModel.java   |  14 +--
 .../apache/cayenne/modeler/ProjectTreeView.java    |   4 +-
 .../modeler/action/BaseViewEntityAction.java       |   6 +-
 .../modeler/action/CreateAttributeAction.java      |   2 +-
 .../modeler/action/CreateDbEntityAction.java       |   2 +-
 .../modeler/action/CreateRelationshipAction.java   |   2 +-
 .../modeler/action/DbEntityCounterpartAction.java  |   2 +-
 .../apache/cayenne/modeler/action/FindAction.java  |  18 ++--
 .../modeler/action/ObjEntityCounterpartAction.java |   4 +-
 .../action/ObjEntityToSuperEntityAction.java       |   3 +-
 .../modeler/action/RemoveAttributeAction.java      |   2 +-
 .../InferRelationshipsController.java              |  20 ++--
 .../autorelationship/InferRelationshipsDialog.java |   6 +-
 .../dialog/objentity/ObjAttributeInfoDialog.java   |  24 ++---
 .../dialog/objentity/ObjRelationshipInfo.java      |  15 ++-
 .../dialog/objentity/ObjRelationshipInfoView.java  |  12 +--
 .../dialog/validator/AttributeErrorMsg.java        |  27 ++----
 .../modeler/dialog/validator/EntityErrorMsg.java   |   6 +-
 .../dialog/validator/RelationshipErrorMsg.java     |   8 +-
 .../editor/CallbackDescriptorTableModel.java       |   2 +-
 .../modeler/editor/ObjEntityTabbedView.java        |   6 +-
 .../modeler/editor/ObjRelationshipTableModel.java  |  23 +++--
 .../modeler/editor/RootSelectionHandler.java       |   2 +-
 .../modeler/editor/SQLTemplatePrefetchTab.java     |   8 +-
 .../modeler/editor/SelectPropertiesPanel.java      |  24 ++---
 .../cayenne/modeler/editor/SelectQueryMainTab.java |   4 +-
 .../modeler/editor/SelectQueryOrderingTab.java     |  33 ++-----
 .../modeler/editor/SelectQueryPrefetchTab.java     |   6 +-
 .../editor/dbentity/DbEntityTabbedView.java        |   2 +-
 .../editor/wrapper/ObjAttributeWrapper.java        |   1 -
 .../modeler/event/AttributeDisplayEvent.java       |  12 +--
 .../cayenne/modeler/event/EntityDisplayEvent.java  |  12 +--
 .../modeler/event/RelationshipDisplayEvent.java    |  12 +--
 .../cayenne/modeler/graph/BaseGraphBuilder.java    |  68 +++++++-------
 .../cayenne/modeler/graph/DataDomainGraphTab.java  |   4 +-
 .../cayenne/modeler/graph/DbGraphBuilder.java      |  31 ++++---
 .../cayenne/modeler/graph/EntityCellMetadata.java  |  13 +--
 .../apache/cayenne/modeler/graph/GraphBuilder.java |   6 +-
 .../cayenne/modeler/graph/ObjGraphBuilder.java     |  38 ++++----
 .../modeler/graph/action/EntityDisplayAction.java  |   4 +-
 .../modeler/graph/action/RemoveEntityAction.java   |   6 +-
 .../graph/action/ShowGraphEntityAction.java        |   7 +-
 .../cayenne/modeler/undo/RemoveUndoableEdit.java   | 102 +++++----------------
 .../apache/cayenne/modeler/util/CayenneAction.java |   2 +-
 .../cayenne/modeler/util/CayenneTableModel.java    |  13 ++-
 .../apache/cayenne/modeler/util/CellRenderers.java |   3 +-
 .../util/DbAttributePathComboBoxEditor.java        |  21 ++---
 .../util/DbRelationshipPathComboBoxEditor.java     |  12 +--
 .../EntityTreeAttributeRelationshipFilter.java     |  11 +--
 .../cayenne/modeler/util/EntityTreeFilter.java     |   4 +-
 .../modeler/util/EntityTreeRelationshipFilter.java |   6 +-
 .../util/PathChooserComboBoxCellEditor.java        |  12 +--
 .../apache/cayenne/modeler/util/ProjectUtil.java   |  39 +++-----
 .../util/state/AttributeDisplayEventType.java      |  10 +-
 .../modeler/util/state/EntityDisplayEventType.java |   4 +-
 .../util/state/RelationshipDisplayEventType.java   |  10 +-
 .../cayenne/modeler/event/AttributeEventTest.java  |   4 +-
 .../cayenne/modeler/event/EntityEventTest.java     |  20 ++--
 .../modeler/event/RelationshipEventTest.java       |   5 +-
 .../java/org/apache/cayenne/wocompat/EOQuery.java  |  60 ++++++------
 91 files changed, 535 insertions(+), 671 deletions(-)

diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
index 57b0ba33e..455ae0e53 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/DataMapUtils.java
@@ -24,7 +24,6 @@ import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.exp.ExpressionParameter;
 import org.apache.cayenne.exp.parser.ASTList;
 import org.apache.cayenne.exp.parser.ASTObjPath;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
@@ -73,10 +72,10 @@ public class DataMapUtils {
 	 * @param query select query descriptor
 	 * @return Parameter names.
 	 */
-	public Collection getParameterNames(SelectQueryDescriptor query) {
+	public Collection<String> getParameterNames(SelectQueryDescriptor query) {
 
 		if (query.getQualifier() == null) {
-			return Collections.EMPTY_SET;
+			return Collections.emptySet();
 		}
 
 		Map<String, String> queryParameters = queriesMap.get(query.getName());
@@ -130,7 +129,7 @@ public class DataMapUtils {
 	 *            to be parsed
 	 * @return List of parameter names.
 	 */
-	private Set parseQualifier(String qualifierString) {
+	private Set<String> parseQualifier(String qualifierString) {
 		Set<String> result = new LinkedHashSet<>();
 		Pattern pattern = Pattern.compile("\\$[\\w]+");
 		Matcher matcher = pattern.matcher(qualifierString);
@@ -143,7 +142,7 @@ public class DataMapUtils {
 	}
 
 	public boolean hasParameters(SelectQueryDescriptor query) {
-		Map queryParameters = queriesMap.get(query.getName());
+		Map<String, String> queryParameters = queriesMap.get(query.getName());
 
 		if (queryParameters == null) {
 			return false;
@@ -178,8 +177,8 @@ public class DataMapUtils {
 				}
 
 				if (operand instanceof ASTObjPath) {
-					PathComponent<ObjAttribute, ObjRelationship> component = ((Entity) root).lastPathComponent(
-							(ASTObjPath) operand, Collections.emptyMap());
+					PathComponent<ObjAttribute, ObjRelationship> component = ((ObjEntity) root)
+							.lastPathComponent((ASTObjPath) operand, Collections.emptyMap());
 					ObjAttribute attribute = component.getAttribute();
 					if (attribute != null) {
 						typeName = attribute.getType();
diff --git a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
index aa30abac8..dbe0bc422 100644
--- a/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
+++ b/cayenne-cgen/src/main/java/org/apache/cayenne/gen/EntityUtils.java
@@ -30,7 +30,6 @@ import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Relationship;
 
 /**
  * Attributes and Methods for working with ObjEntities.
@@ -133,7 +132,7 @@ public class EntityUtils {
             return false;
         }
 
-        for (Relationship r : anObjEntity.getRelationships()) {
+        for (ObjRelationship r : anObjEntity.getRelationships()) {
             if (r.isToMany()) {
                 return true;
             }
@@ -163,7 +162,7 @@ public class EntityUtils {
             return false;
         }
 
-        for (Relationship r : anObjEntity.getDeclaredRelationships()) {
+        for (ObjRelationship r : anObjEntity.getDeclaredRelationships()) {
             if (r.isToMany()) {
                 return true;
             }
@@ -188,7 +187,7 @@ public class EntityUtils {
             return false;
         }
 
-        for (Relationship r : anObjEntity.getRelationships()) {
+        for (ObjRelationship r : anObjEntity.getRelationships()) {
             if (!r.isToMany()) {
                 return true;
             }
@@ -214,7 +213,7 @@ public class EntityUtils {
             return false;
         }
 
-        for (Relationship r : anObjEntity.getDeclaredRelationships()) {
+        for (ObjRelationship r : anObjEntity.getDeclaredRelationships()) {
             if (!r.isToMany()) {
                 return true;
             }
diff --git a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/DataMapUtilsTest.java b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/DataMapUtilsTest.java
index 89a7a5e09..10d86b6a6 100644
--- a/cayenne-cgen/src/test/java/org/apache/cayenne/gen/DataMapUtilsTest.java
+++ b/cayenne-cgen/src/test/java/org/apache/cayenne/gen/DataMapUtilsTest.java
@@ -19,15 +19,22 @@
 
 package org.apache.cayenne.gen;
 
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.SelectQueryDescriptor;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.*;
-
 import static org.junit.Assert.assertEquals;
 
 public class DataMapUtilsTest {
@@ -66,7 +73,7 @@ public class DataMapUtilsTest {
         map.put(param, "java.lang.String");
 
         dataMapUtils.queriesMap.put("name", map);
-        Collection collection = dataMapUtils.getParameterNames(selectQueryDescriptor);
+        Collection<String> collection = dataMapUtils.getParameterNames(selectQueryDescriptor);
 
         result.add(param);
 
@@ -93,7 +100,7 @@ public class DataMapUtilsTest {
         selectQueryDescriptor.setName("name");
         selectQueryDescriptor.setRoot(objEntity);
 
-        Collection collection = dataMapUtils.getParameterNames(selectQueryDescriptor);
+        Collection<String> collection = dataMapUtils.getParameterNames(selectQueryDescriptor);
 
         Map<String, Map<String, String>> queriesMap = new HashMap<>();
         Map<String, String> map = new HashMap<>();
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
index 114e8e1d6..1d600a9ad 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/DbEntityMerger.java
@@ -29,7 +29,6 @@ import java.util.Set;
 import org.apache.cayenne.dbsync.merge.factory.MergerTokenFactory;
 import org.apache.cayenne.dbsync.merge.token.MergerToken;
 import org.apache.cayenne.dbsync.reverse.filters.FiltersConfig;
-import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -40,8 +39,8 @@ class DbEntityMerger extends AbstractMerger<DataMap, DbEntity> {
 
     private final FiltersConfig filtersConfig;
     private final boolean skipPKTokens;
-    private DataMap originalDataMap;
-    private DataMap importedDataMap;
+    private final DataMap originalDataMap;
+    private final DataMap importedDataMap;
 
     DbEntityMerger(MergerTokenFactory tokenFactory, DataMap original, DataMap imported,
                    FiltersConfig filtersConfig, boolean skipPKTokens) {
@@ -129,9 +128,9 @@ class DbEntityMerger extends AbstractMerger<DataMap, DbEntity> {
         );
     }
 
-    private Set<String> upperCaseEntityNames(Collection<? extends Attribute> attributes) {
+    private Set<String> upperCaseEntityNames(Collection<DbAttribute> attributes) {
         Set<String> names = new HashSet<>();
-        for (Attribute attr : attributes) {
+        for (DbAttribute attr : attributes) {
             names.add(attr.getName().toUpperCase());
         }
         return names;
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java
index 726e3efc1..80af49e80 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/merge/context/EntityMergeSupport.java
@@ -31,11 +31,9 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.util.DeleteRuleUpdater;
 import org.apache.cayenne.util.EntityMergeListener;
 import org.slf4j.Logger;
@@ -213,11 +211,7 @@ public class EntityMergeSupport {
         Map<String, ObjEntity> objEntities = entity.getDataMap().getSubclassesForObjEntity(entity);
 
         boolean hasFlattingAttributes = false;
-        boolean needGeneratedEntity = true;
-
-        if (objEntities.containsKey(targetEntityName)) {
-            needGeneratedEntity = false;
-        }
+        boolean needGeneratedEntity = !objEntities.containsKey(targetEntityName);
 
         for (ObjEntity subObjEntity : objEntities.values()) {
             for (ObjAttribute objAttribute : subObjEntity.getAttributes()) {
@@ -275,7 +269,7 @@ public class EntityMergeSupport {
                 }
             }
         } else {
-            for (Entity mappedTarget : mappedObjEntities) {
+            for (ObjEntity mappedTarget : mappedObjEntities) {
                 createObjRelationship(entity, dbRelationship, mappedTarget.getName());
             }
         }
@@ -406,8 +400,7 @@ public class EntityMergeSupport {
             return false;
         }
 
-        for(Relationship relationship : entity.getRelationships()) {
-            ObjRelationship objRelationship = (ObjRelationship)relationship;
+        for(ObjRelationship objRelationship : entity.getRelationships()) {
             if(objRelationshipHasDbRelationship(objRelationship, dbRelationship)) {
                 return false;
             }
diff --git a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java
index 2bd96ceac..fdd2899b1 100644
--- a/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java
+++ b/cayenne-dbsync/src/main/java/org/apache/cayenne/dbsync/reverse/dbload/RelationshipLoader.java
@@ -31,7 +31,6 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.util.EqualsBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java
index 6d339c49e..be7da727a 100644
--- a/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java
+++ b/cayenne-dbsync/src/test/java/org/apache/cayenne/dbsync/reverse/dbimport/ManyToManyCandidateEntityTest.java
@@ -42,7 +42,6 @@ import org.apache.cayenne.di.spi.DefaultAdhocObjectFactory;
 import org.apache.cayenne.di.spi.DefaultClassLoaderManager;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.resource.URLResource;
 import org.junit.Before;
 import org.junit.Test;
@@ -84,14 +83,14 @@ public class ManyToManyCandidateEntityTest {
     }
 
     @Test
-    public void testMatchingForManyToManyEntity() throws Exception {
+    public void testMatchingForManyToManyEntity() {
         ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
 
         assertNotNull(ManyToManyCandidateEntity.build(manyToManyEntity));
     }
 
     @Test
-    public void testMatchingForNotManyToManyEntity() throws Exception {
+    public void testMatchingForNotManyToManyEntity() {
         ObjEntity entity = map.getObjEntity("Table1");
 
         assertNull(ManyToManyCandidateEntity.build(entity));
@@ -101,19 +100,17 @@ public class ManyToManyCandidateEntityTest {
     public void testOptimisationForManyToManyEntity() {
         ObjEntity manyToManyEntity = map.getObjEntity("Table1Table2");
 
-        ManyToManyCandidateEntity.build(manyToManyEntity).optimizeRelationships(
-                new DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
+        ManyToManyCandidateEntity.build(manyToManyEntity)
+                .optimizeRelationships(new DefaultObjectNameGenerator(NoStemStemmer.getInstance()));
 
         ObjEntity table1Entity = map.getObjEntity("Table1");
         ObjEntity table2Entity = map.getObjEntity("Table2");
 
         assertEquals(1, table1Entity.getRelationships().size());
-        assertEquals(table2Entity, new ArrayList<Relationship>(table1Entity.getRelationships()).get(0)
-                .getTargetEntity());
+        assertEquals(table2Entity, new ArrayList<>(table1Entity.getRelationships()).get(0).getTargetEntity());
 
         assertEquals(1, table2Entity.getRelationships().size());
-        assertEquals(table1Entity, new ArrayList<Relationship>(table2Entity.getRelationships()).get(0)
-                .getTargetEntity());
+        assertEquals(table1Entity, new ArrayList<>(table2Entity.getRelationships()).get(0).getTargetEntity());
     }
 
 }
diff --git a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
index e27c87a72..8d8ad578f 100644
--- a/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
+++ b/cayenne-project/src/main/java/org/apache/cayenne/project/validation/SelectQueryValidator.java
@@ -39,7 +39,7 @@ class SelectQueryValidator extends BaseQueryValidator {
         validateCacheGroup(query, validationResult);
 
         // Resolve root to Entity for further validation
-        Entity root = validateRoot(query, validationResult);
+        Entity<?,?,?> root = validateRoot(query, validationResult);
 
         // validate path-based parts
         if (root != null) {
@@ -58,13 +58,13 @@ class SelectQueryValidator extends BaseQueryValidator {
         }
     }
 
-    void validatePrefetch(Entity root, String path, ValidationResult validationResult) {
+    void validatePrefetch(Entity<?,?,?> root, String path, ValidationResult validationResult) {
         // TODO: andrus 03/10/2010 - should this be implemented?
     }
 
     void validateOrdering(
             QueryDescriptor query,
-            Entity root,
+            Entity<?,?,?> root,
             Ordering ordering,
             ValidationResult validationResult) {
        
@@ -81,13 +81,13 @@ class SelectQueryValidator extends BaseQueryValidator {
     }
 
     void validateQualifier(
-            Entity root,
+            Entity<?,?,?> root,
             Expression qualifier,
             ValidationResult validationResult) {
         // TODO: andrus 03/10/2010 - should this be implemented?
     }
 
-    Entity validateRoot(QueryDescriptor query, ValidationResult validationResult) {
+    Entity<?,?,?> validateRoot(QueryDescriptor query, ValidationResult validationResult) {
         DataMap map = query.getDataMap();
         if (query.getRoot() == null && map != null) {
             addFailure(validationResult, query, "Query '%s' has no root", query.getName());
@@ -101,11 +101,11 @@ class SelectQueryValidator extends BaseQueryValidator {
 
         if (map == null) {
             // maybe standalone entity, otherwise bail...
-            return (query.getRoot() instanceof Entity) ? (Entity) query.getRoot() : null;
+            return (query.getRoot() instanceof Entity) ? (Entity<?,?,?>) query.getRoot() : null;
         }
 
         if (query.getRoot() instanceof Entity) {
-            return (Entity) query.getRoot();
+            return (Entity<?,?,?>) query.getRoot();
         }
 
         // can't validate Class root - it is likely not accessible from here...
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java
index 4394a08ed..a22ea0b5e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/jdbc/reader/DefaultRowReaderFactory.java
@@ -33,8 +33,8 @@ import org.apache.cayenne.access.types.ExtendedType;
 import org.apache.cayenne.access.types.ExtendedTypeMap;
 import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.dba.TypesMapping;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
+import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.EmbeddableResultSegment;
 import org.apache.cayenne.query.EntityResultSegment;
 import org.apache.cayenne.query.QueryMetadata;
@@ -129,12 +129,12 @@ public class DefaultRowReaderFactory implements RowReaderFactory {
 		}
 	}
 
-	protected class PostprocessorFactory {
+	protected static class PostprocessorFactory {
 
-		private QueryMetadata queryMetadata;
-		private ExtendedTypeMap extendedTypes;
-		private Map<ObjAttribute, ColumnDescriptor> attributeOverrides;
-		private RowDescriptor rowDescriptor;
+		private final QueryMetadata queryMetadata;
+		private final ExtendedTypeMap extendedTypes;
+		private final Map<ObjAttribute, ColumnDescriptor> attributeOverrides;
+		private final RowDescriptor rowDescriptor;
 
 		private boolean created;
 		private DataRowPostProcessor postProcessor;
@@ -170,7 +170,7 @@ public class DefaultRowReaderFactory implements RowReaderFactory {
 			for (Entry<ObjAttribute, ColumnDescriptor> entry : attributeOverrides.entrySet()) {
 
 				ObjAttribute attribute = entry.getKey();
-				Entity entity = attribute.getEntity();
+				ObjEntity entity = attribute.getEntity();
 
 				String key = null;
 				int jdbcType = TypesMapping.NOT_DEFINED;
@@ -195,9 +195,9 @@ public class DefaultRowReaderFactory implements RowReaderFactory {
 					continue;
 				}
 
-				ExtendedType converter = extendedTypes.getRegisteredType(attribute.getType());
-
-				Collection<ColumnOverride> overrides = columnOverrides.computeIfAbsent(entity.getName(), k -> new ArrayList<>(3));
+				ExtendedType<?> converter = extendedTypes.getRegisteredType(attribute.getType());
+				Collection<ColumnOverride> overrides = columnOverrides
+						.computeIfAbsent(entity.getName(), k -> new ArrayList<>(3));
 				overrides.add(new ColumnOverride(index, key, converter, jdbcType));
 			}
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/QuotingStrategy.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/QuotingStrategy.java
index 7c86e68c2..011bcc4b2 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/QuotingStrategy.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/QuotingStrategy.java
@@ -58,7 +58,7 @@ public interface QuotingStrategy {
     /**
      * @since 4.0
      */
-    default String quotedIdentifier(Entity entity, String... identifierParts) {
+    default String quotedIdentifier(DbEntity entity, String... identifierParts) {
         return quotedIdentifier(entity.getDataMap(), identifierParts);
     }
     
@@ -71,7 +71,7 @@ public interface QuotingStrategy {
      * Append quoted identifier to provided appender
      * @since 4.2
      */
-    default void quotedIdentifier(Entity entity, CharSequence identifier, Appendable appender) {
+    default void quotedIdentifier(DbEntity entity, CharSequence identifier, Appendable appender) {
         quotedIdentifier(entity.getDataMap(), identifier, appender);
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbIdPath.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbIdPath.java
index 30568f7b5..5d7ee1b50 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbIdPath.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbIdPath.java
@@ -99,13 +99,13 @@ public class ASTDbIdPath extends ASTDbPath {
     @Override
     protected Object evaluateNode(Object o) {
         if (o instanceof Entity) {
-            return evaluateEntityNode((Entity) o);
+            return evaluateEntityNode((Entity<?,?,?>) o);
         }
         return evaluateNode(o, path);
     }
 
     @Override
-    protected CayenneMapEntry evaluateEntityNode(Entity entity) {
+    protected CayenneMapEntry evaluateEntityNode(Entity<?,?,?> entity) {
         int lastDot = path.lastIndexOf('.');
         String objPath = null;
         String id = path;
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java
index dae38b989..cc4281e07 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTDbPath.java
@@ -68,7 +68,7 @@ public class ASTDbPath extends ASTPath {
 	protected Object evaluateNode(Object o) throws Exception {
 
 		if (o instanceof Entity) {
-			return evaluateEntityNode((Entity) o);
+			return evaluateEntityNode((Entity<?,?,?>) o);
 		}
 
 		Map<?, ?> map = toMap(o);
@@ -199,7 +199,8 @@ public class ASTDbPath extends ASTPath {
 	/**
 	 * Helper method to evaluate path expression with Cayenne Entity.
 	 */
-	protected CayenneMapEntry evaluateEntityNode(Entity entity) {
+	@Override
+	protected CayenneMapEntry evaluateEntityNode(Entity<?,?,?> entity) {
 		if(entity instanceof ObjEntity) {
 			entity = ((ObjEntity) entity).getDbEntity();
 		}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
index b118a9161..7255dbd2d 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTObjPath.java
@@ -61,8 +61,11 @@ public class ASTObjPath extends ASTPath {
 
 	@Override
 	protected Object evaluateNode(Object o) throws Exception {
-		return (o instanceof DataObject) ? ((DataObject) o).readNestedProperty(path)
-				: (o instanceof Entity) ? evaluateEntityNode((Entity) o) : PropertyUtils.getProperty(o, path);
+		return (o instanceof DataObject)
+				? ((DataObject) o).readNestedProperty(path)
+				: (o instanceof Entity)
+					? evaluateEntityNode((Entity<?,?,?>) o)
+					: PropertyUtils.getProperty(o, path);
 	}
 
 	/**
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTPath.java b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTPath.java
index 77bd2718a..7d5561db7 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTPath.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/exp/parser/ASTPath.java
@@ -22,10 +22,8 @@ package org.apache.cayenne.exp.parser;
 import java.util.Iterator;
 import java.util.Map;
 
-import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.PathComponent;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.util.CayenneMapEntry;
 
 /**
@@ -93,9 +91,9 @@ public abstract class ASTPath extends SimpleNode {
 	/**
 	 * Helper method to evaluate path expression with Cayenne Entity.
 	 */
-	protected CayenneMapEntry evaluateEntityNode(Entity entity) {
-		Iterator<PathComponent<Attribute, Relationship>> path = entity.resolvePath(this, getPathAliases()).iterator();
-		PathComponent<Attribute, Relationship> next = null;
+	protected CayenneMapEntry evaluateEntityNode(Entity<?,?,?> entity) {
+		Iterator<? extends PathComponent<?, ?>> path = entity.resolvePath(this, getPathAliases()).iterator();
+		PathComponent<?, ?> next = null;
 		while (path.hasNext()) {
 			next = path.next();
 		}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/AliasPathComponent.java b/cayenne-server/src/main/java/org/apache/cayenne/map/AliasPathComponent.java
index 86822d733..1be0327dd 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/AliasPathComponent.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/AliasPathComponent.java
@@ -25,24 +25,23 @@ import java.util.Collection;
  * 
  * @since 3.0
  */
-class AliasPathComponent<T extends Attribute, U extends Relationship> implements
-        PathComponent<T, U> {
+class AliasPathComponent<A extends Attribute<?, A, R>, R extends Relationship<?, A, R>> implements PathComponent<A, R> {
 
-    private String alias;
-    private Collection<PathComponent<T, U>> path;
-    private boolean last;
+    private final String alias;
+    private final Collection<PathComponent<A, R>> path;
+    private final boolean last;
 
-    AliasPathComponent(String alias, Collection<PathComponent<T, U>> path, boolean last) {
+    AliasPathComponent(String alias, Collection<PathComponent<A, R>> path, boolean last) {
         this.alias = alias;
         this.path = path;
         this.last = last;
     }
 
-    public Iterable<PathComponent<T, U>> getAliasedPath() {
+    public Iterable<PathComponent<A, R>> getAliasedPath() {
         return path;
     }
 
-    public T getAttribute() {
+    public A getAttribute() {
         return null;
     }
 
@@ -54,7 +53,7 @@ class AliasPathComponent<T extends Attribute, U extends Relationship> implements
         return alias;
     }
 
-    public U getRelationship() {
+    public R getRelationship() {
         return null;
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/Attribute.java b/cayenne-server/src/main/java/org/apache/cayenne/map/Attribute.java
index 3dc4d318a..e9cb8aa6f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/Attribute.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/Attribute.java
@@ -32,11 +32,11 @@ import org.apache.cayenne.util.XMLSerializable;
  * are described by attributes are Java class properties and database table columns.
  * 
  */
-public abstract class Attribute<E extends Entity<E,T,U>, T extends Attribute<E,T,U>, U extends Relationship<E,T,U>>
+public abstract class Attribute<E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
         implements CayenneMapEntry, XMLSerializable, Serializable {
 
     protected String name;
-    protected Entity<E,T,U> entity;
+    protected Entity<E, A, R> entity;
 
     /**
      * Creates an unnamed Attribute.
@@ -62,14 +62,14 @@ public abstract class Attribute<E extends Entity<E,T,U>, T extends Attribute<E,T
     /**
      * Returns parent entity that holds this attribute.
      */
-    public Entity<E,T,U> getEntity() {
+    public Entity<E, A, R> getEntity() {
         return entity;
     }
 
     /**
      * Sets parent entity that holds this attribute.
      */
-    public void setEntity(Entity<E,T,U> entity) {
+    public void setEntity(Entity<E, A, R> entity) {
         this.entity = entity;
     }
 
@@ -91,6 +91,6 @@ public abstract class Attribute<E extends Entity<E,T,U>, T extends Attribute<E,T
             throw new IllegalArgumentException("Expected null or Entity, got: " + parent);
         }
 
-        setEntity((Entity<E,T,U>) parent);
+        setEntity((Entity<E, A, R>) parent);
     }
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbAttribute.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbAttribute.java
index 1c1cd9f44..5d707a512 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbAttribute.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbAttribute.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.dba.TypesMapping;
 import org.apache.cayenne.map.event.AttributeEvent;
-import org.apache.cayenne.map.event.DbAttributeListener;
 import org.apache.cayenne.util.XMLEncoder;
 
 /**
@@ -194,9 +193,9 @@ public class DbAttribute extends Attribute<DbEntity, DbAttribute, DbRelationship
         if (this.primaryKey != primaryKey) {
             this.primaryKey = primaryKey;
 
-            Entity e = this.getEntity();
-            if (e instanceof DbAttributeListener) {
-                ((DbAttributeListener) e).dbAttributeChanged(new AttributeEvent(this, this, e));
+            DbEntity e = this.getEntity();
+            if (e != null) {
+                e.dbAttributeChanged(new AttributeEvent(this, this, e));
             }
         }
     }
@@ -243,9 +242,9 @@ public class DbAttribute extends Attribute<DbEntity, DbAttribute, DbRelationship
         if (this.generated != generated) {
             this.generated = generated;
 
-            Entity e = this.getEntity();
-            if (e instanceof DbAttributeListener) {
-                ((DbAttributeListener) e).dbAttributeChanged(new AttributeEvent(this, this, e));
+            DbEntity e = this.getEntity();
+            if (e != null) {
+                e.dbAttributeChanged(new AttributeEvent(this, this, e));
             }
         }
     }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
index 98351a78c..15145ca72 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/DbRelationship.java
@@ -56,11 +56,6 @@ public class DbRelationship extends Relationship<DbEntity, DbAttribute, DbRelati
         super(name);
     }
 
-    @Override
-    public DbEntity getSourceEntity() {
-        return (DbEntity) super.getSourceEntity();
-    }
-
     /**
      * @since 3.1
      */
@@ -111,7 +106,6 @@ public class DbRelationship extends Relationship<DbEntity, DbAttribute, DbRelati
      * 
      * @since 1.1
      */
-    @SuppressWarnings("unchecked")
     public Collection<DbAttribute> getTargetAttributes() {
         return mapJoinsToAttributes(DbJoin::getTarget);
     }
@@ -121,7 +115,6 @@ public class DbRelationship extends Relationship<DbEntity, DbAttribute, DbRelati
      * 
      * @since 1.1
      */
-    @SuppressWarnings("unchecked")
     public Collection<DbAttribute> getSourceAttributes() {
         return mapJoinsToAttributes(DbJoin::getSource);
     }
@@ -187,7 +180,7 @@ public class DbRelationship extends Relationship<DbEntity, DbAttribute, DbRelati
             return null;
         }
 
-        Entity src = this.getSourceEntity();
+        DbEntity src = this.getSourceEntity();
 
         // special case - relationship to self with no joins...
         if (target == src && joins.size() == 0) {
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/Entity.java b/cayenne-server/src/main/java/org/apache/cayenne/map/Entity.java
index 1d57c60cb..2b2b14c2a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/Entity.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/Entity.java
@@ -39,7 +39,7 @@ import java.util.StringTokenizer;
  * either a descriptor of database table or a persistent object.
  * 
  */
-public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>, U extends Relationship<E,T,U>>
+public abstract class Entity<E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
         implements CayenneMapEntry, XMLSerializable, Serializable {
 
     public static final String PATH_SEPARATOR = ".";
@@ -55,8 +55,8 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
     protected String name;
     protected DataMap dataMap;
 
-    protected final Map<String, T> attributes = new LinkedHashMap<>();
-    protected final Map<String, U> relationships = new LinkedHashMap<>();
+    protected final Map<String, A> attributes = new LinkedHashMap<>();
+    protected final Map<String, R> relationships = new LinkedHashMap<>();
 
     /**
      * Creates an unnamed Entity.
@@ -118,7 +118,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
      * Returns attribute with name <code>attributeName</code> or null if no attribute
      * with this name exists.
      */
-    public T getAttribute(String attributeName) {
+    public A getAttribute(String attributeName) {
         return attributes.get(attributeName);
     }
 
@@ -126,7 +126,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
      * Adds new attribute to the entity, setting its parent entity to be this object. If
      * attribute has no name, IllegalArgumentException is thrown.
      */
-    public void addAttribute(T attribute) {
+    public void addAttribute(A attribute) {
         if (attribute.getName() == null) {
             throw new IllegalArgumentException("Attempt to insert unnamed attribute.");
         }
@@ -134,7 +134,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
         // block overrides
 
         // TODO: change method signature to return replaced attribute and make sure the Modeler handles it...
-        T existingAttribute = attributes.get(attribute.getName());
+        A existingAttribute = attributes.get(attribute.getName());
         if (existingAttribute != null) {
             if (existingAttribute == attribute) {
                 return;
@@ -166,7 +166,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
      *
      * @since 4.0
      */
-    public void updateAttribute(T attribute) {
+    public void updateAttribute(A attribute) {
         removeAttribute(attribute.getName());
         addAttribute(attribute);
     }
@@ -179,14 +179,14 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
      * Returns relationship with name <code>relName</code>. Will return null if no
      * relationship with this name exists in the entity.
      */
-    public U getRelationship(String relName) {
+    public R getRelationship(String relName) {
         return relationships.get(relName);
     }
 
     /**
      * Adds new relationship to the entity.
      */
-    public void addRelationship(U relationship) {
+    public void addRelationship(R relationship) {
         if (relationship.getName() == null) {
             throw new IllegalArgumentException("Attempt to insert unnamed relationship.");
         }
@@ -214,7 +214,9 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
         }
 
         relationships.put(relationship.getName(), relationship);
-        relationship.setSourceEntity(this);
+        @SuppressWarnings("unchecked")
+        E sourceEntity = (E) this;
+        relationship.setSourceEntity(sourceEntity);
     }
 
     /**
@@ -231,7 +233,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
     /**
      * Returns an unmodifiable map of relationships sorted by name.
      */
-    public Map<String, U> getRelationshipMap() {
+    public Map<String, R> getRelationshipMap() {
         // create a new instance ... earlier attempts to cache it in the entity caused
         // serialization issues (esp. with Hessian).
         return Collections.unmodifiableMap(relationships);
@@ -244,12 +246,12 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
      * 
      * @since 1.1
      */
-    public U getAnyRelationship(E targetEntity) {
+    public R getAnyRelationship(E targetEntity) {
         if (getRelationships().isEmpty()) {
             return null;
         }
 
-        for (U r : getRelationships()) {
+        for (R r : getRelationships()) {
             if (r.getTargetEntity() == targetEntity) {
                 return r;
             }
@@ -260,7 +262,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
     /**
      * Returns an unmodifiable collection of Relationships that exist in this entity.
      */
-    public Collection<U> getRelationships() {
+    public Collection<R> getRelationships() {
         // create a new instance ... earlier attempts to cache it in the entity caused
         // serialization issues (esp. with Hessian).
         return Collections.unmodifiableCollection(relationships.values());
@@ -269,7 +271,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
     /**
      * Returns an unmodifiable sorted map of entity attributes.
      */
-    public Map<String, T> getAttributeMap() {
+    public Map<String, A> getAttributeMap() {
         // create a new instance ... earlier attempts to cache it in the entity caused
         // serialization issues (esp. with Hessian).
         return Collections.unmodifiableMap(attributes);
@@ -278,7 +280,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
     /**
      * Returns an unmodifiable collection of entity attributes.
      */
-    public Collection<T> getAttributes() {
+    public Collection<A> getAttributes() {
         // create a new instance ... earlier attempts to cache it in the entity caused
         // serialization issues (esp. with Hessian).
         return Collections.unmodifiableCollection(attributes.values());
@@ -298,11 +300,11 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
      * 
      * @since 3.0
      */
-    public PathComponent<T, U> lastPathComponent(
+    public PathComponent<A, R> lastPathComponent(
             Expression path,
             Map<String, String> aliasMap) {
 
-        for (PathComponent<T, U> component : resolvePath(path, aliasMap)) {
+        for (PathComponent<A, R> component : resolvePath(path, aliasMap)) {
             if (component.isLast()) {
                 // resolve aliases if needed
                 return lastPathComponent(component);
@@ -312,13 +314,13 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
         return null;
     }
 
-    private PathComponent<T, U> lastPathComponent(PathComponent<T, U> component) {
+    private PathComponent<A, R> lastPathComponent(PathComponent<A, R> component) {
         
         if (!component.isAlias()) {
             return component;
         }
 
-        for (PathComponent<T, U> subcomponent : component.getAliasedPath()) {
+        for (PathComponent<A, R> subcomponent : component.getAliasedPath()) {
             if (subcomponent.isLast()) {
                 return lastPathComponent(subcomponent);
             }
@@ -340,7 +342,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
      * 
      * @since 3.0
      */
-    public abstract Iterable<PathComponent<T, U>> resolvePath(
+    public abstract Iterable<PathComponent<A, R>> resolvePath(
             Expression pathExp,
             Map<String, String> aliasMap);
 
@@ -371,7 +373,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
 
         private final StringTokenizer tokens;
         private final String path;
-        private Entity<E,T,U> currentEntity;
+        private Entity<E, A, R> currentEntity;
 
         PathIterator(String path) {
             currentEntity = Entity.this;
@@ -390,7 +392,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
             }
             
             // see if this is an attribute
-            T attr = currentEntity.getAttribute(pathComp);
+            A attr = currentEntity.getAttribute(pathComp);
             if (attr != null) {
                 // do a sanity check...
                 if (tokens.hasMoreTokens()) {
@@ -400,7 +402,7 @@ public abstract class Entity<E extends Entity<E,T,U>, T extends Attribute<E,T,U>
                 return attr;
             }
 
-            U rel = currentEntity.getRelationship(pathComp);
+            R rel = currentEntity.getRelationship(pathComp);
             if (rel != null) {
                 currentEntity = rel.getTargetEntity();
                 if (currentEntity != null || !tokens.hasMoreTokens()) { //otherwise an exception will be thrown
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
index 55f98e110..8c9745105 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/EntityResolver.java
@@ -147,7 +147,7 @@ public class EntityResolver implements MappingNamespace, Serializable {
                     if (relationship.getReverseRelationship() == null) {
                         DbRelationship reverse = relationship.createReverseRelationship();
 
-                        Entity targetEntity = reverse.getSourceEntity();
+                        DbEntity targetEntity = reverse.getSourceEntity();
                         reverse.setName(getUniqueRelationshipName(targetEntity));
                         reverse.setRuntime(true);
                         targetEntity.addRelationship(reverse);
@@ -161,7 +161,7 @@ public class EntityResolver implements MappingNamespace, Serializable {
 
     }
 
-    private String getUniqueRelationshipName(Entity entity) {
+    private String getUniqueRelationshipName(DbEntity entity) {
         String name;
 
         do {
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponent.java b/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponent.java
index e9ee5d081..07472525e 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponent.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponent.java
@@ -23,11 +23,11 @@ package org.apache.cayenne.map;
  * 
  * @since 3.0
  */
-public interface PathComponent<T extends Attribute, U extends Relationship> {
+public interface PathComponent<A extends Attribute, R extends Relationship> {
 
-    T getAttribute();
+    A getAttribute();
 
-    U getRelationship();
+    R getRelationship();
 
     String getName();
 
@@ -49,5 +49,5 @@ public interface PathComponent<T extends Attribute, U extends Relationship> {
     /**
      * Returns an aliased path or null if this component is not an alias.
      */
-    Iterable<PathComponent<T, U>> getAliasedPath();
+    Iterable<PathComponent<A, R>> getAliasedPath();
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java b/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java
index 9a444b094..15640b629 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/PathComponentIterator.java
@@ -31,17 +31,17 @@ import java.util.StringTokenizer;
 /**
  * @since 3.0
  */
-class PathComponentIterator<E extends Entity<E,T,U>, T extends Attribute<E,T,U>, U extends Relationship<E,T,U>>
-        implements Iterator<PathComponent<T, U>> {
+class PathComponentIterator<E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
+        implements Iterator<PathComponent<A, R>> {
 
     private final StringTokenizer toks;
     private final String path;
     private final Map<String, String> aliasMap;
 
     private EmbeddedAttribute embeddedAttribute;
-    private Entity<E,T,U> currentEntity;
+    private Entity<E, A, R> currentEntity;
 
-    PathComponentIterator(Entity<E,T,U> root, String path, Map<String, String> aliasMap) {
+    PathComponentIterator(Entity<E, A, R> root, String path, Map<String, String> aliasMap) {
         this.currentEntity = Objects.requireNonNull(root);
         this.path = Objects.requireNonNull(path);
         this.aliasMap = Objects.requireNonNull(aliasMap);
@@ -53,7 +53,7 @@ class PathComponentIterator<E extends Entity<E,T,U>, T extends Attribute<E,T,U>,
         return toks.hasMoreTokens();
     }
 
-    public PathComponent<T, U> next() {
+    public PathComponent<A, R> next() {
         String pathComp = toks.nextToken();
 
         JoinType relationshipJoinType = JoinType.INNER;
@@ -65,10 +65,10 @@ class PathComponentIterator<E extends Entity<E,T,U>, T extends Attribute<E,T,U>,
         }
 
         // see if this is an attribute
-        T attr;
+        A attr;
         if(embeddedAttribute != null) {
             // TODO: assert that this iterator is for ObjEntity
-            attr = (T)embeddedAttribute.getAttribute(pathComp);
+            attr = (A)embeddedAttribute.getAttribute(pathComp);
             embeddedAttribute = null;
         } else {
             attr = currentEntity.getAttribute(pathComp);
@@ -86,13 +86,13 @@ class PathComponentIterator<E extends Entity<E,T,U>, T extends Attribute<E,T,U>,
             return new AttributePathComponent<>(attr);
         }
 
-        U rel = currentEntity.getRelationship(pathComp);
+        R rel = currentEntity.getRelationship(pathComp);
         if (rel != null) {
             currentEntity = rel.getTargetEntity();
             return new RelationshipPathComponent<>(rel, relationshipJoinType, !hasNext());
         }
 
-        PathComponent<T, U> aliasedPathComponent = getAliasedPathComponent(pathComp);
+        PathComponent<A, R> aliasedPathComponent = getAliasedPathComponent(pathComp);
         if (aliasedPathComponent != null) {
             return aliasedPathComponent;
         }
@@ -100,7 +100,7 @@ class PathComponentIterator<E extends Entity<E,T,U>, T extends Attribute<E,T,U>,
         throw invalidPathException("Can't resolve path component", pathComp);
     }
 
-    private PathComponent<T, U> getAliasedPathComponent(String pathComp) {
+    private PathComponent<A, R> getAliasedPathComponent(String pathComp) {
         String aliasedPath = aliasMap.get(pathComp);
         if(aliasedPath == null) {
             return null;
@@ -117,15 +117,15 @@ class PathComponentIterator<E extends Entity<E,T,U>, T extends Attribute<E,T,U>,
         // the subpath, we have to fully traverse it, hence instead of lazy iterator
         // we might as well reuse obtained information in the AliasPathComponent
 
-        Iterator<PathComponent<T, U>> subpathIt =
+        Iterator<PathComponent<A, R>> subpathIt =
                 new PathComponentIterator<>(currentEntity, aliasedPath, Collections.emptyMap());
 
-        Collection<PathComponent<T, U>> parsedSubpath = new ArrayList<>(4);
+        Collection<PathComponent<A, R>> parsedSubpath = new ArrayList<>(4);
 
         while (subpathIt.hasNext()) {
-            PathComponent<T, U> subpathComponent = subpathIt.next();
+            PathComponent<A, R> subpathComponent = subpathIt.next();
 
-            U subpathRelationship = subpathComponent.getRelationship();
+            R subpathRelationship = subpathComponent.getRelationship();
             if (subpathRelationship == null) {
                 throw invalidPathException(
                         "Expected a relationship in the aliased subpath. Alias [" + pathComp + "]",
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java b/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
index 428cdb285..d705b13b5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/Relationship.java
@@ -31,11 +31,11 @@ import org.apache.cayenne.util.XMLSerializable;
  * "arcs" connecting entity "nodes". Relationships are directional, i.e. they have a
  * notion of source and target entity. This makes DataMap a "digraph".
  */
-public abstract class Relationship<E extends Entity<E,T,U>, T extends Attribute<E,T,U>, U extends Relationship<E,T,U>>
+public abstract class Relationship<E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
         implements CayenneMapEntry, XMLSerializable, Serializable {
 
     protected String name;
-    protected Entity<E,T,U> sourceEntity;
+    protected E sourceEntity;
 
     protected String targetEntityName;
     protected boolean toMany;
@@ -72,26 +72,26 @@ public abstract class Relationship<E extends Entity<E,T,U>, T extends Attribute<
     /**
      * Returns relationship source entity.
      */
-    public Entity<E,T,U> getSourceEntity() {
+    public E getSourceEntity() {
         return sourceEntity;
     }
 
     /**
      * Sets relationship source entity.
      */
-    public void setSourceEntity(Entity<E,T,U> sourceEntity) {
+    public void setSourceEntity(E sourceEntity) {
         this.sourceEntity = sourceEntity;
     }
 
     /**
      * Returns a target entity of the relationship.
      */
-    public abstract Entity<E,T,U> getTargetEntity();
+    public abstract E getTargetEntity();
 
     /**
      * Sets relationship target entity. Internally calls <code>setTargetEntityName</code>.
      */
-    public void setTargetEntityName(Entity<E,?,?> targetEntity) {
+    public void setTargetEntityName(Entity<E, A, R> targetEntity) {
         if (targetEntity != null) {
             setTargetEntityName(targetEntity.getName());
         } else {
@@ -128,12 +128,13 @@ public abstract class Relationship<E extends Entity<E,T,U>, T extends Attribute<
         return getSourceEntity();
     }
 
+    @SuppressWarnings("unchecked")
     public void setParent(Object parent) {
         if (parent != null && !(parent instanceof Entity)) {
             throw new IllegalArgumentException("Expected null or Entity, got: " + parent);
         }
 
-        setSourceEntity((Entity<E,T,U>) parent);
+        setSourceEntity((E) parent);
     }
 
     /**
@@ -142,7 +143,7 @@ public abstract class Relationship<E extends Entity<E,T,U>, T extends Attribute<
      * Relationship class.
      */
     final MappingNamespace getNonNullNamespace() {
-        Entity<E,?,?> entity = getSourceEntity();
+        E entity = getSourceEntity();
 
         if (entity == null) {
             throw new CayenneRuntimeException("Relationship '%s' has no parent Entity.", getName());
@@ -180,7 +181,7 @@ public abstract class Relationship<E extends Entity<E,T,U>, T extends Attribute<
      * null if no such relationship is found.
      * @since 3.1
      */
-    public abstract Relationship<E,T,U> getReverseRelationship();
+    public abstract Relationship<E, A, R> getReverseRelationship();
     
     /**
      * Returns if relationship is mandatory
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/RelationshipPathComponent.java b/cayenne-server/src/main/java/org/apache/cayenne/map/RelationshipPathComponent.java
index 6b89eb1fe..ce0694356 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/RelationshipPathComponent.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/RelationshipPathComponent.java
@@ -21,24 +21,24 @@ package org.apache.cayenne.map;
 /**
  * @since 3.0
  */
-class RelationshipPathComponent<T extends Attribute, U extends Relationship> implements
-        PathComponent<T, U> {
+class RelationshipPathComponent<A extends Attribute<?, A, R>, R extends Relationship<?, A, R>>
+        implements PathComponent<A, R> {
 
-    private U relationship;
-    private JoinType joinType;
-    private boolean last;
+    private final R relationship;
+    private final JoinType joinType;
+    private final boolean last;
 
-    RelationshipPathComponent(U relationship, JoinType joinType, boolean last) {
+    RelationshipPathComponent(R relationship, JoinType joinType, boolean last) {
         this.relationship = relationship;
         this.joinType = joinType;
         this.last = last;
     }
 
-    public T getAttribute() {
+    public A getAttribute() {
         return null;
     }
 
-    public U getRelationship() {
+    public R getRelationship() {
         return relationship;
     }
 
@@ -58,7 +58,7 @@ class RelationshipPathComponent<T extends Attribute, U extends Relationship> imp
         return false;
     }
 
-    public Iterable<PathComponent<T, U>> getAliasedPath() {
+    public Iterable<PathComponent<A, R>> getAliasedPath() {
         return null;
     }
 }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/event/AttributeEvent.java b/cayenne-server/src/main/java/org/apache/cayenne/map/event/AttributeEvent.java
index 033c84acb..fcfca2854 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/event/AttributeEvent.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/event/AttributeEvent.java
@@ -29,29 +29,29 @@ import org.apache.cayenne.map.Entity;
  * 
  */
 public class AttributeEvent extends EntityEvent {
-    protected Attribute attribute;
+    protected Attribute<?,?,?> attribute;
 
     /** Creates a Attribute change event. */
-    public AttributeEvent(Object src, Attribute attr, Entity entity) {
+    public AttributeEvent(Object src, Attribute<?,?,?> attr, Entity<?,?,?> entity) {
         super(src, entity);
         setAttribute(attr);
     }
 
     /** Creates a Attribute event of a specified type. */
-    public AttributeEvent(Object src, Attribute attr, Entity entity, int id) {
+    public AttributeEvent(Object src, Attribute<?,?,?> attr, Entity<?,?,?> entity, int id) {
         this(src, attr, entity);
         setId(id);
     }
 
     /** Creates a Attribute name change event.*/
-    public AttributeEvent(Object src, Attribute attr, Entity entity, String oldName) {
+    public AttributeEvent(Object src, Attribute<?,?,?> attr, Entity<?,?,?> entity, String oldName) {
 
         this(src, attr, entity);
         setOldName(oldName);
     }
 
     /** Get attribute (obj or db). */
-    public Attribute getAttribute() {
+    public Attribute<?,?,?> getAttribute() {
         return attribute;
     }
 
@@ -59,7 +59,7 @@ public class AttributeEvent extends EntityEvent {
      * Sets the attribute.
      * @param attribute The attribute to set
      */
-    public void setAttribute(Attribute attribute) {
+    public void setAttribute(Attribute<?,?,?> attribute) {
         this.attribute = attribute;
     }
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/event/EntityEvent.java b/cayenne-server/src/main/java/org/apache/cayenne/map/event/EntityEvent.java
index c2e60e121..1e80ec2af 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/event/EntityEvent.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/event/EntityEvent.java
@@ -27,28 +27,28 @@ import org.apache.cayenne.map.Entity;
  * and DbEntities.
  */
 public class EntityEvent extends MapEvent {
-	protected Entity entity;
+	protected Entity<?,?,?> entity;
 
 	/** Creates a Entity change event. */
-	public EntityEvent(Object src, Entity entity) {
+	public EntityEvent(Object src, Entity<?,?,?> entity) {
 		super(src);
 		setEntity(entity);
 	}
 
 	/** Creates a Entity event of a specified type. */
-	public EntityEvent(Object src, Entity entity, int id) {
+	public EntityEvent(Object src, Entity<?,?,?> entity, int id) {
 		this(src, entity);
 		setId(id);
 	}
 
 	/** Creates a Entity name change event.*/
-	public EntityEvent(Object src, Entity entity, String oldName) {
+	public EntityEvent(Object src, Entity<?,?,?> entity, String oldName) {
 		this(src, entity);
 		setOldName(oldName);
 	}
 
 	/** Returns entity object associated with this event. */
-	public Entity getEntity() {
+	public Entity<?,?,?> getEntity() {
 		return entity;
 	}
 	
@@ -57,7 +57,7 @@ public class EntityEvent extends MapEvent {
 	 * 
 	 * @param entity The entity to set
 	 */
-	public void setEntity(Entity entity) {
+	public void setEntity(Entity<?,?,?> entity) {
 		this.entity = entity;
 	}
 	
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/map/event/RelationshipEvent.java b/cayenne-server/src/main/java/org/apache/cayenne/map/event/RelationshipEvent.java
index 801a8424e..9fd81a7ae 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/map/event/RelationshipEvent.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/map/event/RelationshipEvent.java
@@ -30,10 +30,10 @@ import org.apache.cayenne.map.Relationship;
  * 
  */
 public class RelationshipEvent extends EntityEvent {
-	protected Relationship relationship;
+	protected Relationship<?,?,?> relationship;
 
 	/** Creates a Relationship change event. */
-	public RelationshipEvent(Object src, Relationship rel, Entity entity) {
+	public RelationshipEvent(Object src, Relationship<?,?,?> rel, Entity<?,?,?> entity) {
 		super(src, entity);
 		setRelationship(rel);
 	}
@@ -41,8 +41,8 @@ public class RelationshipEvent extends EntityEvent {
 	/** Creates a Relationship event of a specified type. */
 	public RelationshipEvent(
 		Object src,
-		Relationship rel,
-		Entity entity,
+		Relationship<?,?,?> rel,
+		Entity<?,?,?> entity,
 		int id) {
 
 		this(src, rel, entity);
@@ -52,8 +52,8 @@ public class RelationshipEvent extends EntityEvent {
 	/** Creates a Relationship name change event. */
 	public RelationshipEvent(
 		Object src,
-		Relationship rel,
-		Entity entity,
+		Relationship<?,?,?> rel,
+		Entity<?,?,?> entity,
 		String oldName) {
 			
 		this(src, rel, entity);
@@ -61,7 +61,7 @@ public class RelationshipEvent extends EntityEvent {
 	}
 
 	/** Returns relationship associated with this event. */
-	public Relationship getRelationship() {
+	public Relationship<?,?,?> getRelationship() {
 		return relationship;
 	}
 
@@ -70,7 +70,7 @@ public class RelationshipEvent extends EntityEvent {
 	 * 
 	 * @param relationship The relationship to set
 	 */
-	public void setRelationship(Relationship relationship) {
+	public void setRelationship(Relationship<?,?,?> relationship) {
 		this.relationship = relationship;
 	}
 	
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLDeletePKIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLDeletePKIT.java
index 8093b41ff..c4eabd9f4 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLDeletePKIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLDeletePKIT.java
@@ -66,7 +66,8 @@ public class DataContextEJBQLDeletePKIT extends ServerCase {
 
         EJBQLQuery q = new EJBQLQuery("select m.pkAttribute from MeaningfulPKTest1 m");
 
-        List<Integer> id = context.performQuery(q);
+        @SuppressWarnings("unchecked")
+        List<Integer> id = (List<Integer>)context.performQuery(q);
 
         String ejbql = "delete from MeaningfulPKTest1 m WHERE m.pkAttribute in (:id)";
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java
index 32596e493..e3e4aed42 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/MockAttribute.java
@@ -22,8 +22,6 @@ package org.apache.cayenne.map;
 import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.util.XMLEncoder;
 
-/**
- */
 public class MockAttribute extends Attribute<MockEntity, MockAttribute, MockRelationship> {
 
     public MockAttribute() {
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MockObjRelationship.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MockObjRelationship.java
index 8a4e7da54..dccf36ae4 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MockObjRelationship.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/MockObjRelationship.java
@@ -19,8 +19,6 @@
 
 package org.apache.cayenne.map;
 
-import org.apache.cayenne.map.ObjRelationship;
-
 /**
  */
 public class MockObjRelationship extends ObjRelationship {
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java b/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java
index 0f06e89ee..770d4fa81 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/map/MockRelationship.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.util.XMLEncoder;
 public class MockRelationship extends Relationship<MockEntity, MockAttribute, MockRelationship> {
 
     public MockRelationship() {
-
     }
 
     public MockRelationship(String name) {
@@ -33,7 +32,7 @@ public class MockRelationship extends Relationship<MockEntity, MockAttribute, Mo
     }
 
     @Override
-    public Entity getTargetEntity() {
+    public MockEntity getTargetEntity() {
         return null;
     }
 
@@ -42,7 +41,7 @@ public class MockRelationship extends Relationship<MockEntity, MockAttribute, Mo
     }
 
     @Override
-    public Relationship getReverseRelationship() {
+    public MockRelationship getReverseRelationship() {
         return null;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java
index 1e02b6d1a..3c98ce886 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeModel.java
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.modeler;
 
+import org.apache.cayenne.configuration.ConfigurationNode;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbEntity;
@@ -31,6 +32,7 @@ import org.apache.cayenne.project.Project;
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
 import javax.swing.tree.MutableTreeNode;
+import javax.swing.tree.TreeNode;
 import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.Map;
@@ -40,7 +42,7 @@ import java.util.Map;
  */
 public class ProjectTreeModel extends DefaultTreeModel {
 
-	private Filter filter = new Filter();
+	private final Filter filter = new Filter();
 
 	/**
 	 * Constructor for ProjectTreeModel.
@@ -53,7 +55,7 @@ public class ProjectTreeModel extends DefaultTreeModel {
 	 * Re-inserts a tree node to preserve the correct ordering of items. Assumes
 	 * that the tree is already ordered, except for one node.
 	 */
-	public void positionNode(MutableTreeNode parent, DefaultMutableTreeNode treeNode, Comparator comparator) {
+	public void positionNode(MutableTreeNode parent, DefaultMutableTreeNode treeNode, Comparator<ConfigurationNode> comparator) {
 
 		if (treeNode == null) {
 			return;
@@ -66,7 +68,7 @@ public class ProjectTreeModel extends DefaultTreeModel {
 			}
 		}
 
-		Object object = treeNode.getUserObject();
+		ConfigurationNode object = (ConfigurationNode)treeNode.getUserObject();
 
 		if (parent != null) {
 			int len = parent.getChildCount();
@@ -87,7 +89,7 @@ public class ProjectTreeModel extends DefaultTreeModel {
 				}
 
 				// ObjEntities go before DbEntities
-				if (comparator.compare(object, node.getUserObject()) <= 0) {
+				if (comparator.compare(object, (ConfigurationNode)node.getUserObject()) <= 0) {
 					ins = i;
 				}
 			}
@@ -149,7 +151,7 @@ public class ProjectTreeModel extends DefaultTreeModel {
 
 		for (int i = start; i < path.length; i++) {
 			DefaultMutableTreeNode foundNode = null;
-			Enumeration children = currentNode.children();
+			Enumeration<TreeNode> children = currentNode.children();
 			while (children.hasMoreElements()) {
 				DefaultMutableTreeNode child = (DefaultMutableTreeNode) children.nextElement();
 				if (child.getUserObject() == path[i]) {
@@ -226,7 +228,7 @@ public class ProjectTreeModel extends DefaultTreeModel {
 		nodesWereRemoved(parent, childIndex, removedArray);
 	}
 
-	class Filter {
+	static class Filter {
 		private Map<String, Boolean> filterMap;
 		boolean pass = true;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
index d17490a98..35c7c35b2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/ProjectTreeView.java
@@ -730,7 +730,7 @@ public class ProjectTreeView extends JTree implements DomainDisplayListener,
      */
     protected void entityAdded(EntityEvent e) {
 
-        Entity entity = e.getEntity();
+        Entity<?,?,?> entity = e.getEntity();
 
         DefaultMutableTreeNode mapNode = getProjectModel().getNodeForObjectPath(
                 new Object[] {
@@ -921,7 +921,7 @@ public class ProjectTreeView extends JTree implements DomainDisplayListener,
                         (DataNodeDescriptor) obj));
             }
         } else if (obj instanceof Entity) {
-            EntityDisplayEvent e = new EntityDisplayEvent(this, (Entity) obj);
+            EntityDisplayEvent e = new EntityDisplayEvent(this, (Entity<?,?,?>) obj);
             e.setUnselectAttributes(true);
             if (data.length == 3) {
                 e.setDataMap((DataMap) data[data.length - 2]);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/BaseViewEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/BaseViewEntityAction.java
index 01e3ec557..6dc8c8f3b 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/BaseViewEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/BaseViewEntityAction.java
@@ -35,7 +35,7 @@ import java.awt.event.ActionEvent;
  */
 public abstract class BaseViewEntityAction extends CayenneAction {
 
-    abstract protected Entity getEntity();
+    abstract protected Entity<?,?,?> getEntity();
 
     public BaseViewEntityAction(String name, Application application) {
         super(name, application);
@@ -50,13 +50,13 @@ public abstract class BaseViewEntityAction extends CayenneAction {
     }
 
     protected void viewEntity() {
-        Entity entity = getEntity();
+        Entity<?,?,?> entity = getEntity();
         if(entity != null) {
             navigateToEntity(entity);
         }
     }
 
-    public void navigateToEntity(Entity entity) {
+    public void navigateToEntity(Entity<?,?,?> entity) {
         TreePath path = buildTreePath(entity);
         editor().getProjectTreeView().getSelectionModel().setSelectionPath(path);
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
index d28e6499e..99a3a7575 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateAttributeAction.java
@@ -182,7 +182,7 @@ public class CreateAttributeAction extends CayenneAction {
         }
 
         if (object instanceof Attribute) {
-            return ((Attribute) object).getParent() != null && ((Attribute) object).getParent() instanceof Entity;
+            return ((Attribute<?,?,?>) object).getParent() instanceof Entity;
         }
 
         return false;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
index fef26f1c9..6c1979b11 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateDbEntityAction.java
@@ -97,6 +97,6 @@ public class CreateDbEntityAction extends CayenneAction {
             return false;
         }
 
-        return ((Entity) object).getDataMap() != null;
+        return ((Entity<?,?,?>) object).getDataMap() != null;
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
index 8b849779a..2e063f234 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/CreateRelationshipAction.java
@@ -134,7 +134,7 @@ public class CreateRelationshipAction extends CayenneAction {
         }
 
         if (object instanceof Relationship) {
-            return ((Relationship) object).getParent() != null && ((Relationship) object).getParent() instanceof Entity;
+            return ((Relationship<?,?,?>) object).getParent() instanceof Entity;
         }
 
         return false;
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 642bade3f..8e9750aab 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
@@ -41,7 +41,7 @@ public class DbEntityCounterpartAction extends BaseViewEntityAction {
     }
 
     @Override
-    protected Entity getEntity() {
+    protected ObjEntity getEntity() {
         DbEntity dbEntity = getProjectController().getCurrentDbEntity();
         if (dbEntity == null) {
             return null;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
index 1185fc595..cdfa94b94 100755
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/FindAction.java
@@ -141,7 +141,7 @@ public class FindAction extends CayenneAction {
         DataChannelDescriptor domain = (DataChannelDescriptor) Application.getInstance().getProject().getRootNode();
 
         if (searchResultEntry.getObject() instanceof Entity) {
-            jumpToEntityResult((Entity) searchResultEntry.getObject(), editor, domain);
+            jumpToEntityResult((Entity<?,?,?>) searchResultEntry.getObject(), editor, domain);
         } else if (searchResultEntry.getObject() instanceof QueryDescriptor) {
             jumpToQueryResult((QueryDescriptor)searchResultEntry.getObject(), editor, domain);
         } else if (searchResultEntry.getObject() instanceof Embeddable) {
@@ -262,19 +262,19 @@ public class FindAction extends CayenneAction {
 
     private static void jumpToAttributeResult(SearchResultEntry searchResultEntry, EditorView editor, DataChannelDescriptor domain) {
         DataMap map;
-        Entity entity;
+        Entity<?,?,?> entity;
         if (searchResultEntry.getObject() instanceof Attribute) {
-            map = ((Attribute) searchResultEntry.getObject()).getEntity().getDataMap();
-            entity = ((Attribute) searchResultEntry.getObject()).getEntity();
+            map = ((Attribute<?,?,?>) searchResultEntry.getObject()).getEntity().getDataMap();
+            entity = ((Attribute<?,?,?>) searchResultEntry.getObject()).getEntity();
         } else {
-            map = ((Relationship) searchResultEntry.getObject()).getSourceEntity().getDataMap();
-            entity = ((Relationship) searchResultEntry.getObject()).getSourceEntity();
+            map = ((Relationship<?,?,?>) searchResultEntry.getObject()).getSourceEntity().getDataMap();
+            entity = ((Relationship<?,?,?>) searchResultEntry.getObject()).getSourceEntity();
         }
         buildAndSelectTreePath(map, entity, editor);
 
         if (searchResultEntry.getObject() instanceof Attribute) {
             AttributeDisplayEvent event = new AttributeDisplayEvent(editor.getProjectTreeView(),
-                    (Attribute) searchResultEntry.getObject(), entity, map, domain);
+                    (Attribute<?,?,?>) searchResultEntry.getObject(), entity, map, domain);
             event.setMainTabFocus(true);
             if(searchResultEntry.getObject() instanceof DbAttribute) {
                 editor.getDbDetailView().currentDbAttributeChanged(event);
@@ -285,7 +285,7 @@ public class FindAction extends CayenneAction {
             }
         } else if (searchResultEntry.getObject() instanceof Relationship) {
             RelationshipDisplayEvent event = new RelationshipDisplayEvent(editor.getProjectTreeView(),
-                    (Relationship) searchResultEntry.getObject(), entity, map, domain);
+                    (Relationship<?,?,?>) searchResultEntry.getObject(), entity, map, domain);
             event.setMainTabFocus(true);
             if(searchResultEntry.getObject() instanceof DbRelationship) {
                 editor.getDbDetailView().currentDbRelationshipChanged(event);
@@ -323,7 +323,7 @@ public class FindAction extends CayenneAction {
         editor.currentQueryChanged(event);
     }
 
-    private static void jumpToEntityResult(Entity entity, EditorView editor, DataChannelDescriptor domain) {
+    private static void jumpToEntityResult(Entity<?,?,?> entity, EditorView editor, DataChannelDescriptor domain) {
         DataMap map = entity.getDataMap();
         buildAndSelectTreePath(map, entity, editor);
         EntityDisplayEvent event = new EntityDisplayEvent(editor.getProjectTreeView(), entity, map, domain);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityCounterpartAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityCounterpartAction.java
index 903166c11..a77d67499 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityCounterpartAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityCounterpartAction.java
@@ -19,7 +19,7 @@
 
 package org.apache.cayenne.modeler.action;
 
-import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
 
@@ -38,7 +38,7 @@ public class ObjEntityCounterpartAction extends BaseViewEntityAction {
     }
 
     @Override
-    protected Entity getEntity() {
+    protected DbEntity getEntity() {
         ObjEntity objEntity = getProjectController().getCurrentObjEntity();
         if (objEntity == null) {
             return null;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityToSuperEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityToSuperEntityAction.java
index 2f363d375..72bd216d5 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityToSuperEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/ObjEntityToSuperEntityAction.java
@@ -19,7 +19,6 @@
 
 package org.apache.cayenne.modeler.action;
 
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.Application;
 
@@ -37,7 +36,7 @@ public class ObjEntityToSuperEntityAction extends BaseViewEntityAction {
     }
 
     @Override
-    protected Entity getEntity() {
+    protected ObjEntity getEntity() {
         ObjEntity objEntity = getProjectController().getCurrentObjEntity();
         if (objEntity == null) {
             return null;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java
index 66f2518c3..98dd22882 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/action/RemoveAttributeAction.java
@@ -72,7 +72,7 @@ public class RemoveAttributeAction extends RemoveAction implements MultipleObjec
      */
     @Override
     public boolean enableForPath(ConfigurationNode object) {
-        return object != null && object instanceof Attribute;
+        return object instanceof Attribute;
     }
 
     @Override
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
index 9ebd7d923..9d292227a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsController.java
@@ -24,9 +24,9 @@ import javax.swing.DefaultComboBoxModel;
 import javax.swing.JOptionPane;
 
 import org.apache.cayenne.map.DataMap;
+import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
@@ -139,20 +139,15 @@ public class InferRelationshipsController extends InferRelationshipsControllerBa
 
             this.strategy = createNamingStrategy(strategyClass);
 
-            /**
+            /*
              * Be user-friendly and update preferences with specified strategy
              */
             if (strategy == null) {
                 return;
             }
-            NameGeneratorPreferences
-                    .getInstance()
-                    .addToLastUsedStrategies(strategyClass);
+            NameGeneratorPreferences.getInstance().addToLastUsedStrategies(strategyClass);
             view.getStrategyCombo().setModel(
-                    new DefaultComboBoxModel(NameGeneratorPreferences
-                            .getInstance()
-                            .getLastUsedStrategies()));
-
+                    new DefaultComboBoxModel<>(NameGeneratorPreferences.getInstance().getLastUsedStrategies()));
         }
         catch (Throwable th) {
             logObj.error("Error in " + getClass().getName(), th);
@@ -176,10 +171,7 @@ public class InferRelationshipsController extends InferRelationshipsControllerBa
 
     public void generateAction() {
         
-        ProjectController mediator = application
-                .getFrameController()
-                .getProjectController();
-        
+        ProjectController mediator = application.getFrameController().getProjectController();
         InferRelationshipsUndoableEdit undoableEdit = new InferRelationshipsUndoableEdit();
         
         for (InferredRelationship temp : selectedEntities) {
@@ -206,7 +198,7 @@ public class InferRelationshipsController extends InferRelationshipsControllerBa
         view.dispose();
     }
 
-    private String uniqueRelName(Entity entity, String preferredName) {
+    private String uniqueRelName(DbEntity entity, String preferredName) {
         int currentSuffix = 1;
         String relName = preferredName;
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsDialog.java
index c695b747a..87fd2c86e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/autorelationship/InferRelationshipsDialog.java
@@ -43,7 +43,7 @@ public class InferRelationshipsDialog extends JDialog {
     protected JLabel entityCount;
     protected JLabel strategyLabel;
 
-    protected JComboBox strategyCombo;
+    protected JComboBox<String> strategyCombo;
 
     public InferRelationshipsDialog(Component entitySelectorPanel) {
         super(Application.getFrame());
@@ -54,7 +54,7 @@ public class InferRelationshipsDialog extends JDialog {
 
         getRootPane().setDefaultButton(generateButton);
 
-        this.strategyCombo = new JComboBox();
+        this.strategyCombo = new JComboBox<>();
         strategyCombo.setEditable(true);
         this.strategyLabel = new JLabel("Naming Strategy:  ");
 
@@ -106,7 +106,7 @@ public class InferRelationshipsDialog extends JDialog {
         return entityCount;
     }
 
-    public JComboBox getStrategyCombo() {
+    public JComboBox<String> getStrategyCombo() {
         return strategyCombo;
     }
 }
\ No newline at end of file
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
index 6ff536620..35761a252 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjAttributeInfoDialog.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
 import org.apache.cayenne.map.EmbeddedAttribute;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.event.AttributeEvent;
@@ -70,9 +69,9 @@ import static org.apache.cayenne.modeler.dialog.objentity.ObjAttributeInfoDialog
 
 public class ObjAttributeInfoDialog extends CayenneController implements TreeSelectionListener {
 
-	private ObjAttributeTableModel model;
+	private final ObjAttributeTableModel model;
 	private OverrideEmbeddableAttributeTableModel embeddableModel;
-	private int row;
+	private final int row;
 	protected ObjAttributeInfoDialogView view;
 	protected ObjAttribute attribute;
 	protected ObjAttribute attributeSaved;
@@ -189,7 +188,7 @@ public class ObjAttributeInfoDialog extends CayenneController implements TreeSel
 		 * set filter for ObjAttributePathBrowser
 		 */
 		if (view.getPathBrowser().getModel() == null) {
-			Entity firstEntity = null;
+			DbEntity firstEntity = null;
 			if (attribute.getDbAttribute() == null) {
 
 				if (attribute.getParent() instanceof ObjEntity) {
@@ -226,13 +225,10 @@ public class ObjAttributeInfoDialog extends CayenneController implements TreeSel
 		view.getTypeComboBox().addItemListener(e -> {
             if (lastObjectType != null) {
                 if (!lastObjectType.equals(e.getItemSelectable())) {
-
                     if (embeddableNames.contains(e.getItemSelectable().getSelectedObjects()[0].toString())) {
-                        if (attributeSaved instanceof ObjAttribute) {
-                            EmbeddedAttribute copyAttrSaved = new EmbeddedAttribute();
-                            copyObjAttribute(copyAttrSaved, attributeSaved);
-                            attributeSaved = copyAttrSaved;
-                        }
+						EmbeddedAttribute copyAttrSaved = new EmbeddedAttribute();
+						copyObjAttribute(copyAttrSaved, attributeSaved);
+						attributeSaved = copyAttrSaved;
                     } else {
                         if (attributeSaved instanceof EmbeddedAttribute) {
                             ObjAttribute copyAttrSaved = new ObjAttribute();
@@ -314,12 +310,10 @@ public class ObjAttributeInfoDialog extends CayenneController implements TreeSel
 	}
 
 	private void initComboBoxes() {
-		Collection<String> nameAttr = null;
 		if (attributeSaved != null) {
 			DbEntity currentEnt = attributeSaved.getEntity().getDbEntity();
-
 			if (currentEnt != null) {
-				nameAttr = ModelerUtil.getDbAttributeNames(currentEnt);
+				Collection<String> nameAttr = ModelerUtil.getDbAttributeNames(currentEnt);
 				embeddableModel.setCellEditor(nameAttr, view.getOverrideAttributeTable());
 				embeddableModel.setComboBoxes(
 						nameAttr,
@@ -565,9 +559,9 @@ public class ObjAttributeInfoDialog extends CayenneController implements TreeSel
 	public void valueChanged(TreeSelectionEvent e) {
 	}
 
-	private Entity getFirstEntity() {
+	private DbEntity getFirstEntity() {
 		Iterator<CayenneMapEntry> it = attribute.getDbPathIterator();
-		Entity firstEnt = attribute.getDbAttribute().getEntity();
+		DbEntity firstEnt = attribute.getDbAttribute().getEntity();
 		boolean setEnt = false;
 
 		while (it.hasNext()) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
index 3b394896b..da745e453 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfo.java
@@ -38,11 +38,9 @@ import org.apache.cayenne.dbsync.naming.ObjectNameGenerator;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.DeleteRule;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.MapEvent;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.Application;
@@ -442,7 +440,6 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
     /**
      * Places in objectTargets list all ObjEntities for specified DbEntity
      */
-    @SuppressWarnings("unchecked")
     protected void updateTargetCombo(DbEntity dbTarget) {
         // copy those that have DbEntities mapped to dbTarget, and then sort
 
@@ -642,22 +639,22 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
     // Connects last selected DbRelationship in the path to the
     // last DbEntity, creating a dummy relationship if needed.
     private void connectEnds() {
-        Relationship last = null;
+        DbRelationship last = null;
 
         int size = dbRelationships.size();
         if (size > 0) {
             last = dbRelationships.get(size - 1);
         }
 
-        Entity target = getEndEntity();
+        DbEntity target = getEndEntity();
 
         if (target != null && (last == null || last.getTargetEntity() != target)) {
             // try to connect automatically, if we can't use dummy connector
-            Entity source = (last == null) ? getStartEntity() : last.getTargetEntity();
+            DbEntity source = (last == null) ? getStartEntity() : last.getTargetEntity();
             if (source != null) {
-                Relationship anyConnector = source.getAnyRelationship(target);
+                DbRelationship anyConnector = source.getAnyRelationship(target);
                 if (anyConnector != null) {
-                    dbRelationships.add((DbRelationship) anyConnector);
+                    dbRelationships.add(anyConnector);
                 }
             }
         }
@@ -715,7 +712,7 @@ public class ObjRelationshipInfo extends CayenneController implements TreeSelect
         this.targetCollection = targetCollection;
     }
 
-    public List getMapKeys() {
+    public List<String> getMapKeys() {
         return mapKeys;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoView.java
index c3ad2a21c..488d48dbc 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/objentity/ObjRelationshipInfoView.java
@@ -45,7 +45,7 @@ public class ObjRelationshipInfoView extends JDialog{
     
     private static final Dimension BROWSER_CELL_DIM = new Dimension(130, 200);
 
-    private static final Object[] DELETE_RULES = new Object[]{
+    private static final String[] DELETE_RULES = new String[]{
             DeleteRule.deleteRuleName(DeleteRule.NO_ACTION),
             DeleteRule.deleteRuleName(DeleteRule.NULLIFY),
             DeleteRule.deleteRuleName(DeleteRule.CASCADE),
@@ -68,7 +68,7 @@ public class ObjRelationshipInfoView extends JDialog{
     private JLabel sourceEntityLabel;
     private JComboBox<String> targetCombo;
 
-    private JComboBox deleteRule;
+    private JComboBox<String> deleteRule;
     private JCheckBox usedForLocking;
     private JTextField comment;
 
@@ -101,9 +101,7 @@ public class ObjRelationshipInfoView extends JDialog{
         pathBrowser.setPreferredColumnSize(BROWSER_CELL_DIM);
         pathBrowser.setDefaultRenderer();
 
-        this.deleteRule = Application.getWidgetFactory().createComboBox(
-                DELETE_RULES,
-                false);
+        this.deleteRule = Application.getWidgetFactory().createComboBox(DELETE_RULES, false);
         this.usedForLocking = new JCheckBox();
         this.comment = new JTextField();
         
@@ -190,7 +188,7 @@ public class ObjRelationshipInfoView extends JDialog{
         return sourceEntityLabel;
     }
     
-    public JComboBox getTargetCombo()
+    public JComboBox<String> getTargetCombo()
     {
         return targetCombo;
     }
@@ -203,7 +201,7 @@ public class ObjRelationshipInfoView extends JDialog{
         return mapKeysCombo;
     }
 
-    public JComboBox getDeleteRule() {
+    public JComboBox<String> getDeleteRule() {
         return deleteRule;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/AttributeErrorMsg.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/AttributeErrorMsg.java
index 1cc5ded37..444090a80 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/AttributeErrorMsg.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/AttributeErrorMsg.java
@@ -39,42 +39,31 @@ import org.apache.cayenne.validation.ValidationFailure;
 public class AttributeErrorMsg extends ValidationDisplayHandler {
 
     protected DataMap map;
-    protected Entity entity;
-    protected Attribute attribute;
+    protected Entity<?,?,?> entity;
+    protected Attribute<?,?,?> attribute;
 
     /**
      * Constructor for AttributeErrorMsg.
-     * 
-     * @param result
      */
     public AttributeErrorMsg(ValidationFailure result) {
         super(result);
 
         Object object = result.getSource();
-        attribute = (Attribute) object;
+        attribute = (Attribute<?,?,?>) object;
         entity = attribute.getEntity();
         map = entity.getDataMap();
-        domain = (DataChannelDescriptor) Application
-                .getInstance()
-                .getProject()
-                .getRootNode();
+        domain = (DataChannelDescriptor) Application.getInstance().getProject().getRootNode();
     }
 
     public void displayField(ProjectController mediator, JFrame frame) {
-        AttributeDisplayEvent event = new AttributeDisplayEvent(
-                frame,
-                attribute,
-                entity,
-                map,
-                domain);
+        AttributeDisplayEvent event = new AttributeDisplayEvent(frame, attribute, entity, map, domain);
 
-        // must first display entity, and then switch to relationship display .. so fire
-        // twice
+        // must first display entity, and then switch to relationship display ..
+        // so fire twice
         if (entity instanceof ObjEntity) {
             mediator.fireObjEntityDisplayEvent(event);
             mediator.fireObjAttributeDisplayEvent(event);
-        }
-        else if (entity instanceof DbEntity) {
+        } else if (entity instanceof DbEntity) {
             mediator.fireDbEntityDisplayEvent(event);
             mediator.fireDbAttributeDisplayEvent(event);
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EntityErrorMsg.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EntityErrorMsg.java
index b513cfe22..826a76325 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EntityErrorMsg.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/EntityErrorMsg.java
@@ -38,18 +38,16 @@ import org.apache.cayenne.validation.ValidationFailure;
 public class EntityErrorMsg extends ValidationDisplayHandler {
 
     protected DataMap map;
-    protected Entity entity;
+    protected Entity<?,?,?> entity;
 
     /**
      * Constructor for EntityErrorMsg.
-     * 
-     * @param result
      */
     public EntityErrorMsg(ValidationFailure result) {
         super(result);
 
         Object object = result.getSource();
-        entity = (Entity) object;
+        entity = (Entity<?,?,?>) object;
         map = entity.getDataMap();
         domain = (DataChannelDescriptor) Application
                 .getInstance()
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/RelationshipErrorMsg.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/RelationshipErrorMsg.java
index 8b6d06a90..b98f6c53e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/RelationshipErrorMsg.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/dialog/validator/RelationshipErrorMsg.java
@@ -39,18 +39,16 @@ import org.apache.cayenne.validation.ValidationFailure;
 public class RelationshipErrorMsg extends ValidationDisplayHandler {
 
     protected DataMap map;
-    protected Entity entity;
-    protected Relationship rel;
+    protected Entity<?,?,?> entity;
+    protected Relationship<?,?,?> rel;
 
     /**
      * Constructor for RelationshipErrorMsg.
-     * 
-     * @param result
      */
     public RelationshipErrorMsg(ValidationFailure result) {
         super(result);
         Object object = result.getSource();
-        rel = (Relationship) object;
+        rel = (Relationship<?,?,?>) object;
         entity = rel.getSourceEntity();
         map = entity.getDataMap();
         domain = (DataChannelDescriptor) Application
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java
index e2d8da16a..1e952a46c 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/CallbackDescriptorTableModel.java
@@ -67,7 +67,7 @@ public class CallbackDescriptorTableModel extends CayenneTableModel<String> {
     /**
      * Returns Java class of the internal list elements.
      */
-    public Class getElementsClass() {
+    public Class<String> getElementsClass() {
         return String.class;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTabbedView.java
index 03259474b..a98783c88 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjEntityTabbedView.java
@@ -120,7 +120,7 @@ public class ObjEntityTabbedView extends JTabbedPane implements ObjEntityDisplay
     }
 
     public void currentObjEntityChanged(EntityDisplayEvent e) {
-        Entity entity = e.getEntity();
+        Entity<?,?,?> entity = e.getEntity();
 
         if (e.isMainTabFocus() && entity instanceof ObjEntity) {
             if (getSelectedComponent() != entityPanel) {
@@ -145,7 +145,7 @@ public class ObjEntityTabbedView extends JTabbedPane implements ObjEntityDisplay
         }
 
         // update relationship selection
-        Relationship[] rels = e.getRelationships();
+        Relationship<?,?,?>[] rels = e.getRelationships();
         ObjRelationship[] objRels = new ObjRelationship[rels.length];
 
         System.arraycopy(rels, 0, objRels, 0, rels.length);
@@ -164,7 +164,7 @@ public class ObjEntityTabbedView extends JTabbedPane implements ObjEntityDisplay
             return;
 
         // update attribute selection
-        Attribute[] attrs = e.getAttributes();
+        Attribute<?,?,?>[] attrs = e.getAttributes();
         ObjAttribute[] objAttrs = new ObjAttribute[attrs.length];
 
         System.arraycopy(attrs, 0, objAttrs, 0, attrs.length);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
index 1f9631796..a6c3c6436 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/ObjRelationshipTableModel.java
@@ -19,7 +19,11 @@
 
 package org.apache.cayenne.modeler.editor;
 
-import org.apache.cayenne.map.*;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.DeleteRule;
+import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.util.CayenneTableModel;
@@ -47,7 +51,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel<ObjRelationship
     public static final int REL_COMMENT = 6;
     public static final int COLUMN_COUNT = 7;
 
-    private ObjEntity entity;
+    private final ObjEntity entity;
 
     public ObjRelationshipTableModel(ObjEntity entity, ProjectController mediator, Object eventSource) {
         super(mediator, eventSource, new ArrayList<>(entity.getRelationships()));
@@ -65,7 +69,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel<ObjRelationship
      * Returns ObjRelationship class.
      */
     @Override
-    public Class getElementsClass() {
+    public Class<ObjRelationship> getElementsClass() {
         return ObjRelationship.class;
     }
 
@@ -96,7 +100,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel<ObjRelationship
     }
 
     @Override
-    public Class getColumnClass(int col) {
+    public Class<?> getColumnClass(int col) {
         switch (col) {
             case REL_TARGET:
                 return ObjEntity.class;
@@ -176,13 +180,12 @@ public class ObjRelationshipTableModel extends CayenneTableModel<ObjRelationship
 
                 // now try to connect DbEntities if we can do it in one step
                 if (target != null) {
-                    DbEntity srcDB = relationship.getSourceEntity()
-                            .getDbEntity();
+                    DbEntity srcDB = relationship.getSourceEntity().getDbEntity();
                     DbEntity targetDB = target.getDbEntity();
                     if (srcDB != null && targetDB != null) {
-                        Relationship anyConnector = srcDB.getAnyRelationship(targetDB);
+                        DbRelationship anyConnector = srcDB.getAnyRelationship(targetDB);
                         if (anyConnector != null) {
-                            relationship.addDbRelationship((DbRelationship) anyConnector);
+                            relationship.addDbRelationship(anyConnector);
                         }
                     }
                 }
@@ -214,7 +217,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel<ObjRelationship
         if (row < 0) {
             return;
         }
-        Relationship rel = getRelationship(row);
+        ObjRelationship rel = getRelationship(row);
         RelationshipEvent e;
         e = new RelationshipEvent(eventSource, rel, entity, RelationshipEvent.REMOVE);
         mediator.fireObjRelationshipEvent(e);
@@ -276,7 +279,7 @@ public class ObjRelationshipTableModel extends CayenneTableModel<ObjRelationship
 
     private static class ObjRelationshipTableComparator implements Comparator<ObjRelationship>{
 
-        private int sortCol;
+        private final int sortCol;
 
         ObjRelationshipTableComparator(int sortCol) {
             this.sortCol = sortCol;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/RootSelectionHandler.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/RootSelectionHandler.java
index e1f349445..bf56aa9ad 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/RootSelectionHandler.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/RootSelectionHandler.java
@@ -44,7 +44,7 @@ class RootSelectionHandler implements FocusListener, ActionListener {
     public void actionPerformed(ActionEvent ae) {
         QueryDescriptor query = queryTab.getQuery();
         if (query != null) {
-            Entity root = (Entity) queryTab.getQueryRoot().getModel().getSelectedItem();
+            Entity<?,?,?> root = (Entity<?,?,?>) queryTab.getQueryRoot().getModel().getSelectedItem();
 
             if (root != null) {
                 query.setRoot(root);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
index f15ce0cec..538223cf3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SQLTemplatePrefetchTab.java
@@ -138,7 +138,7 @@ public class SQLTemplatePrefetchTab extends JPanel implements PropertyChangeList
         }
 
         this.sqlTemplate = (SQLTemplateDescriptor) query;
-        browser.setModel(createBrowserModel((Entity) sqlTemplate.getRoot()));
+        browser.setModel(createBrowserModel((Entity<?,?,?>) sqlTemplate.getRoot()));
 
         table.setModel(createTableModel());
         setUpPrefetchBox(table.getColumnModel().getColumn(2));
@@ -273,16 +273,16 @@ public class SQLTemplatePrefetchTab extends JPanel implements PropertyChangeList
         return buffer.toString();
     }
 
-    protected TreeModel createBrowserModel(Entity entity) {
+    protected TreeModel createBrowserModel(Entity<?,?,?> entity) {
 
         EntityTreeModel treeModel = new EntityTreeModel(entity);
         treeModel.setFilter(
                 new EntityTreeFilter() {
-                    public boolean attributeMatch(Object node, Attribute attr) {
+                    public boolean attributeMatch(Object node, Attribute<?,?,?> attr) {
                         return false;
                     }
 
-                    public boolean relationshipMatch(Object node, Relationship rel) {
+                    public boolean relationshipMatch(Object node, Relationship<?,?,?> rel) {
                         return true;
                     }
                 });
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectPropertiesPanel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectPropertiesPanel.java
index 453566281..064ee057f 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectPropertiesPanel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectPropertiesPanel.java
@@ -21,8 +21,6 @@ package org.apache.cayenne.modeler.editor;
 
 import java.awt.Component;
 import java.awt.Container;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -55,7 +53,7 @@ import static org.apache.cayenne.util.Util.isNumeric;
  */
 public abstract class SelectPropertiesPanel extends JPanel {
 
-    private static Logger logObj = LoggerFactory.getLogger(SelectPropertiesPanel.class);
+    private static final Logger logObj = LoggerFactory.getLogger(SelectPropertiesPanel.class);
 
     private static final Integer ZERO = 0;
 
@@ -63,7 +61,7 @@ public abstract class SelectPropertiesPanel extends JPanel {
     private static final String LOCAL_CACHE_LABEL = "Local Cache (per ObjectContext)";
     private static final String SHARED_CACHE_LABEL = "Shared Cache";
 
-    protected static final Object[] CACHE_POLICIES = new Object[] {
+    protected static final QueryCacheStrategy[] CACHE_POLICIES = new QueryCacheStrategy[] {
             QueryCacheStrategy.NO_CACHE,
             QueryCacheStrategy.LOCAL_CACHE,
             QueryCacheStrategy.SHARED_CACHE
@@ -80,7 +78,7 @@ public abstract class SelectPropertiesPanel extends JPanel {
     protected TextAdapter fetchOffset;
     protected TextAdapter fetchLimit;
     protected TextAdapter pageSize;
-    protected JComboBox cacheStrategy;
+    protected JComboBox<QueryCacheStrategy> cacheStrategy;
     protected TextAdapter cacheGroups;
     protected JComponent cacheGroupsLabel;
 
@@ -121,12 +119,10 @@ public abstract class SelectPropertiesPanel extends JPanel {
     }
 
     protected void initController() {
-        cacheStrategy.addActionListener(new ActionListener() {
-            public void actionPerformed(ActionEvent event) {
-                QueryCacheStrategy strategy = (QueryCacheStrategy) cacheStrategy.getModel().getSelectedItem();
-                setQueryProperty(QueryMetadata.CACHE_STRATEGY_PROPERTY, strategy.name());
-                setCacheGroupsEnabled(strategy != QueryCacheStrategy.NO_CACHE);
-            }
+        cacheStrategy.addActionListener(event -> {
+            QueryCacheStrategy strategy = (QueryCacheStrategy) cacheStrategy.getModel().getSelectedItem();
+            setQueryProperty(QueryMetadata.CACHE_STRATEGY_PROPERTY, strategy.name());
+            setCacheGroupsEnabled(strategy != QueryCacheStrategy.NO_CACHE);
         });
     }
 
@@ -135,7 +131,7 @@ public abstract class SelectPropertiesPanel extends JPanel {
      * query is changed.
      */
     public void initFromModel(QueryDescriptor query) {
-        DefaultComboBoxModel cacheModel = new DefaultComboBoxModel(CACHE_POLICIES);
+        DefaultComboBoxModel<QueryCacheStrategy> cacheModel = new DefaultComboBoxModel<>(CACHE_POLICIES);
 
         String selectedStrategyString = query.getProperty(QueryMetadata.CACHE_STRATEGY_PROPERTY);
 
@@ -240,7 +236,7 @@ public abstract class SelectPropertiesPanel extends JPanel {
         }
     }
 
-    final class CacheStrategyRenderer extends DefaultListCellRenderer {
+    static final class CacheStrategyRenderer extends DefaultListCellRenderer {
 
         public Component getListCellRendererComponent(
                 JList list,
@@ -250,7 +246,7 @@ public abstract class SelectPropertiesPanel extends JPanel {
                 boolean arg4) {
 
             if (object != null) {
-                object = cachePolicyLabels.get(object);
+                object = cachePolicyLabels.get((QueryCacheStrategy)object);
             }
 
             if (object == null) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryMainTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryMainTab.java
index e63b40bc6..cb692c784 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryMainTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryMainTab.java
@@ -232,7 +232,7 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
                  * Advanced checking. See CAY-888 #1
                  */
                 if (query.getRoot() instanceof Entity) {
-                    checkExpression((Entity) query.getRoot(), exp);
+                    checkExpression((Entity<?,?,?>) query.getRoot(), exp);
                 }
 
                 return exp;
@@ -256,7 +256,7 @@ public class SelectQueryMainTab extends BaseQueryMainTab {
      * @param ex Expression to check
      * @throws ValidationException when something's wrong
      */
-    static void checkExpression(Entity root, Expression ex) throws ValidationException {
+    static void checkExpression(Entity<?,?,?> root, Expression ex) throws ValidationException {
         try {
             if (ex instanceof ASTPath) {
                 /*
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryOrderingTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryOrderingTab.java
index dec99f408..c3734c168 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryOrderingTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryOrderingTab.java
@@ -52,8 +52,6 @@ import javax.swing.tree.TreeModel;
 import java.awt.BorderLayout;
 import java.awt.CardLayout;
 import java.awt.Dimension;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.prefs.Preferences;
@@ -143,7 +141,7 @@ public class SelectQueryOrderingTab extends JPanel implements PropertyChangeList
         }
 
         this.selectQuery = (SelectQueryDescriptor) query;
-        browser.setModel(createBrowserModel((Entity) selectQuery.getRoot()));
+        browser.setModel(createBrowserModel((Entity<?,?,?>) selectQuery.getRoot()));
         table.setModel(createTableModel());
 
         // init column sizes
@@ -207,13 +205,7 @@ public class SelectQueryOrderingTab extends JPanel implements PropertyChangeList
         Icon removeIcon = ModelerUtil.buildIcon("icon-trash.png");
         remove.setIcon(removeIcon);
         remove.setDisabledIcon(FilteredIconFactory.createDisabledIcon(removeIcon));
-        remove.addActionListener(new ActionListener() {
-
-            public void actionPerformed(ActionEvent e) {
-                removeOrdering();
-            }
-
-        });
+        remove.addActionListener(e -> removeOrdering());
 
         JToolBar toolBar = new JToolBar();
         toolBar.setBorder(BorderFactory.createEmptyBorder());
@@ -223,7 +215,7 @@ public class SelectQueryOrderingTab extends JPanel implements PropertyChangeList
         return toolBar;
     }
 
-    protected TreeModel createBrowserModel(Entity entity) {
+    protected TreeModel createBrowserModel(Entity<?,?,?> entity) {
         return new EntityTreeModel(entity);
     }
 
@@ -322,7 +314,7 @@ public class SelectQueryOrderingTab extends JPanel implements PropertyChangeList
         }
 
         @Override
-        public Class getColumnClass(int column) {
+        public Class<?> getColumnClass(int column) {
             switch (column) {
                 case 0:
                     return String.class;
@@ -359,29 +351,24 @@ public class SelectQueryOrderingTab extends JPanel implements PropertyChangeList
 
             switch (column) {
                 case 1:
-                    if (((Boolean) value).booleanValue()) {
+                    if ((Boolean) value) {
                         ordering.setAscending();
-                    }
-                    else {
+                    } else {
                         ordering.setDescending();
                     }
                     break;
                 case 2:
-                    if (((Boolean) value).booleanValue()) {
+                    if ((Boolean) value) {
                         ordering.setCaseInsensitive();
-                    }
-                    else {
+                    } else {
                         ordering.setCaseSensitive();
                     }
                     break;
                 default:
-                    throw new IndexOutOfBoundsException("Invalid editable column: "
-                            + column);
+                    throw new IndexOutOfBoundsException("Invalid editable column: " + column);
             }
 
-            mediator.fireQueryEvent(new QueryEvent(
-                    SelectQueryOrderingTab.this,
-                    selectQuery));
+            mediator.fireQueryEvent(new QueryEvent(SelectQueryOrderingTab.this, selectQuery));
         }
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
index 2708ed1f7..e1c206df7 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/SelectQueryPrefetchTab.java
@@ -128,15 +128,15 @@ public class SelectQueryPrefetchTab extends SelectQueryOrderingTab {
         return toolBar;
     }
 
-    protected TreeModel createBrowserModel(Entity entity) {
+    protected TreeModel createBrowserModel(Entity<?,?,?> entity) {
         EntityTreeModel treeModel = new EntityTreeModel(entity);
         treeModel.setFilter(
                 new EntityTreeFilter() {
-                    public boolean attributeMatch(Object node, Attribute attr) {
+                    public boolean attributeMatch(Object node, Attribute<?,?,?> attr) {
                         return false;
                     }
 
-                    public boolean relationshipMatch(Object node, Relationship rel) {
+                    public boolean relationshipMatch(Object node, Relationship<?,?,?> rel) {
                         return true;
                     }
                 });
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityTabbedView.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityTabbedView.java
index e897ff27b..b13db54f4 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityTabbedView.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/dbentity/DbEntityTabbedView.java
@@ -142,7 +142,7 @@ public class DbEntityTabbedView extends JTabbedPane implements ChangeListener,
             return;
 
         // update attribute selection
-        Attribute[] attrs = e.getAttributes();
+        Attribute<?,?,?>[] attrs = e.getAttributes();
         DbAttribute[] dbAttrs = new DbAttribute[attrs.length];
 
         System.arraycopy(attrs, 0, dbAttrs, 0, attrs.length);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java
index 7fd3027f0..8b97f5cba 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/editor/wrapper/ObjAttributeWrapper.java
@@ -22,7 +22,6 @@ import java.util.List;
 
 import org.apache.cayenne.exp.ExpressionException;
 import org.apache.cayenne.map.DbAttribute;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.editor.validation.ObjAttributeWrapperValidator;
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java
index 87784a5fc..e67fdf8d3 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/AttributeDisplayEvent.java
@@ -25,12 +25,12 @@ import org.apache.cayenne.map.Entity;
 
 public class AttributeDisplayEvent extends EntityDisplayEvent {
    
-    protected final Attribute[] attributes;
+    protected final Attribute<?,?,?>[] attributes;
     
     public AttributeDisplayEvent(
             Object src,
-            Attribute attribute,
-            Entity entity,
+            Attribute<?,?,?> attribute,
+            Entity<?,?,?> entity,
             DataMap dataMap,
             DataChannelDescriptor domain) {
         this(src, new Attribute[]{attribute}, entity, dataMap, domain);
@@ -38,15 +38,15 @@ public class AttributeDisplayEvent extends EntityDisplayEvent {
 
     public AttributeDisplayEvent(
             Object src,
-            Attribute[] attributes,
-            Entity entity,
+            Attribute<?,?,?>[] attributes,
+            Entity<?,?,?> entity,
             DataMap dataMap,
             DataChannelDescriptor domain) {
         super(src, entity, dataMap, domain);
         this.attributes = attributes;
     }
     
-    public Attribute[] getAttributes() {
+    public Attribute<?,?,?>[] getAttributes() {
         return attributes;
     }
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/EntityDisplayEvent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/EntityDisplayEvent.java
index bfcf9cddd..29b1b4fe2 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/EntityDisplayEvent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/EntityDisplayEvent.java
@@ -29,7 +29,7 @@ import org.apache.cayenne.map.Entity;
  */
 public class EntityDisplayEvent extends DataMapDisplayEvent {
 
-    protected Entity entity;
+    protected Entity<?,?,?> entity;
 
     /**
      * If true, the event causes entity editor to switch to the main entity tab.
@@ -42,16 +42,16 @@ public class EntityDisplayEvent extends DataMapDisplayEvent {
     protected boolean entityChanged = true;
     protected boolean unselectAttributes;
 
-    public EntityDisplayEvent(Object src, Entity entity) {
+    public EntityDisplayEvent(Object src, Entity<?,?,?> entity) {
         this(src, entity, null, null, null);
     }
 
-    public EntityDisplayEvent(Object src, Entity entity, DataMap map, DataChannelDescriptor dataChannelDescriptor) {
+    public EntityDisplayEvent(Object src, Entity<?,?,?> entity, DataMap map, DataChannelDescriptor dataChannelDescriptor) {
 
         this(src, entity, map, null, dataChannelDescriptor);
     }
 
-    public EntityDisplayEvent(Object src, Entity entity, DataMap map, DataNodeDescriptor node,
+    public EntityDisplayEvent(Object src, Entity<?,?,?> entity, DataMap map, DataNodeDescriptor node,
             DataChannelDescriptor dataChannelDescriptor) {
 
         super(src, map, dataChannelDescriptor, node);
@@ -62,7 +62,7 @@ public class EntityDisplayEvent extends DataMapDisplayEvent {
     /**
      * Returns entity associated with this event.
      */
-    public Entity getEntity() {
+    public Entity<?,?,?> getEntity() {
         return entity;
     }
 
@@ -83,7 +83,7 @@ public class EntityDisplayEvent extends DataMapDisplayEvent {
         this.unselectAttributes = unselectAttributes;
     }
 
-    public void setEntity(Entity entity) {
+    public void setEntity(Entity<?,?,?> entity) {
         this.entity = entity;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/RelationshipDisplayEvent.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/RelationshipDisplayEvent.java
index 83750b751..5b20f38f1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/RelationshipDisplayEvent.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/event/RelationshipDisplayEvent.java
@@ -25,13 +25,13 @@ import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
 
 public class RelationshipDisplayEvent extends EntityDisplayEvent {
-    protected Relationship[] relationships;
+    protected Relationship<?,?,?>[] relationships;
     protected boolean relationshipChanged = true;
     
     public RelationshipDisplayEvent(
             Object src,
-            Relationship relationship,
-            Entity entity,
+            Relationship<?,?,?> relationship,
+            Entity<?,?,?> entity,
             DataMap map,
             DataChannelDescriptor domain) {
 
@@ -41,8 +41,8 @@ public class RelationshipDisplayEvent extends EntityDisplayEvent {
 
     public RelationshipDisplayEvent(
         Object src,
-        Relationship[] relationships,
-        Entity entity,
+        Relationship<?,?,?>[] relationships,
+        Entity<?,?,?> entity,
         DataMap map,
         DataChannelDescriptor domain) {
 
@@ -50,7 +50,7 @@ public class RelationshipDisplayEvent extends EntityDisplayEvent {
         this.relationships = relationships;
     }
     
-    public Relationship[] getRelationships() {
+    public Relationship<?,?,?>[] getRelationships() {
         return relationships;
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
index c7ef52e4d..2d80de535 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/BaseGraphBuilder.java
@@ -41,6 +41,7 @@ import org.apache.cayenne.configuration.ConfigurationNodeVisitor;
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.event.DataMapEvent;
 import org.apache.cayenne.configuration.event.DataMapListener;
+import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.Relationship;
@@ -70,7 +71,8 @@ import com.jgraph.layout.organic.JGraphOrganicLayout;
 /**
  * Base class for building graphs of entities
  */
-abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
+abstract class BaseGraphBuilder<E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
+        implements GraphBuilder<E, A, R>, DataMapListener {
 
     static final Font EDGE_FONT = new Font("Verdana", Font.PLAIN, 10);
 
@@ -106,7 +108,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
      */
     protected transient ProjectController mediator;
 
-    protected transient Entity selectedEntity;
+    protected transient Entity<E, A, R> selectedEntity;
 
     transient JPopupMenu popup;
 
@@ -148,7 +150,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
             DefaultGraphCell mapCell = new DefaultGraphCell();
             createdObjects.add(mapCell);
 
-            for (Entity entity : getEntities(map)) {
+            for (E entity : getEntities(map)) {
                 DefaultGraphCell cell = createEntityCell(entity);
 
                 // mapCell.add(cell);
@@ -164,7 +166,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
          * 2. Add all relationships
          */
         for (DataMap map : domain.getDataMaps()) {
-            for (Entity entity : getEntities(map)) {
+            for (E entity : getEntities(map)) {
                 DefaultGraphCell sourceCell = entityCells.get(entity.getName());
 
                 postProcessEntity(entity, sourceCell);
@@ -207,7 +209,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
             // JGraphSimpleLayout layout = new JGraphSimpleLayout(JGraphSimpleLayout.TYPE_TILT, 4000, 2000);
             layout.run(facade);
             // Obtain a map of the resulting attribute changes from the facade
-            Map nested = facade.createNestedMap(true, true);
+            Map<?,?> nested = facade.createNestedMap(true, true);
 
             // Apply the results to the actual graph
             edit(nested);
@@ -216,14 +218,15 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
 
 	private void addMouseListeners() {
 		graph.addMouseListener(new MouseAdapter() {
+            @SuppressWarnings("unchecked")
             @Override
             public void mouseReleased(MouseEvent e) {
                 if (e.isPopupTrigger()) {
                     Object selected = graph.getSelectionCell();
-                    if (selected != null && selected instanceof DefaultGraphCell) {
+                    if (selected instanceof DefaultGraphCell) {
                         Object userObject = ((DefaultGraphCell) selected).getUserObject();
                         if (userObject instanceof EntityCellMetadata) {
-                            showPopup(e.getPoint(), ((EntityCellMetadata) userObject).fetchEntity());
+                            showPopup(e.getPoint(), ((EntityCellMetadata<E,A,R>) userObject).fetchEntity());
                         }
                     }
                 }
@@ -257,7 +260,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
             for (int isolatedIndex = 0; isolatedIndex < isolatedObjects.size();) {
                 for (int i = 0; isolatedIndex < isolatedObjects.size() && i < x - row; i++) {
                     GraphConstants.setBounds(isolatedObjects.get(isolatedIndex).getAttributes(),
-                            new Rectangle2D.Double(pref.width - posX, pref.height - 3 * posY / 2, 10, 10));
+                            new Rectangle2D.Double(pref.width - posX, pref.height - (3.0 * posY) / 2, 10, 10));
                     isolatedIndex += 2; // because every 2nd object is port
                     posX += dx;
                 }
@@ -268,7 +271,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         }
 	}
 
-    protected DefaultGraphCell createEntityCell(Entity entity) {
+    protected DefaultGraphCell createEntityCell(E entity) {
         DefaultGraphCell cell = new DefaultGraphCell(getCellMetadata(entity));
 
         GraphConstants.setResize(cell.getAttributes(), true);
@@ -289,8 +292,8 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
     /**
      * Post (i.e. after creation on entity cell) process of the entity
      */
-    protected void postProcessEntity(Entity<?,?,?> entity, DefaultGraphCell cell) {
-        for (Relationship rel : entity.getRelationships()) {
+    protected void postProcessEntity(E entity, DefaultGraphCell cell) {
+        for (R rel : entity.getRelationships()) {
             if (rel.getSourceEntity() != null && rel.getTargetEntity() != null) {
                 DefaultEdge edge = createRelationshipCell(rel);
                 if (edge != null) {
@@ -304,12 +307,12 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
      * Returns whether an entity is not connected to any other TODO: not fine
      * algorithm, it iterates through all entities and all rels
      */
-    protected boolean isIsolated(DataChannelDescriptor domain, Entity entity) {
+    protected boolean isIsolated(DataChannelDescriptor domain, E entity) {
         if (entity.getRelationships().size() == 0) {
             // searching for rels that have a target="entity"
 
             for (DataMap map : domain.getDataMaps()) {
-                for (Entity source : getEntities(map)) {
+                for (E source : getEntities(map)) {
                     if (source.getAnyRelationship(entity) != null) {
                         return false;
                     }
@@ -320,13 +323,14 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         return false;
     }
 
-    protected abstract Collection<? extends Entity> getEntities(DataMap map);
+    protected abstract Collection<E> getEntities(DataMap map);
 
     /**
      * Returns label for relationship on the graph, considering its "mandatory"
      * and "to-many" properties
      */
-    private static String getRelationshipLabel(Relationship rel) {
+    private static <E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
+    String getRelationshipLabel(Relationship<E, A, R> rel) {
         if (rel == null) {
             return null;
         }
@@ -340,9 +344,9 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
     /**
      * Returns metadata (user object) for this cell
      */
-    protected abstract EntityCellMetadata getCellMetadata(Entity e);
+    protected abstract EntityCellMetadata<E, A, R> getCellMetadata(E e);
 
-    protected void showPopup(Point p, Entity entity) {
+    protected void showPopup(Point p, Entity<E, A, R> entity) {
         selectedEntity = entity;
         if (popup == null) {
             popup = createPopupMenu();
@@ -351,7 +355,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
     }
 
     @Override
-    public Entity getSelectedEntity() {
+    public Entity<E, A, R> getSelectedEntity() {
         return selectedEntity;
     }
 
@@ -375,7 +379,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
     /**
      * Updates specified entity on the graph
      */
-    protected void updateEntityCell(Entity e) {
+    protected void updateEntityCell(E e) {
         DefaultGraphCell cell = entityCells.get(e.getName());
         if (cell != null) {
             GraphConstants.setValue(cell.getAttributes(), getCellMetadata(e));
@@ -388,7 +392,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         }
     }
 
-    protected void updateRelationshipCell(Relationship rel) {
+    protected void updateRelationshipCell(R rel) {
         if (rel.getSourceEntity() != null && rel.getTargetEntity() != null) {
             DefaultEdge edge = relCells.get(getQualifiedName(rel));
             if (edge != null) {
@@ -403,7 +407,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         }
     }
 
-    protected void removeEntityCell(Entity e) {
+    protected void removeEntityCell(E e) {
         final DefaultGraphCell cell = entityCells.get(e.getName());
         if (cell != null) {
             runWithUndoDisabled(() -> graph.getGraphLayoutCache().remove(new Object[] { cell }, true, true));
@@ -411,7 +415,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         }
     }
 
-    protected void removeRelationshipCell(Relationship rel) {
+    protected void removeRelationshipCell(R rel) {
         final DefaultEdge edge = relCells.get(getQualifiedName(rel));
         if (edge != null) {
             runWithUndoDisabled(() -> graph.getGraphLayoutCache().remove(new Object[] { edge }));
@@ -419,9 +423,9 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         }
     }
 
-    protected DefaultEdge createRelationshipCell(Relationship rel) {
+    protected DefaultEdge createRelationshipCell(R rel) {
         if (!relCells.containsKey(getQualifiedName(rel))) {
-            Relationship reverse = rel.getReverseRelationship();
+            Relationship<E, A, R> reverse = rel.getReverseRelationship();
 
             DefaultEdge edge = new DefaultEdge();
 
@@ -448,12 +452,12 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         return null;
     }
 
-    protected void insertRelationshipCell(Relationship rel) {
+    protected void insertRelationshipCell(R rel) {
         DefaultEdge edge = createRelationshipCell(rel);
         insert(edge);
     }
 
-    protected void insertEntityCell(Entity entity) {
+    protected void insertEntityCell(E entity) {
         DefaultGraphCell cell = createEntityCell(entity);
 
         // putting cell to a random posistion..
@@ -469,7 +473,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
     /**
      * Updates relationship labels for specified relationship edge.
      */
-    protected void updateRelationshipLabels(DefaultEdge edge, Relationship rel, Relationship reverse) {
+    protected void updateRelationshipLabels(DefaultEdge edge, Relationship<E, A, R> rel, Relationship<E, A, R> reverse) {
         DefaultGraphCell sourceCell = entityCells.get(rel.getSourceEntity().getName());
         DefaultGraphCell targetCell = entityCells.get(rel.getTargetEntity().getName());
 
@@ -502,7 +506,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
 
     @Override
     public void dataMapRemoved(DataMapEvent e) {
-        for (Entity entity : getEntities(e.getDataMap())) {
+        for (E entity : getEntities(e.getDataMap())) {
             removeEntityCell(entity);
         }
     }
@@ -539,9 +543,10 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
     /**
      * Checks if entity name has changed, then changes map key
      */
+    @SuppressWarnings("unchecked")
     protected void remapRelationship(RelationshipEvent e) {
         if (e.isNameChange()) {
-            relCells.put(getQualifiedName(e.getRelationship()),
+            relCells.put(getQualifiedName((Relationship<E, A, R>)e.getRelationship()),
                     relCells.remove(e.getEntity().getName() + "." + e.getOldName()));
         }
     }
@@ -550,7 +555,8 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
      * Returns qualified name (entity name + relationship name) for a
      * relationship
      */
-    static String getQualifiedName(Relationship rel) {
+    static <E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
+    String getQualifiedName(Relationship<E, A, R> rel) {
         return rel.getSourceEntity().getName() + "." + rel.getName();
     }
 
@@ -575,7 +581,7 @@ abstract class BaseGraphBuilder implements GraphBuilder, DataMapListener {
         encoder.end();
     }
 
-    private void edit(final Map map) {
+    private void edit(final Map<?,?> map) {
         runWithUndoDisabled(() -> graph.getGraphLayoutCache().edit(map));
     }
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DataDomainGraphTab.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DataDomainGraphTab.java
index e8252bc2f..47bbcfb2e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DataDomainGraphTab.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DataDomainGraphTab.java
@@ -58,7 +58,7 @@ public class DataDomainGraphTab extends JPanel implements DomainDisplayListener,
     /**
      * Diagram selection combo
      */
-    JComboBox diagramCombo;
+    JComboBox<String> diagramCombo;
 
     /**
      * Scrollpane that the graph will be added to
@@ -125,7 +125,7 @@ public class DataDomainGraphTab extends JPanel implements DomainDisplayListener,
             // selecting an event
 
             // choose type of diagram
-            Entity entity = ((EntityDisplayEvent) e).getEntity();
+            Entity<?,?,?> entity = ((EntityDisplayEvent) e).getEntity();
             diagramCombo.setSelectedIndex(entity instanceof ObjEntity ? 1 : 0);
             refresh();
 
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java
index b2261d667..9c9530807 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/DbGraphBuilder.java
@@ -23,8 +23,9 @@ import java.util.Collection;
 
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.dbsync.model.DetectedDbEntity;
-import org.apache.cayenne.map.Entity;
-import org.apache.cayenne.map.Relationship;
+import org.apache.cayenne.map.DbAttribute;
+import org.apache.cayenne.map.DbEntity;
+import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.DbAttributeListener;
 import org.apache.cayenne.map.event.DbEntityListener;
@@ -39,18 +40,18 @@ import org.jgraph.graph.GraphConstants;
 /**
  * Class for building ER-graph, based on DbEntity information
  */
-class DbGraphBuilder extends BaseGraphBuilder implements DbEntityListener,
+class DbGraphBuilder extends BaseGraphBuilder<DbEntity, DbAttribute, DbRelationship> implements DbEntityListener,
         DbAttributeListener, DbRelationshipListener {
 
     static final Color ENTITY_COLOR = new Color(197, 253, 252);
 
     @Override
-    protected Collection<? extends Entity> getEntities(DataMap map) {
+    protected Collection<DbEntity> getEntities(DataMap map) {
         return map.getDbEntities();
     }
 
     @Override
-    protected void postProcessEntity(Entity entity, DefaultGraphCell cell) {
+    protected void postProcessEntity(DbEntity entity, DefaultGraphCell cell) {
         super.postProcessEntity(entity, cell);
 
         GraphConstants.setBackground(cell.getAttributes(), ENTITY_COLOR);
@@ -58,12 +59,12 @@ class DbGraphBuilder extends BaseGraphBuilder implements DbEntityListener,
     }
 
     @Override
-    protected EntityCellMetadata getCellMetadata(Entity e) {
+    protected DbEntityCellMetadata getCellMetadata(DbEntity e) {
         return new DbEntityCellMetadata(this, e.getName());
     }
 
     @Override
-    protected DefaultEdge createRelationshipCell(Relationship rel) {
+    protected DefaultEdge createRelationshipCell(DbRelationship rel) {
         DefaultEdge edge = super.createRelationshipCell(rel);
         if (edge != null) {
             GraphConstants.setDashPattern(edge.getAttributes(), new float[] {
@@ -95,29 +96,29 @@ class DbGraphBuilder extends BaseGraphBuilder implements DbEntityListener,
         if(e.getEntity() instanceof DetectedDbEntity) {
             return;
         }
-        insertEntityCell(e.getEntity());
+        insertEntityCell((DbEntity) e.getEntity());
     }
 
     public void dbEntityChanged(EntityEvent e) {
         remapEntity(e);
 
-        updateEntityCell(e.getEntity());
+        updateEntityCell((DbEntity)e.getEntity());
     }
 
     public void dbEntityRemoved(EntityEvent e) {
-        removeEntityCell(e.getEntity());
+        removeEntityCell((DbEntity) e.getEntity());
     }
 
     public void dbAttributeAdded(AttributeEvent e) {
-        updateEntityCell(e.getEntity());
+        updateEntityCell((DbEntity)e.getEntity());
     }
 
     public void dbAttributeChanged(AttributeEvent e) {
-        updateEntityCell(e.getEntity());
+        updateEntityCell((DbEntity)e.getEntity());
     }
 
     public void dbAttributeRemoved(AttributeEvent e) {
-        updateEntityCell(e.getEntity());
+        updateEntityCell((DbEntity)e.getEntity());
     }
 
     public void dbRelationshipAdded(RelationshipEvent e) {
@@ -125,12 +126,12 @@ class DbGraphBuilder extends BaseGraphBuilder implements DbEntityListener,
     }
 
     public void dbRelationshipChanged(RelationshipEvent e) {
-        updateRelationshipCell(e.getRelationship());
+        updateRelationshipCell((DbRelationship) e.getRelationship());
     }
 
     public void dbRelationshipRemoved(RelationshipEvent e) {
         remapRelationship(e);
-        removeRelationshipCell(e.getRelationship());
+        removeRelationshipCell((DbRelationship) e.getRelationship());
     }
 
     public GraphType getType() {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/EntityCellMetadata.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/EntityCellMetadata.java
index b9affa6ec..55749744d 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/EntityCellMetadata.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/EntityCellMetadata.java
@@ -27,7 +27,8 @@ import org.apache.cayenne.map.Relationship;
 /**
  * Abstract class to describe entity's cell 
  */
-abstract class EntityCellMetadata<E extends Entity<E, T, U>, T extends Attribute<E,T,U>, U extends Relationship<E,T,U>> implements Serializable {
+abstract class EntityCellMetadata<E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>>
+        implements Serializable {
     GraphBuilder builder;
     
     String entityName;
@@ -46,7 +47,7 @@ abstract class EntityCellMetadata<E extends Entity<E, T, U>, T extends Attribute
     /**
      * Resolves entity
      */
-    public abstract Entity<E,T,U> fetchEntity();
+    public abstract Entity<E, A, R> fetchEntity();
     
     final void rebuildLabel() {
         label = createLabel();
@@ -64,15 +65,15 @@ abstract class EntityCellMetadata<E extends Entity<E, T, U>, T extends Attribute
      * Creates label for this cell
      */
     String createLabel() {
-        Entity<E,T,U> entity = fetchEntity();
+        Entity<E, A, R> entity = fetchEntity();
         StringBuilder label = new StringBuilder("<html><center><u><b>").
                 append(entity.getName()).append("</b></u></center>");
-        for (T attr : entity.getAttributes()) {
+        for (A attr : entity.getAttributes()) {
             if (isPrimary(attr)) {
                 label.append("<br><i>").append(attr.getName()).append("</i>");
             }
         }
-        for (T attr : entity.getAttributes()) {
+        for (A attr : entity.getAttributes()) {
             if (!isPrimary(attr)) {
                 label.append("<br>").append(attr.getName());
             }
@@ -83,5 +84,5 @@ abstract class EntityCellMetadata<E extends Entity<E, T, U>, T extends Attribute
     /**
      * Returns whether attribute is "primary" and should therefore be written in italic
      */
-    protected abstract boolean isPrimary(T attr);
+    protected abstract boolean isPrimary(A attr);
 }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/GraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/GraphBuilder.java
index 5764ce4d0..1ebbd5278 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/GraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/GraphBuilder.java
@@ -21,7 +21,9 @@ package org.apache.cayenne.modeler.graph;
 import javax.swing.event.UndoableEditListener;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
+import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.Entity;
+import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.util.XMLSerializable;
 import org.jgraph.JGraph;
@@ -30,7 +32,7 @@ import org.jgraph.graph.DefaultGraphCell;
 /**
  * Interface for building graphs which represent some perspective of a domain
  */
-public interface GraphBuilder extends XMLSerializable, UndoableEditListener {
+public interface GraphBuilder<E extends Entity<E, A, R>, A extends Attribute<E, A, R>, R extends Relationship<E, A, R>> extends XMLSerializable, UndoableEditListener {
 
     double ZOOM_FACTOR = 1.3;
     
@@ -62,7 +64,7 @@ public interface GraphBuilder extends XMLSerializable, UndoableEditListener {
     /**
      * Returns selected entity, <code>null</code> if none is selected
      */
-    Entity getSelectedEntity();
+    Entity<E,A,R> getSelectedEntity();
     
     /**
      * Returns cell of an entity
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjGraphBuilder.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjGraphBuilder.java
index d7189b1a3..10ef31174 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjGraphBuilder.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/ObjGraphBuilder.java
@@ -20,10 +20,11 @@ package org.apache.cayenne.modeler.graph;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.map.DataMap;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.EntityInheritanceTree;
 import org.apache.cayenne.map.EntityResolver;
+import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.event.AttributeEvent;
 import org.apache.cayenne.map.event.EntityEvent;
 import org.apache.cayenne.map.event.ObjAttributeListener;
@@ -35,7 +36,6 @@ import org.jgraph.graph.AttributeMap;
 import org.jgraph.graph.DefaultEdge;
 import org.jgraph.graph.DefaultGraphCell;
 import org.jgraph.graph.GraphConstants;
-import org.slf4j.LoggerFactory;
 
 import java.awt.*;
 import java.util.Collection;
@@ -45,30 +45,30 @@ import java.util.Map;
 /**
  * Builder of ObjEntity information-based graph (relative to UML class diagram)
  */
-class ObjGraphBuilder extends BaseGraphBuilder implements ObjEntityListener,
+class ObjGraphBuilder extends BaseGraphBuilder<ObjEntity, ObjAttribute, ObjRelationship> implements ObjEntityListener,
         ObjAttributeListener, ObjRelationshipListener {
 
     static final Color ENTITY_COLOR = new Color(255, 255, 185);
 
-    Map<Entity, DefaultEdge> inheritanceEdges;
+    Map<ObjEntity, DefaultEdge> inheritanceEdges;
 
     public ObjGraphBuilder() {
         inheritanceEdges = new HashMap<>();
     }
 
     @Override
-    protected Collection<? extends Entity> getEntities(DataMap map) {
+    protected Collection<ObjEntity> getEntities(DataMap map) {
         return map.getObjEntities();
     }
 
     @Override
-    protected boolean isIsolated(DataChannelDescriptor domain, Entity entity) {
+    protected boolean isIsolated(DataChannelDescriptor domain, ObjEntity entity) {
 
         if (!super.isIsolated(domain, entity)) {
             return false;
         }
 
-        if (((ObjEntity) entity).getSuperEntity() != null) {
+        if (entity.getSuperEntity() != null) {
             return false;
         }
 
@@ -79,13 +79,13 @@ class ObjGraphBuilder extends BaseGraphBuilder implements ObjEntityListener,
     }
 
     @Override
-    protected void postProcessEntity(Entity entity, DefaultGraphCell cell) {
+    protected void postProcessEntity(ObjEntity entity, DefaultGraphCell cell) {
         super.postProcessEntity(entity, cell);
 
         GraphConstants.setBackground(cell.getAttributes(), ENTITY_COLOR);
         GraphConstants.setOpaque(cell.getAttributes(), true);
 
-        DefaultEdge edge = createInheritanceEdge((ObjEntity) entity);
+        DefaultEdge edge = createInheritanceEdge(entity);
         if (edge != null) {
             createdObjects.add(edge);
         }
@@ -119,7 +119,7 @@ class ObjGraphBuilder extends BaseGraphBuilder implements ObjEntityListener,
     }
 
     @Override
-    protected EntityCellMetadata getCellMetadata(Entity e) {
+    protected ObjEntityCellMetadata getCellMetadata(ObjEntity e) {
         return new ObjEntityCellMetadata(this, e.getName());
     }
 
@@ -141,13 +141,13 @@ class ObjGraphBuilder extends BaseGraphBuilder implements ObjEntityListener,
     }
 
     public void objEntityAdded(EntityEvent e) {
-        insertEntityCell(e.getEntity());
+        insertEntityCell((ObjEntity) e.getEntity());
     }
 
     public void objEntityChanged(EntityEvent e) {
         remapEntity(e);
 
-        updateEntityCell(e.getEntity());
+        updateEntityCell((ObjEntity)e.getEntity());
 
         // maybe super entity was changed
         ObjEntity entity = (ObjEntity) e.getEntity();
@@ -178,19 +178,19 @@ class ObjGraphBuilder extends BaseGraphBuilder implements ObjEntityListener,
     }
 
     public void objEntityRemoved(EntityEvent e) {
-        removeEntityCell(e.getEntity());
+        removeEntityCell((ObjEntity)e.getEntity());
     }
 
     public void objAttributeAdded(AttributeEvent e) {
-        updateEntityCell(e.getEntity());
+        updateEntityCell((ObjEntity)e.getEntity());
     }
 
     public void objAttributeChanged(AttributeEvent e) {
-        updateEntityCell(e.getEntity());
+        updateEntityCell((ObjEntity)e.getEntity());
     }
 
     public void objAttributeRemoved(AttributeEvent e) {
-        updateEntityCell(e.getEntity());
+        updateEntityCell((ObjEntity)e.getEntity());
     }
 
     public void objRelationshipAdded(RelationshipEvent e) {
@@ -199,15 +199,15 @@ class ObjGraphBuilder extends BaseGraphBuilder implements ObjEntityListener,
 
     public void objRelationshipChanged(RelationshipEvent e) {
         remapRelationship(e);
-        updateRelationshipCell(e.getRelationship());
+        updateRelationshipCell((ObjRelationship) e.getRelationship());
     }
 
     public void objRelationshipRemoved(RelationshipEvent e) {
-        removeRelationshipCell(e.getRelationship());
+        removeRelationshipCell((ObjRelationship)e.getRelationship());
     }
 
     @Override
-    protected void removeEntityCell(Entity e) {
+    protected void removeEntityCell(ObjEntity e) {
         super.removeEntityCell(e);
         inheritanceEdges.remove(e);
     }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java
index 43e9a62dc..d0be3808a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/EntityDisplayAction.java
@@ -40,7 +40,7 @@ public class EntityDisplayAction extends CayenneAction {
      */
     private CayenneAction delegate;
 
-    private GraphBuilder builder;
+    private final GraphBuilder builder;
 
     public EntityDisplayAction(GraphBuilder builder) {
         super("Show", Application.getInstance());
@@ -75,7 +75,7 @@ public class EntityDisplayAction extends CayenneAction {
     }
 
     private boolean display() {
-        Entity entity = builder.getSelectedEntity();
+        Entity<?,?,?> entity = builder.getSelectedEntity();
         if (entity == null) {
             return false;
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/RemoveEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/RemoveEntityAction.java
index 45abe93d2..110720fde 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/RemoveEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/RemoveEntityAction.java
@@ -33,9 +33,9 @@ import org.apache.cayenne.modeler.undo.RemoveUndoableEdit;
  * Action for removing entities from the graph
  */
 public class RemoveEntityAction extends RemoveAction {
-    GraphBuilder builder;
+    GraphBuilder<?,?,?> builder;
     
-    public RemoveEntityAction(GraphBuilder builder) {
+    public RemoveEntityAction(GraphBuilder<?,?,?> builder) {
         super(Application.getInstance());
         this.builder = builder;
         setEnabled(true);
@@ -45,7 +45,7 @@ public class RemoveEntityAction extends RemoveAction {
     public void performAction(ActionEvent e, boolean allowAsking) {
         ConfirmRemoveDialog dialog = getConfirmDeleteDialog(allowAsking);
 
-        Entity entity = builder.getSelectedEntity();
+        Entity<?,?,?> entity = builder.getSelectedEntity();
         if (entity == null) {
             return;
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/ShowGraphEntityAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/ShowGraphEntityAction.java
index df9a8e64f..7b4eac0ef 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/ShowGraphEntityAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/graph/action/ShowGraphEntityAction.java
@@ -52,13 +52,12 @@ public class ShowGraphEntityAction extends CayenneAction {
 
     @Override
     public void performAction(ActionEvent e) {
-        Entity entity = null;
+        Entity<?,?,?> entity = null;
 
         ProjectController mediator = getProjectController();
         if (mediator.getCurrentDbEntity() != null) {
             entity = mediator.getCurrentDbEntity();
-        }
-        else if (mediator.getCurrentObjEntity() != null) {
+        } else if (mediator.getCurrentObjEntity() != null) {
             entity = mediator.getCurrentObjEntity();
         }
 
@@ -72,7 +71,7 @@ public class ShowGraphEntityAction extends CayenneAction {
         return object instanceof Entity;
     }
 
-    void showEntity(Entity entity) {
+    void showEntity(Entity<?,?,?> entity) {
         // we're always in same domain
         EditorView editor = ((CayenneModelerFrame) Application
                 .getInstance()
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
index b595acb83..fa353c189 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/undo/RemoveUndoableEdit.java
@@ -29,7 +29,6 @@ import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.Application;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.modeler.action.CreateDataMapAction;
@@ -64,23 +63,21 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
 
     private Embeddable embeddable;
 
-    private Map<DbEntity, List<DbRelationship>> dbRelationshipMap = new HashMap<>();
-    private Map<ObjEntity, List<ObjRelationship>> objRelationshipMap = new HashMap<>();
+    private final Map<DbEntity, List<DbRelationship>> dbRelationshipMap = new HashMap<>();
+    private final Map<ObjEntity, List<ObjRelationship>> objRelationshipMap = new HashMap<>();
 
-    private static enum REMOVE_MODE {
+    private enum REMOVE_MODE {
         OBJECT_ENTITY, DB_ENTITY, QUERY, PROCEDURE, MAP_FROM_NODE, MAP_FROM_DOMAIN, NODE, DOMAIN, EMBEDDABLE
-    };
+    }
 
-    private REMOVE_MODE mode;
+    private final REMOVE_MODE mode;
 
     public RemoveUndoableEdit(Application application) {
         this.domain = (DataChannelDescriptor) application.getProject().getRootNode();
-        ;
         this.mode = REMOVE_MODE.DOMAIN;
     }
 
-    public RemoveUndoableEdit(Application application, DataNodeDescriptor node,
-            DataMap map) {
+    public RemoveUndoableEdit(Application application, DataNodeDescriptor node, DataMap map) {
         this.map = map;
         this.dataNode = node;
         this.mode = REMOVE_MODE.MAP_FROM_NODE;
@@ -88,14 +85,12 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
 
     public RemoveUndoableEdit(Application application, DataMap map) {
         this.domain = (DataChannelDescriptor) application.getProject().getRootNode();
-        ;
         this.map = map;
         this.mode = REMOVE_MODE.MAP_FROM_DOMAIN;
     }
 
     public RemoveUndoableEdit(Application application, DataNodeDescriptor node) {
         this.domain = (DataChannelDescriptor) application.getProject().getRootNode();
-        ;
         this.dataNode = node;
         this.mode = REMOVE_MODE.NODE;
     }
@@ -107,20 +102,10 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
 
         for (ObjEntity ent : map.getObjEntities()) {
             // take a copy since we're going to modify the entity
-            for (Relationship relationship : new ArrayList<Relationship>(ent
-                    .getRelationships())) {
-
+            for (ObjRelationship relationship : new ArrayList<>(ent.getRelationships())) {
                 if (this.objEntity.getName().equals(relationship.getTargetEntityName())) {
-
-                    ObjRelationship rel = (ObjRelationship) relationship;
-
-                    if (objRelationshipMap.get(rel.getSourceEntity()) == null) {
-                        objRelationshipMap.put(
-                                (ObjEntity) rel.getSourceEntity(),
-                                new LinkedList<ObjRelationship>());
-                    }
-
-                    objRelationshipMap.get(rel.getSourceEntity()).add(rel);
+                    objRelationshipMap.computeIfAbsent(relationship.getSourceEntity(), k -> new LinkedList<>());
+                    objRelationshipMap.get(relationship.getSourceEntity()).add(relationship);
                 }
             }
         }
@@ -132,17 +117,11 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
         this.mode = REMOVE_MODE.DB_ENTITY;
 
         for (ObjEntity objEnt : map.getObjEntities()) {
-            for (Relationship rel : objEnt.getRelationships()) {
-                for (DbRelationship dbRel : ((ObjRelationship) rel).getDbRelationships()) {
+            for (ObjRelationship rel : objEnt.getRelationships()) {
+                for (DbRelationship dbRel : rel.getDbRelationships()) {
                     if (dbRel.getTargetEntity() == dbEntity) {
-
-                        if (dbRelationshipMap.get(dbRel.getSourceEntity()) == null) {
-                            dbRelationshipMap.put(
-                                    (DbEntity) dbRel.getSourceEntity(),
-                                    new LinkedList<DbRelationship>());
-                        }
+                        dbRelationshipMap.computeIfAbsent(dbRel.getSourceEntity(), k -> new LinkedList<>());
                         dbRelationshipMap.get(dbRel.getSourceEntity()).add(dbRel);
-
                         break;
                     }
                 }
@@ -230,103 +209,68 @@ public class RemoveUndoableEdit extends CayenneUndoableEdit {
     @Override
     public void undo() throws CannotUndoException {
 
-        CreateRelationshipAction relationshipAction = actionManager
-                .getAction(CreateRelationshipAction.class);
+        CreateRelationshipAction relationshipAction = actionManager.getAction(CreateRelationshipAction.class);
 
         switch (this.mode) {
             case OBJECT_ENTITY: {
-                for (Entry<ObjEntity, List<ObjRelationship>> entry : objRelationshipMap
-                        .entrySet()) {
-
+                for (Entry<ObjEntity, List<ObjRelationship>> entry : objRelationshipMap.entrySet()) {
                     ObjEntity objEntity = entry.getKey();
                     for (ObjRelationship rel : entry.getValue()) {
                         relationshipAction.createObjRelationship(objEntity, rel);
                     }
                 }
-
-                CreateObjEntityAction action = actionManager
-                        .getAction(CreateObjEntityAction.class);
+                CreateObjEntityAction action = actionManager.getAction(CreateObjEntityAction.class);
                 action.createObjEntity(map, objEntity);
-
                 break;
             }
             case DB_ENTITY: {
-
-                for (Entry<DbEntity, List<DbRelationship>> entry : dbRelationshipMap
-                        .entrySet()) {
+                for (Entry<DbEntity, List<DbRelationship>> entry : dbRelationshipMap.entrySet()) {
                     DbEntity dbEntity = entry.getKey();
                     for (DbRelationship rel : entry.getValue()) {
                         relationshipAction.createDbRelationship(dbEntity, rel);
                     }
                 }
-
-                CreateDbEntityAction action = actionManager
-                        .getAction(CreateDbEntityAction.class);
-
+                CreateDbEntityAction action = actionManager.getAction(CreateDbEntityAction.class);
                 action.createEntity(map, dbEntity);
-
                 break;
             }
             case QUERY: {
-
                 this.domain = (DataChannelDescriptor) Application
                         .getInstance()
                         .getFrameController()
                         .getProjectController()
                         .getProject()
                         .getRootNode();
-
-                CreateQueryAction action = actionManager
-                        .getAction(CreateQueryAction.class);
-
+                CreateQueryAction action = actionManager.getAction(CreateQueryAction.class);
                 action.createQuery(domain, map, query);
-
                 break;
             }
             case PROCEDURE: {
-                CreateProcedureAction action = actionManager
-                        .getAction(CreateProcedureAction.class);
+                CreateProcedureAction action = actionManager.getAction(CreateProcedureAction.class);
                 action.createProcedure(map, procedure);
                 break;
             }
             case MAP_FROM_NODE: {
                 this.dataNode.getDataMapNames().add(map.getName());
-
+                ProjectController controller = Application.getInstance().getFrameController().getProjectController();
                 DataNodeEvent e = new DataNodeEvent(Application.getFrame(), this.dataNode);
-
-                ProjectController controller = Application
-                        .getInstance()
-                        .getFrameController()
-                        .getProjectController();
-
-                e
-                        .setDomain((DataChannelDescriptor) controller
-                                .getProject()
-                                .getRootNode());
-
+                e.setDomain((DataChannelDescriptor) controller.getProject().getRootNode());
                 controller.fireDataNodeEvent(e);
-
                 break;
             }
             case MAP_FROM_DOMAIN: {
-                CreateDataMapAction action = actionManager
-                        .getAction(CreateDataMapAction.class);
+                CreateDataMapAction action = actionManager.getAction(CreateDataMapAction.class);
                 action.createDataMap(map);
-
                 break;
             }
             case NODE: {
                 CreateNodeAction action = actionManager.getAction(CreateNodeAction.class);
                 action.createDataNode(dataNode);
-
                 break;
             }
-
             case EMBEDDABLE: {
-                CreateEmbeddableAction action = actionManager
-                        .getAction(CreateEmbeddableAction.class);
+                CreateEmbeddableAction action = actionManager.getAction(CreateEmbeddableAction.class);
                 action.createEmbeddable(map, embeddable);
-
                 break;
             }
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java
index 3098fecba..deca27abf 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneAction.java
@@ -321,7 +321,7 @@ public abstract class CayenneAction extends AbstractAction {
      * @param entity to build path for
      * @return tree path
      */
-    protected static TreePath buildTreePath(Entity entity) {
+    protected static TreePath buildTreePath(Entity<?,?,?> entity) {
         DataChannelDescriptor domain = (DataChannelDescriptor) Application
                 .getInstance()
                 .getProject()
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
index cb984daae..f5960b76a 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CayenneTableModel.java
@@ -43,13 +43,12 @@ import org.slf4j.LoggerFactory;
  * Superclass of CayenneModeler table model classes.
  */
 public abstract class CayenneTableModel<T> extends AbstractTableModel {
+    private static final Logger logObj = LoggerFactory.getLogger(CayenneTableModel.class);
 
     protected ProjectController mediator;
     protected Object eventSource;
     protected List<T> objectList;
 
-    private static Logger logObj = LoggerFactory.getLogger(CayenneTableModel.class);
-
     /**
      * Constructor for CayenneTableModel.
      */
@@ -188,11 +187,11 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
 		return true;
 	}
 
-    protected class PropertyComparator<C> implements Comparator<C> {
+    protected static class PropertyComparator<C> implements Comparator<C> {
 
         Method getter;
 
-        PropertyComparator(String propertyName, Class beanClass) {
+        PropertyComparator(String propertyName, Class<?> beanClass) {
             try {
                 getter = findGetter(beanClass, propertyName);
             } catch (IntrospectionException e) {
@@ -200,7 +199,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
             }
         }
 
-        Method findGetter(Class beanClass, String propertyName) throws IntrospectionException {
+        Method findGetter(Class<?> beanClass, String propertyName) throws IntrospectionException {
             BeanInfo info = Introspector.getBeanInfo(beanClass);
             PropertyDescriptor[] descriptors = info.getPropertyDescriptors();
 
@@ -216,7 +215,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
         @SuppressWarnings("unchecked")
         public int compare(C o1, C o2) {
 
-            if ((o1 == null && o2 == null) || o1 == o2) {
+            if (o1 == o2) {
                 return 0;
             } else if (o1 == null) {
                 return -1;
@@ -239,7 +238,7 @@ public abstract class CayenneTableModel<T> extends AbstractTableModel {
     public abstract boolean isColumnSortable(int sortCol);
     
     public void sortByElementProperty(String string, boolean isAscent) {
-        Collections.sort(objectList, new PropertyComparator<>(string, getElementsClass()));
+        objectList.sort(new PropertyComparator<>(string, getElementsClass()));
         if(!isAscent){
             Collections.reverse(objectList);
         }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CellRenderers.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CellRenderers.java
index fff3d219e..7c37e9b71 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CellRenderers.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/CellRenderers.java
@@ -69,7 +69,6 @@ public final class CellRenderers {
     protected static Icon embeddableIcon   = ModelerUtil.buildIcon("icon-embeddable.png");
     protected static Icon relationshipIcon = ModelerUtil.buildIcon("icon-relationship.png");
     protected static Icon attributeIcon    = ModelerUtil.buildIcon("icon-attribute.png");
-
     protected static Font defaultFont      = UIManager.getFont("Label.font");
 
     public static Icon iconForObject(Object object) {
@@ -160,7 +159,7 @@ public final class CellRenderers {
             String label = mapObject.getName();
 
             if (mapObject instanceof Entity) {
-                Entity entity = (Entity) mapObject;
+                Entity<?,?,?> entity = (Entity<?,?,?>) mapObject;
 
                 // for different namespace display its name
                 DataMap dataMap = entity.getDataMap();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
index 278a8aa4a..a2ec259e1 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbAttributePathComboBoxEditor.java
@@ -22,7 +22,6 @@ package org.apache.cayenne.modeler.util;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.modeler.editor.ObjAttributeTableModel;
@@ -40,7 +39,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.regex.Pattern;
 
-public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor {
+public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor<ObjAttributeTableModel> {
 
     private static final int DB_ATTRIBUTE_PATH_COLUMN = ObjAttributeTableModel.DB_ATTRIBUTE;
 
@@ -68,21 +67,21 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
     }
 
     @Override
-    protected void initializeCombo(CayenneTableModel model, int row, final JTable table) {
+    protected void initializeCombo(ObjAttributeTableModel model, int row, final JTable table) {
         super.initializeCombo(model, row, table);
-        comboBoxPathChooser.setSelectedItem(((ObjAttributeTableModel) model).getAttribute(row).getValue().getDbAttributePath());
+        comboBoxPathChooser.setSelectedItem(model.getAttribute(row).getValue().getDbAttributePath());
         savePath = this.model.getAttribute(row).getValue().getDbAttributePath();
     }
 
 
     @Override
-    protected Object getCurrentNodeToInitializeCombo(CayenneTableModel model, int row) {
+    protected Object getCurrentNodeToInitializeCombo(ObjAttributeTableModel model, int row) {
         return getCurrentNode(getPathToInitializeCombo(model, row));
     }
 
     @Override
-    protected String getPathToInitializeCombo(CayenneTableModel model, int row) {
-        String pathString = ((ObjAttributeTableModel) model).getAttribute(row).getValue().getDbAttributePath();
+    protected String getPathToInitializeCombo(ObjAttributeTableModel model, int row) {
+        String pathString = model.getAttribute(row).getValue().getDbAttributePath();
         if (pathString == null) {
             return "";
         }
@@ -121,7 +120,7 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
                         getEditor().getEditorComponent()).setText(dbAttributePath);
             }
             List<String> currentNodeChildren = new ArrayList<>(getChildren(getCurrentNode(dbAttributePath), dbAttributePath));
-            comboBoxPathChooser.setModel(new DefaultComboBoxModel(currentNodeChildren.toArray()));
+            comboBoxPathChooser.setModel(new DefaultComboBoxModel<>(currentNodeChildren.toArray(new String[0])));
             comboBoxPathChooser.setSelectedItem(dbAttributePath);
             comboBoxPathChooser.showPopup();
             comboBoxPathChooser.setPopupVisible(true);
@@ -131,7 +130,7 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
     @Override
     protected EntityTreeModel createTreeModelForComboBox(int attributeIndexInTable) {
         ObjAttribute attribute = model.getAttribute(attributeIndexInTable).getValue();
-        Entity firstEntity = null;
+        DbEntity firstEntity = null;
         if (attribute.getDbAttribute() == null) {
 
             if (attribute.getParent() instanceof ObjEntity) {
@@ -162,9 +161,9 @@ public class DbAttributePathComboBoxEditor extends PathChooserComboBoxCellEditor
         return null;
     }
 
-    private Entity getFirstEntity(ObjAttribute attribute) {
+    private DbEntity getFirstEntity(ObjAttribute attribute) {
         Iterator<CayenneMapEntry> it = attribute.getDbPathIterator();
-        Entity firstEnt = attribute.getDbAttribute().getEntity();
+        DbEntity firstEnt = attribute.getDbAttribute().getEntity();
         boolean setEnt = false;
 
         while (it.hasNext()) {
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
index 7b4618d0b..99f77cae0 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/DbRelationshipPathComboBoxEditor.java
@@ -35,7 +35,7 @@ import java.awt.event.FocusListener;
 import java.util.Collection;
 import java.util.regex.Pattern;
 
-public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEditor implements  FocusListener {
+public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEditor<ObjRelationshipTableModel> implements  FocusListener {
 
     private static final int REL_TARGET_PATH_COLUMN = 2;
     private static int enterPressedCount = 0;
@@ -66,9 +66,9 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
     }
 
     @Override
-    protected void initializeCombo(CayenneTableModel model, int row, final JTable table) {
+    protected void initializeCombo(ObjRelationshipTableModel model, int row, final JTable table) {
         super.initializeCombo(model, row, table);
-        comboBoxPathChooser.setSelectedItem(((ObjRelationshipTableModel) model).getRelationship(row).getDbRelationshipPath());
+        comboBoxPathChooser.setSelectedItem(model.getRelationship(row).getDbRelationshipPath());
 
         enterPressedCount = 0;
         comboBoxPathChooser.setToolTipText("To choose relationship press enter two times.To choose next relationship press dot.");
@@ -143,13 +143,13 @@ public class DbRelationshipPathComboBoxEditor extends PathChooserComboBoxCellEdi
     }
 
     @Override
-    protected Object getCurrentNodeToInitializeCombo(CayenneTableModel model, int row) {
+    protected Object getCurrentNodeToInitializeCombo(ObjRelationshipTableModel model, int row) {
         return getCurrentNode(getPathToInitializeCombo(model, row));
     }
 
     @Override
-    protected String getPathToInitializeCombo(CayenneTableModel model, int row) {
-        String pathString = ((ObjRelationshipTableModel) model).getRelationship(row).getDbRelationshipPath();
+    protected String getPathToInitializeCombo(ObjRelationshipTableModel model, int row) {
+        String pathString = model.getRelationship(row).getDbRelationshipPath();
         if (pathString == null) {
             return "";
         }
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/util/EntityTreeAttributeRelationshipFilter.java
index e11b49e44..315f2f280 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/util/EntityTreeAttributeRelationshipFilter.java
@@ -25,19 +25,16 @@ import org.apache.cayenne.map.Relationship;
 
 public class EntityTreeAttributeRelationshipFilter implements EntityTreeFilter {
 
-    public boolean attributeMatch(Object node, Attribute attr) {
-        if (!(node instanceof Attribute)) {
-            return true;
-        }
-        return false;
+    public boolean attributeMatch(Object node, Attribute<?,?,?> attr) {
+        return !(node instanceof Attribute);
     }
 
-    public boolean relationshipMatch(Object node, Relationship rel) {
+    public boolean relationshipMatch(Object node, Relationship<?,?,?> rel) {
         if (!(node instanceof Relationship)) {
             return true;
         }
 
-        /**
+        /*
          * We do not allow A->B->A chains, where relationships
          * are to-one
          */
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/util/EntityTreeFilter.java
index 1371f5316..6f25b1ef7 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/util/EntityTreeFilter.java
@@ -29,10 +29,10 @@ public interface EntityTreeFilter {
     /**
      * Checks if attribute should appear in the tree 
      */
-    boolean attributeMatch(Object node, Attribute attr);
+    boolean attributeMatch(Object node, Attribute<?,?,?> attr);
     
     /**
      * Checks if relationship should appear in the tree 
      */
-    boolean relationshipMatch(Object node, Relationship rel);
+    boolean relationshipMatch(Object node, Relationship<?,?,?> rel);
 }
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/util/EntityTreeRelationshipFilter.java
index 1d5e5f240..988fcc44e 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/util/EntityTreeRelationshipFilter.java
@@ -25,17 +25,17 @@ import org.apache.cayenne.map.Relationship;
 
 public class EntityTreeRelationshipFilter implements EntityTreeFilter {
 
-    public boolean attributeMatch(Object node, Attribute attr) {
+    public boolean attributeMatch(Object node, Attribute<?,?,?> attr) {
         // attrs not allowed here
         return false;
     }
 
-    public boolean relationshipMatch(Object node, Relationship rel) {
+    public boolean relationshipMatch(Object node, Relationship<?,?,?> rel) {
         if (!(node instanceof Relationship)) {
             return true;
         }
 
-        /**
+        /*
          * We do not allow A->B->A chains, where relationships are
          * to-one
          */
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
index 4f05f6162..3c9faef55 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/PathChooserComboBoxCellEditor.java
@@ -54,8 +54,7 @@ import java.util.regex.Pattern;
  * This class used as cell editor, when you need to
  * choose path in comboBox and use autocompletion.
  */
-@SuppressWarnings("WeakerAccess")
-public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor implements TableCellEditor, ActionListener, PopupMenuListener {
+public abstract class PathChooserComboBoxCellEditor<T extends CayenneTableModel<?>> extends AbstractCellEditor implements TableCellEditor, ActionListener, PopupMenuListener {
 
     protected JComboBox<String> comboBoxPathChooser;
     protected int previousEmbeddedLevel = 0;
@@ -67,11 +66,11 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
 
     protected abstract EntityTreeModel createTreeModelForComboBox(int indexInTable);
 
-    protected abstract Object getCurrentNodeToInitializeCombo(CayenneTableModel model, int row);
+    protected abstract Object getCurrentNodeToInitializeCombo(T model, int row);
 
-    protected abstract String getPathToInitializeCombo(CayenneTableModel model, int row);
+    protected abstract String getPathToInitializeCombo(T model, int row);
 
-    protected void initializeCombo(CayenneTableModel model, int row, final JTable table) {
+    protected void initializeCombo(T model, int row, final JTable table) {
         Object currentNode = getCurrentNodeToInitializeCombo(model, row);
         String dbAttributePath = getPathToInitializeCombo(model, row);
         List<String> nodeChildren = getChildren(currentNode, dbAttributePath);
@@ -240,7 +239,6 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
 
         private  final ImageIcon rightArrow = ModelerUtil.buildIcon("icon-arrow-closed.png");
 
-        @SuppressWarnings("unchecked")
         @Override
         public Component getListCellRendererComponent(JList<?> list, Object value, int index,
                                                       boolean isSelected, boolean cellHasFocus) {
@@ -251,7 +249,7 @@ public abstract class PathChooserComboBoxCellEditor extends AbstractCellEditor i
 
             Object currentNode = getCurrentNode((String) value);
             if (treeModel.isLeaf(currentNode)) {
-                ListCellRenderer leafRenderer = CellRenderers.listRenderer();
+                ListCellRenderer<Object> leafRenderer = CellRenderers.listRenderer();
                 return leafRenderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
             } else {
                 DefaultListCellRenderer nonLeafTextRenderer = new DefaultListCellRenderer();
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java
index d77441570..d9109b643 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/ProjectUtil.java
@@ -26,7 +26,6 @@ import java.util.List;
 
 import org.apache.cayenne.configuration.DataChannelDescriptor;
 import org.apache.cayenne.configuration.DataNodeDescriptor;
-import org.apache.cayenne.map.Attribute;
 import org.apache.cayenne.map.DataMap;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
@@ -34,7 +33,6 @@ import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
 import org.apache.cayenne.map.Embeddable;
 import org.apache.cayenne.map.EmbeddableAttribute;
-import org.apache.cayenne.map.Entity;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.MappingNamespace;
 import org.apache.cayenne.map.ObjAttribute;
@@ -43,7 +41,6 @@ import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.map.Procedure;
 import org.apache.cayenne.map.ProcedureParameter;
 import org.apache.cayenne.map.QueryDescriptor;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.modeler.ProjectController;
 import org.apache.cayenne.util.Util;
 
@@ -73,7 +70,7 @@ public class ProjectUtil {
         String oldName = map.getName();
 
         // must fully relink renamed map
-        List<DataNodeDescriptor> nodes = new ArrayList<DataNodeDescriptor>();
+        List<DataNodeDescriptor> nodes = new ArrayList<>();
         for (DataNodeDescriptor node : domain.getNodeDescriptors())
             if (node.getDataMapNames().contains(map.getName()))
                 nodes.add(node);
@@ -180,11 +177,11 @@ public class ProjectUtil {
     /**
      * Changes the name of the attribute and all references to this attribute.
      */
-    public static void setAttributeName(Attribute attribute, String newName) {
+    public static void setAttributeName(ObjAttribute attribute, String newName) {
         String oldName = attribute.getName();
 
         attribute.setName(newName);
-        Entity entity = attribute.getEntity();
+        ObjEntity entity = attribute.getEntity();
 
         if (entity != null) {
             entity.removeAttribute(oldName);
@@ -211,8 +208,8 @@ public class ProjectUtil {
     /**
      * Adds or changes the name of the attribute in all places in DataMap.
      */
-    public static void setRelationshipName(Entity entity, Relationship rel, String newName) {
-        Relationship existingRelationship = entity.getRelationship(newName);
+    public static void setRelationshipName(ObjEntity entity, ObjRelationship rel, String newName) {
+        ObjRelationship existingRelationship = entity.getRelationship(newName);
         if (existingRelationship != null && existingRelationship != rel) {
             throw new IllegalArgumentException("An attempt to override relationship '" + rel.getName() + "'");
         }
@@ -269,10 +266,10 @@ public class ProjectUtil {
             // check individual relationships
             for (ObjRelationship rel : entity.getRelationships()) {
 
-                List<DbRelationship> dbRelList = new ArrayList<DbRelationship>(rel
+                List<DbRelationship> dbRelList = new ArrayList<>(rel
                         .getDbRelationships());
                 for (DbRelationship dbRel : dbRelList) {
-                    Entity srcEnt = dbRel.getSourceEntity();
+                    DbEntity srcEnt = dbRel.getSourceEntity();
                     if (srcEnt == null
                             || map.getDbEntity(srcEnt.getName()) != srcEnt
                             || srcEnt.getRelationship(dbRel.getName()) != dbRel) {
@@ -375,18 +372,15 @@ public class ProjectUtil {
     /**
      * Returns a collection of DbRelationships that use this attribute as a source.
      */
-    public static Collection<DbRelationship> getRelationshipsUsingAttributeAsSource(
-            DbAttribute attribute) {
-        Entity parent = attribute.getEntity();
+    public static Collection<DbRelationship> getRelationshipsUsingAttributeAsSource(DbAttribute attribute) {
+        DbEntity parent = attribute.getEntity();
 
         if (parent == null) {
             return Collections.emptyList();
         }
 
-        Collection<DbRelationship> parentRelationships = (Collection<DbRelationship>) parent
-                .getRelationships();
-        Collection<DbRelationship> relationships = new ArrayList<DbRelationship>(
-                parentRelationships.size());
+        Collection<DbRelationship> parentRelationships = parent.getRelationships();
+        Collection<DbRelationship> relationships = new ArrayList<>(parentRelationships.size());
         // Iterator it = parentRelationships.iterator();
         // while (it.hasNext()) {
         // DbRelationship relationship = (DbRelationship) it.next();
@@ -403,7 +397,7 @@ public class ProjectUtil {
      */
     public static Collection<DbRelationship> getRelationshipsUsingAttributeAsTarget(
             DbAttribute attribute) {
-        Entity parent = attribute.getEntity();
+        DbEntity parent = attribute.getEntity();
 
         if (parent == null) {
             return Collections.emptyList();
@@ -414,16 +408,13 @@ public class ProjectUtil {
             return Collections.emptyList();
         }
 
-        Collection<DbRelationship> relationships = new ArrayList<DbRelationship>();
-
-        for (Entity entity : map.getDbEntities()) {
+        Collection<DbRelationship> relationships = new ArrayList<>();
+        for (DbEntity entity : map.getDbEntities()) {
             if (entity == parent) {
                 continue;
             }
 
-            Collection<DbRelationship> entityRelationships = (Collection<DbRelationship>) entity
-                    .getRelationships();
-
+            Collection<DbRelationship> entityRelationships = entity.getRelationships();
             for (DbRelationship relationship : entityRelationships) {
                 if (ProjectUtil.containsTargetAttribute(relationship, attribute)) {
                     relationships.add(relationship);
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java
index dde7bc5b7..841ed213e 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/AttributeDisplayEventType.java
@@ -52,12 +52,12 @@ class AttributeDisplayEventType extends EntityDisplayEventType {
             return;
         }
 
-        Entity entity = getLastEntity(dataMap);
+        Entity<?,?,?> entity = getLastEntity(dataMap);
         if (entity == null) {
             return;
         }
 
-        Attribute[] attributes = getLastEntityAttributes(entity);
+        Attribute<?,?,?>[] attributes = getLastEntityAttributes(entity);
 
         EntityDisplayEvent entityDisplayEvent = new EntityDisplayEvent(this, entity, dataMap, dataNode, dataChannel);
         AttributeDisplayEvent attributeDisplayEvent = new AttributeDisplayEvent(this, attributes, entity, dataMap, dataChannel);
@@ -89,12 +89,12 @@ class AttributeDisplayEventType extends EntityDisplayEventType {
         }
     }
 
-    protected Attribute[] getLastEntityAttributes(Entity entity) {
-        List<Attribute> attributeList = new ArrayList<>();
+    protected Attribute<?,?,?>[] getLastEntityAttributes(Entity<?,?,?> entity) {
+        List<Attribute<?,?,?>> attributeList = new ArrayList<>();
 
         String attrs = (entity instanceof ObjEntity) ? preferences.getObjAttrs() : preferences.getDbAttrs();
         for (String attrName : attrs.split(",")) {
-            Attribute attr = entity.getAttribute(attrName);
+            Attribute<?,?,?> attr = entity.getAttribute(attrName);
             if(attr != null) {
                 attributeList.add(attr);
             }
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java
index 4c892b439..d1c7b9c02 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/EntityDisplayEventType.java
@@ -47,7 +47,7 @@ class EntityDisplayEventType extends DisplayEventType {
             return;
         }
 
-        Entity entity = getLastEntity(dataMap);
+        Entity<?,?,?> entity = getLastEntity(dataMap);
         if (entity == null) {
             return;
         }
@@ -76,7 +76,7 @@ class EntityDisplayEventType extends DisplayEventType {
         }
     }
 
-    Entity getLastEntity(DataMap dataMap) {
+    Entity<?,?,?> getLastEntity(DataMap dataMap) {
         return !preferences.getObjEntity().isEmpty()
                 ? dataMap.getObjEntity(preferences.getObjEntity())
                 : dataMap.getDbEntity(preferences.getDbEntity());
diff --git a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java
index ec43dd6f8..e71d64959 100644
--- a/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java
+++ b/modeler/cayenne-modeler/src/main/java/org/apache/cayenne/modeler/util/state/RelationshipDisplayEventType.java
@@ -52,12 +52,12 @@ class RelationshipDisplayEventType extends EntityDisplayEventType {
             return;
         }
 
-        Entity entity = getLastEntity(dataMap);
+        Entity<?,?,?> entity = getLastEntity(dataMap);
         if (entity == null) {
             return;
         }
 
-        Relationship[] relationships = getLastEntityRelationships(entity);
+        Relationship<?,?,?>[] relationships = getLastEntityRelationships(entity);
 
         EntityDisplayEvent entityDisplayEvent = new EntityDisplayEvent(this, entity, dataMap, dataNode, dataChannel);
         RelationshipDisplayEvent displayEvent = new RelationshipDisplayEvent(this, relationships, entity, dataMap, dataChannel);
@@ -89,12 +89,12 @@ class RelationshipDisplayEventType extends EntityDisplayEventType {
         }
     }
 
-    private Relationship[] getLastEntityRelationships(Entity entity) {
-        List<Relationship> relationshipList = new ArrayList<>();
+    private Relationship<?,?,?>[] getLastEntityRelationships(Entity<?,?,?> entity) {
+        List<Relationship<?,?,?>> relationshipList = new ArrayList<>();
 
         String rels = (entity instanceof ObjEntity) ? preferences.getObjRels() : preferences.getDbRels();
         for (String objRelName : rels.split(",")) {
-            Relationship rel = entity.getRelationship(objRelName);
+            Relationship<?,?,?> rel = entity.getRelationship(objRelName);
             if(rel != null) {
                 relationshipList.add(rel);
             }
diff --git a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/AttributeEventTest.java b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/AttributeEventTest.java
index 46a04a1e4..19603fd8a 100644
--- a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/AttributeEventTest.java
+++ b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/AttributeEventTest.java
@@ -31,9 +31,9 @@ import static org.junit.Assert.assertSame;
 public class AttributeEventTest {
 
     @Test
-	public void testAttribute() throws Exception {
+	public void testAttribute() {
 		Object src = new Object();
-		Attribute a = new DbAttribute();
+		DbAttribute a = new DbAttribute();
 		a.setName("xyz");
 		AttributeEvent e = new AttributeEvent(src, null, null);
 
diff --git a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/EntityEventTest.java b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/EntityEventTest.java
index 7af37d997..f083f565d 100644
--- a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/EntityEventTest.java
+++ b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/EntityEventTest.java
@@ -34,9 +34,9 @@ import static org.junit.Assert.assertTrue;
 public class EntityEventTest {
 
     @Test
-    public void testConstructor1() throws Exception {
+    public void testConstructor1() {
         Object src = new Object();
-        Entity d = new DbEntity("abc");
+        DbEntity d = new DbEntity("abc");
         EntityEvent e = new EntityEvent(src, d);
 
         assertSame(src, e.getSource());
@@ -44,9 +44,9 @@ public class EntityEventTest {
     }
 
     @Test
-    public void testConstructor2() throws Exception {
+    public void testConstructor2() {
         Object src = new Object();
-        Entity d = new DbEntity("abc");
+        DbEntity d = new DbEntity("abc");
         EntityEvent e = new EntityEvent(src, d, "oldname");
 
         assertSame(src, e.getSource());
@@ -55,9 +55,9 @@ public class EntityEventTest {
     }
 
     @Test
-    public void testEntity() throws Exception {
+    public void testEntity() {
         Object src = new Object();
-        Entity d = new DbEntity("abc");
+        DbEntity d = new DbEntity("abc");
         EntityEvent e = new EntityEvent(src, null);
 
         e.setEntity(d);
@@ -65,16 +65,16 @@ public class EntityEventTest {
     }
 
     @Test
-    public void testNameChange1() throws Exception {
-        Entity d = new DbEntity("abc");
+    public void testNameChange1() {
+        DbEntity d = new DbEntity("abc");
         EntityEvent e = new EntityEvent(new Object(), d, "xyz");
         assertEquals(d.getName(), e.getNewName());
         assertTrue(e.isNameChange());
     }
 
     @Test
-	public void testNameChange2() throws Exception {
-		Entity d = new DbEntity("abc");
+	public void testNameChange2() {
+        DbEntity d = new DbEntity("abc");
 		EntityEvent e = new EntityEvent(new Object(), d, "abc");
 		assertEquals(d.getName(), e.getNewName());
 		assertFalse(e.isNameChange());
diff --git a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/RelationshipEventTest.java b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/RelationshipEventTest.java
index 054168346..73f306e07 100644
--- a/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/RelationshipEventTest.java
+++ b/modeler/cayenne-modeler/src/test/java/org/apache/cayenne/modeler/event/RelationshipEventTest.java
@@ -20,7 +20,6 @@
 package org.apache.cayenne.modeler.event;
 
 import org.apache.cayenne.map.DbRelationship;
-import org.apache.cayenne.map.Relationship;
 import org.apache.cayenne.map.event.RelationshipEvent;
 import org.junit.Test;
 
@@ -31,9 +30,9 @@ import static org.junit.Assert.assertSame;
 public class RelationshipEventTest {
 
     @Test
-	public void testRelationship() throws Exception {
+	public void testRelationship() {
 		Object src = new Object();
-		Relationship r = new DbRelationship();
+		DbRelationship r = new DbRelationship();
 		r.setName("xyz");
 		RelationshipEvent e = new RelationshipEvent(src, null, null);
 
diff --git a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java
index f0be24746..661aadb3e 100644
--- a/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java
+++ b/modeler/cayenne-wocompat/src/main/java/org/apache/cayenne/wocompat/EOQuery.java
@@ -36,7 +36,6 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
@@ -48,10 +47,11 @@ import java.util.Map;
  * @since 1.1
  * @since 4.3 this query extends {@link ObjectSelect}
  */
+@SuppressWarnings("unchecked")
 public class EOQuery<T> extends ObjectSelect<T> {
 
 	protected Map<String, ?> plistMap;
-	protected Map bindings;
+	protected Map<String, String> bindings;
 
 	public EOQuery(ObjEntity root, Map<String, ?> plistMap) {
 		super();
@@ -99,11 +99,10 @@ public class EOQuery<T> extends ObjectSelect<T> {
 		}
 
 		// prefetches
-		List prefetches = (List) plistMap.get("prefetchingRelationshipKeyPaths");
+		List<?> prefetches = (List<?>) plistMap.get("prefetchingRelationshipKeyPaths");
 		if (prefetches != null && !prefetches.isEmpty()) {
-			Iterator it = prefetches.iterator();
-			while (it.hasNext()) {
-				prefetch((String) it.next(), PrefetchTreeNode.UNDEFINED_SEMANTICS);
+			for (Object prefetch : prefetches) {
+				prefetch((String) prefetch, PrefetchTreeNode.UNDEFINED_SEMANTICS);
 			}
 		}
 
@@ -115,7 +114,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 		}
 	}
 
-	public Collection getBindingNames() {
+	public Collection<String> getBindingNames() {
 		if (bindings == null) {
 			initBindings();
 		}
@@ -128,7 +127,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 			initBindings();
 		}
 
-		return (String) bindings.get(name);
+		return bindings.get(name);
 	}
 
 	private synchronized void initBindings() {
@@ -136,17 +135,17 @@ public class EOQuery<T> extends ObjectSelect<T> {
 			return;
 		}
 
-		bindings = new HashMap();
+		bindings = new HashMap<>();
 
 		if (!(root instanceof Entity)) {
 			return;
 		}
 
-		Map qualifier = (Map) plistMap.get("qualifier");
-		initBindings(bindings, (Entity) root, qualifier);
+		Map<String, ?> qualifier = (Map<String, ?>) plistMap.get("qualifier");
+		initBindings(bindings, (Entity<?,?,?>) root, qualifier);
 	}
 
-	private void initBindings(Map bindings, Entity entity, Map qualifier) {
+	private void initBindings(Map<String,String> bindings, Entity<?,?,?> entity, Map<String, ?> qualifier) {
 		if (qualifier == null) {
 			return;
 		}
@@ -162,7 +161,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 				return;
 			}
 
-			Map valueMap = (Map) value;
+			Map<String, ?> valueMap = (Map<String, ?>) value;
 			if (!"EOQualifierVariable".equals(valueMap.get("class")) || !valueMap.containsKey("_key")) {
 				return;
 			}
@@ -200,11 +199,10 @@ public class EOQuery<T> extends ObjectSelect<T> {
 			return;
 		}
 
-		List children = (List) qualifier.get("qualifiers");
+		List<Map<String, ?>> children = (List<Map<String, ?>>) qualifier.get("qualifiers");
 		if (children != null) {
-			Iterator it = children.iterator();
-			while (it.hasNext()) {
-				initBindings(bindings, entity, (Map) it.next());
+			for (Map<String, ?> child : children) {
+				initBindings(bindings, entity, child);
 			}
 		}
 	}
@@ -300,7 +298,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 		 * @return boolean indicating whether the qualifier is "aggregate"
 		 *         qualifier
 		 */
-		static boolean isAggregate(Map qualifier) {
+		static boolean isAggregate(Map<String, ?> qualifier) {
 			boolean result = true;
 
 			String theClass = (String) qualifier.get("class");
@@ -324,7 +322,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 		 *            - a Map containing the qualifier settings to examine.
 		 * @return int Expression type
 		 */
-		static int expressionTypeForQualifier(Map qualifierMap) {
+		static int expressionTypeForQualifier(Map<String, ?> qualifierMap) {
 			// get selector
 			String selector = (String) qualifierMap.get("selectorName");
 			return expressionTypeForSelector(selector);
@@ -341,7 +339,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 		 */
 		static int expressionTypeForSelector(String selector) {
 			Integer expType = selectorToExpressionBridge().get(selector);
-			return (expType != null ? expType.intValue() : -1);
+			return (expType != null ? expType : -1);
 		}
 
 		/**
@@ -353,7 +351,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 		 *            - containing the qualifier to examine
 		 * @return int aggregate Expression type
 		 */
-		static int aggregateExpressionClassForQualifier(Map qualifierMap) {
+		static int aggregateExpressionClassForQualifier(Map<String, ?> qualifierMap) {
 			String qualifierClass = (String) qualifierMap.get("class");
 			if (qualifierClass != null) {
 				if (qualifierClass.equalsIgnoreCase("EOAndQualifier")) {
@@ -377,7 +375,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 		 *            - Map representation of EOFetchSpecification
 		 * @return Expression translation of the EOFetchSpecification
 		 */
-		static Expression makeQualifier(EOObjEntity entity, Map qualifierMap) {
+		static Expression makeQualifier(EOObjEntity entity, Map<String, ?> qualifierMap) {
 			if (isAggregate(qualifierMap)) {
 				// the fetch specification has more than one qualifier
 				int aggregateClass = aggregateExpressionClassForQualifier(qualifierMap); // AND,
@@ -387,7 +385,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 				if (aggregateClass == Expression.NOT) {
 					// NOT qualifiers only have one child, keyed with
 					// "qualifier"
-					Map child = (Map) qualifierMap.get("qualifier");
+					Map<String, ?> child = (Map<String, ?>) qualifierMap.get("qualifier");
 					// build the child expression
 					Expression childExp = makeQualifier(entity, child);
 
@@ -398,13 +396,12 @@ public class EOQuery<T> extends ObjectSelect<T> {
 					// AND, OR qualifiers can have multiple children, keyed with
 					// "qualifiers"
 					// get the list of children
-					List children = (List) qualifierMap.get("qualifiers");
+					List<Map<String, ?>> children = (List<Map<String, ?>>) qualifierMap.get("qualifiers");
 					if (children != null) {
 						ArrayList<Expression> childExpressions = new ArrayList<>();
 						// build an Expression for each child
-						Iterator<Map> it = children.iterator();
-						while (it.hasNext()) {
-							Expression childExp = makeQualifier(entity, it.next());
+						for (Map<String, ?> child : children) {
+							Expression childExp = makeQualifier(entity, child);
 							childExpressions.add(childExp);
 						}
 						// join the child expressions and return the result
@@ -429,10 +426,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 				// Comparing two keys or key paths
 				key = (String) qualifierMap.get("leftValue");
 				comparisonValue = qualifierMap.get("rightValue");
-
-				// FIXME: I think EOKeyComparisonQualifier sytle Expressions are
-				// not
-				// supported...
+				// FIXME: I think EOKeyComparisonQualifier style Expressions are not supported...
 				return null;
 			} else if ("EOKeyValueQualifier".equals(qualifierClass)) {
 				// Comparing key with a value or parameterized value
@@ -442,9 +436,7 @@ public class EOQuery<T> extends ObjectSelect<T> {
 				if (value instanceof Map) {
 					Map<String, String> valueMap = (Map<String, String>) value;
 					String objClass = valueMap.get("class"); // can be a
-					// qualifier class
-					// or java type
-
+					// qualifier class or java type
 					if ("EOQualifierVariable".equals(objClass) && valueMap.containsKey("_key")) {
 						// make a parameterized expression
 						String paramName = valueMap.get("_key");