diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs
index 6dbcac5..79e5ce3 100644
--- a/.settings/org.eclipse.jdt.core.prefs
+++ b/.settings/org.eclipse.jdt.core.prefs
@@ -9,6 +9,7 @@
 org.eclipse.jdt.core.compiler.debug.sourceFile=generate
 org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
 org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
 org.eclipse.jdt.core.compiler.source=1.7
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
diff --git a/src/main/java/com/google/gwtorm/jdbc/AccessGen.java b/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
index 3066f73..9cfe6f5 100644
--- a/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
+++ b/src/main/java/com/google/gwtorm/jdbc/AccessGen.java
@@ -302,7 +302,7 @@
     cgs.resetColumnIndex(0);
 
     if (type != DmlType.DELETE) {
-      final List<ColumnModel> cols = new ArrayList<ColumnModel>();
+      final List<ColumnModel> cols = new ArrayList<>();
       cols.addAll(model.getDependentFields());
       cols.addAll(model.getRowVersionFields());
       for (final ColumnModel field : cols) {
@@ -397,7 +397,7 @@
       cgs.resetColumnIndex(oldIdx);
     }
 
-    final List<ColumnModel> cols = new ArrayList<ColumnModel>();
+    final List<ColumnModel> cols = new ArrayList<>();
     cols.addAll(model.getDependentFields());
     cols.addAll(model.getRowVersionFields());
     cols.addAll(model.getPrimaryKeyColumns());
diff --git a/src/main/java/com/google/gwtorm/jdbc/Database.java b/src/main/java/com/google/gwtorm/jdbc/Database.java
index 802bcec..0de0f11 100644
--- a/src/main/java/com/google/gwtorm/jdbc/Database.java
+++ b/src/main/java/com/google/gwtorm/jdbc/Database.java
@@ -84,7 +84,7 @@
     schemaModel = new JavaSchemaModel(schema);
     final GeneratedClassLoader loader = newLoader(schema);
     final Class<T> impl = generate(dialect, loader);
-    implFactory = new SchemaConstructorGen<T>(loader, impl, this).create();
+    implFactory = new SchemaConstructorGen<>(loader, impl, this).create();
     implDialect = dialect;
   }
 
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
index aaddfa3..553dc3e 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcAccess.java
@@ -54,7 +54,7 @@
     if (keys instanceof Collection) {
       keySet = (Collection<K>) keys;
     } else {
-      keySet = new ArrayList<K>();
+      keySet = new ArrayList<>();
       for (final K k : keys) {
         keySet.add(k);
       }
@@ -64,16 +64,16 @@
       case 0:
         // Nothing requested, nothing to return.
         //
-        return new ListResultSet<T>(Collections.<T> emptyList());
+        return new ListResultSet<>(Collections.<T> emptyList());
 
       case 1: {
         // Only one key requested, use a faster equality lookup.
         //
         final T entity = get(keySet.iterator().next());
         if (entity != null) {
-          return new ListResultSet<T>(Collections.singletonList(entity));
+          return new ListResultSet<>(Collections.singletonList(entity));
         }
-        return new ListResultSet<T>(Collections.<T> emptyList());
+        return new ListResultSet<>(Collections.<T> emptyList());
       }
 
       default:
@@ -144,7 +144,7 @@
       if (!rs.next()) {
         rs.close();
         ps.close();
-        return new ListResultSet<T>(Collections.<T> emptyList());
+        return new ListResultSet<>(Collections.<T> emptyList());
       }
     } catch (SQLException err) {
       try {
@@ -154,7 +154,7 @@
       }
       throw convertError("fetch", err);
     }
-    return new JdbcResultSet<T, K>(this, rs, ps);
+    return new JdbcResultSet<>(this, rs, ps);
   }
 
   @Override
@@ -297,7 +297,7 @@
     try {
       PreparedStatement ps = null;
       try {
-        List<T> allInstances = new ArrayList<T>();
+        List<T> allInstances = new ArrayList<>();
         for (final T o : instances) {
           if (ps == null) {
             ps = schema.getConnection().prepareStatement(getUpdateOneSql());
@@ -306,7 +306,7 @@
           int updateCount = ps.executeUpdate();
           if (updateCount != 1) {
             if (inserts == null) {
-              inserts = new ArrayList<T>();
+              inserts = new ArrayList<>();
             }
             inserts.add(o);          }
           allInstances.add(o);
@@ -339,7 +339,7 @@
       PreparedStatement ps = null;
       try {
         int cnt = 0;
-        List<T> allInstances = new ArrayList<T>();
+        List<T> allInstances = new ArrayList<>();
         for (final T o : instances) {
           if (ps == null) {
             ps = schema.getConnection().prepareStatement(getUpdateOneSql());
@@ -359,7 +359,7 @@
             for (T o : allInstances) {
               if (states.length <= i || states[i] != 1) {
                 if (inserts == null) {
-                  inserts = new ArrayList<T>(cnt - i);
+                  inserts = new ArrayList<>(cnt - i);
                 }
                 inserts.add(o);
               }
diff --git a/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java b/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
index 188b833..80dec0b 100644
--- a/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
+++ b/src/main/java/com/google/gwtorm/jdbc/JdbcSchema.java
@@ -194,7 +194,7 @@
       OrmException {
     final SqlDialect dialect = dbDef.getDialect();
     final SchemaModel model = dbDef.getSchemaModel();
-    HashSet<String> want = new HashSet<String>();
+    HashSet<String> want = new HashSet<>();
     for (final SequenceModel s : model.getSequences()) {
       want.add(s.getSequenceName().toLowerCase());
     }
@@ -209,7 +209,7 @@
       OrmException {
     final SqlDialect dialect = dbDef.getDialect();
     final SchemaModel model = dbDef.getSchemaModel();
-    HashSet<String> want = new HashSet<String>();
+    HashSet<String> want = new HashSet<>();
     for (final RelationModel r : model.getRelations()) {
       want.add(r.getRelationName().toLowerCase());
     }
@@ -223,7 +223,7 @@
   private void pruneColumns(final StatementExecutor e, final RelationModel rel)
       throws SQLException, OrmException {
     final SqlDialect dialect = dbDef.getDialect();
-    HashSet<String> want = new HashSet<String>();
+    HashSet<String> want = new HashSet<>();
     for (final ColumnModel c : rel.getColumns()) {
       want.add(c.getColumnName().toLowerCase());
     }
diff --git a/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java b/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
index a80a3a1..2536e50 100644
--- a/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
+++ b/src/main/java/com/google/gwtorm/jdbc/SimpleDataSource.java
@@ -63,7 +63,7 @@
     if (driverName != null) {
       ClassLoader cl = threadCL();
       if (classpath != null && classpath.length() > 0) {
-        final List<URL> urls = new ArrayList<URL>();
+        final List<URL> urls = new ArrayList<>();
         for (final String path : classpath.split(File.pathSeparator)) {
           try {
             urls.add(new URL(path));
diff --git a/src/main/java/com/google/gwtorm/nosql/AccessGen.java b/src/main/java/com/google/gwtorm/nosql/AccessGen.java
index 91fc97b..0a8bbd9 100644
--- a/src/main/java/com/google/gwtorm/nosql/AccessGen.java
+++ b/src/main/java/com/google/gwtorm/nosql/AccessGen.java
@@ -147,7 +147,7 @@
   @SuppressWarnings({"unchecked", "rawtypes"})
   private void initQueryIndexes(final Class<?> clazz) throws OrmException {
     final Collection<QueryModel> queries = model.getQueries();
-    final ArrayList<IndexFunction> indexes = new ArrayList<IndexFunction>();
+    final ArrayList<IndexFunction> indexes = new ArrayList<>();
     for (QueryModel m : queries) {
       if (needsIndexFunction(m)) {
         indexes.add(new IndexFunctionGen(classLoader, m, modelClass).create());
@@ -521,7 +521,7 @@
       case 0: // nil node used to join other nodes together
       case QueryParser.WHERE:
       case QueryParser.AND: {
-        List<Tree> res = new ArrayList<Tree>();
+        List<Tree> res = new ArrayList<>();
         for (int i = 0; i < node.getChildCount(); i++) {
           res.addAll(compareOpsOnly(node.getChild(i)));
         }
diff --git a/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java b/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
index 01186a6..ecded5d 100644
--- a/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
+++ b/src/main/java/com/google/gwtorm/nosql/IndexFunctionGen.java
@@ -60,7 +60,7 @@
     classLoader = loader;
     query = qm;
 
-    myFields = new ArrayList<QueryModel.OrderBy>();
+    myFields = new ArrayList<>();
 
     // Only add each parameter column once, but in the order used.
     // This avoids a range test on the same column from duplicating
@@ -95,7 +95,7 @@
   }
 
   private static List<ColumnModel> leaves(List<ColumnModel> in) {
-    ArrayList<ColumnModel> r = new ArrayList<ColumnModel>(in.size());
+    ArrayList<ColumnModel> r = new ArrayList<>(in.size());
     for (ColumnModel m : in) {
       if (m.isNested()) {
         r.addAll(m.getAllLeafColumns());
@@ -107,7 +107,7 @@
   }
 
   private static List<QueryModel.OrderBy> orderByLeaves(List<QueryModel.OrderBy> in) {
-    ArrayList<QueryModel.OrderBy> r = new ArrayList<QueryModel.OrderBy>(in.size());
+    ArrayList<QueryModel.OrderBy> r = new ArrayList<>(in.size());
     for (QueryModel.OrderBy m : in) {
       if (m.column.isNested()) {
         for (ColumnModel c : m.column.getAllLeafColumns()) {
@@ -198,7 +198,7 @@
     mv.visitTypeInsn(CHECKCAST, pojoType.getInternalName());
     mv.visitVarInsn(ASTORE, 1);
 
-    Set<ColumnModel> checked = new HashSet<ColumnModel>();
+    Set<ColumnModel> checked = new HashSet<>();
     for (QueryModel.OrderBy orderby : myFields) {
       checkNotNullFields(Collections.singleton(orderby.column), checked, mv, cgs);
     }
diff --git a/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java b/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
index 14b3526..927df32 100644
--- a/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/NoSqlDatabase.java
@@ -76,7 +76,7 @@
     schemaModel = new JavaSchemaModel(appSchema);
     final GeneratedClassLoader loader = newLoader(appSchema);
     final Class<T> impl = generate(schemaBaseType, accessBaseType, loader);
-    implFactory = new SchemaConstructorGen<T>(loader, impl, this).create();
+    implFactory = new SchemaConstructorGen<>(loader, impl, this).create();
   }
 
   @Override
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
index cdaa4f5..ecfef33 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericAccess.java
@@ -221,15 +221,15 @@
     b.addRaw(toKey);
     toKey = b.toByteArray();
 
-    final ArrayList<T> res = new ArrayList<T>();
+    final ArrayList<T> res = new ArrayList<>();
     byte[] lastKey = fromKey;
 
     SCAN: for (;;) {
       List<CandidateRow> scanned;
       if (0 < limit) {
-        scanned = new ArrayList<CandidateRow>(limit);
+        scanned = new ArrayList<>(limit);
       } else {
-        scanned = new ArrayList<CandidateRow>();
+        scanned = new ArrayList<>();
       }
 
       boolean needData = false;
@@ -247,9 +247,8 @@
         // object stored within. For these rows we need to fetch the real
         // data row and join it against the index information.
         //
-        HashMap<ByteString, CandidateRow> byKey =
-            new HashMap<ByteString, CandidateRow>();
-        List<byte[]> toFetch = new ArrayList<byte[]>(scanned.size());
+        HashMap<ByteString, CandidateRow> byKey = new HashMap<>();
+        List<byte[]> toFetch = new ArrayList<>(scanned.size());
 
         for (CandidateRow idxRow : scanned) {
           if (!idxRow.hasData()) {
@@ -329,7 +328,7 @@
       lastKey = b.toByteArray();
     }
 
-    return new ListResultSet<T>(res);
+    return new ListResultSet<>(res);
   }
 
   @Override
diff --git a/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java b/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
index 7208d8f..0a4558a 100644
--- a/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/generic/GenericSchema.java
@@ -162,14 +162,14 @@
    * @throws OrmException the data store cannot process the request.
    */
   public ResultSet<Row> fetchRows(Iterable<byte[]> keys) throws OrmException {
-    List<Row> r = new ArrayList<Row>();
+    List<Row> r = new ArrayList<>();
     for (byte[] key : keys) {
       byte[] val = fetchRow(key);
       if (val != null) {
         r.add(new Row(key, val));
       }
     }
-    return new ListResultSet<Row>(r);
+    return new ListResultSet<>(r);
   }
 
   /**
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
index 1e0bb21..fca8470 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapDatabase.java
@@ -66,7 +66,7 @@
     super(schemaBaseType, accessBaseType, appSchema);
 
     lock = new ReentrantLock(true);
-    table = new TreeMap<byte[], byte[]>(HeapKeyComparator.INSTANCE);
+    table = new TreeMap<>(HeapKeyComparator.INSTANCE);
   }
 
   /**
diff --git a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
index 89159ba..ed73f2d 100644
--- a/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
+++ b/src/main/java/com/google/gwtorm/nosql/heap/TreeMapSchema.java
@@ -52,7 +52,7 @@
       boolean order) {
     db.lock.lock();
     try {
-      final List<Row> res = new ArrayList<Row>();
+      final List<Row> res = new ArrayList<>();
       for (Map.Entry<byte[], byte[]> ent : entries(fromKey, toKey)) {
         res.add(new Row(ent.getKey(), ent.getValue()));
 
@@ -60,7 +60,7 @@
           break;
         }
       }
-      return new ListResultSet<Row>(res);
+      return new ListResultSet<>(res);
     } finally {
       db.lock.unlock();
     }
diff --git a/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java b/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
index b65fceb..070ce78 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CodecFactory.java
@@ -48,7 +48,7 @@
       encoder = get(loader, cacheName);
     }
     if (encoder == null) {
-      final CodecGen<T> gen = new CodecGen<T>(loader, type);
+      final CodecGen<T> gen = new CodecGen<>(loader, type);
       try {
         encoder = gen.create();
       } catch (OrmException e) {
diff --git a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
index abf0e97..1eb6fde 100644
--- a/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
+++ b/src/main/java/com/google/gwtorm/protobuf/CodecGen.java
@@ -74,7 +74,7 @@
     classLoader = loader;
     pojo = t;
     pojoType = Type.getType(pojo);
-    nestedCodecs = new HashMap<Class<?>, NestedCodec>();
+    nestedCodecs = new HashMap<>();
   }
 
   public ProtobufCodec<T> create() throws OrmException {
@@ -112,7 +112,7 @@
   }
 
   private static JavaColumnModel[] scanFields(Class<?> in) throws OrmException {
-    final Collection<JavaColumnModel> col = new ArrayList<JavaColumnModel>();
+    final Collection<JavaColumnModel> col = new ArrayList<>();
     while (in != null) {
       for (final Field f : JavaColumnModel.getDeclaredFields(in)) {
         if (f.getAnnotation(Column.class) != null) {
diff --git a/src/main/java/com/google/gwtorm/schema/ColumnModel.java b/src/main/java/com/google/gwtorm/schema/ColumnModel.java
index e799edd..066b363 100644
--- a/src/main/java/com/google/gwtorm/schema/ColumnModel.java
+++ b/src/main/java/com/google/gwtorm/schema/ColumnModel.java
@@ -57,7 +57,7 @@
 
   protected void initNestedColumns(final Collection<? extends ColumnModel> col)
       throws OrmException {
-    nestedColumns = new ArrayList<ColumnModel>(col);
+    nestedColumns = new ArrayList<>(col);
     recomputeColumnNames();
     if (!isNotNull()) {
       // If we permit NULL we need to make sure our contained columns
@@ -68,7 +68,7 @@
       }
     }
 
-    Set<Integer> ids = new HashSet<Integer>();
+    Set<Integer> ids = new HashSet<>();
     for (final ColumnModel c : nestedColumns) {
       if (!ids.add(c.columnId)) {
         throw new OrmException("Duplicate @Column id " + c.columnId + " in "
@@ -108,7 +108,7 @@
   }
 
   public Collection<ColumnModel> getAllLeafColumns() {
-    final ArrayList<ColumnModel> r = new ArrayList<ColumnModel>();
+    final ArrayList<ColumnModel> r = new ArrayList<>();
     for (final ColumnModel c : nestedColumns) {
       if (c.isNested()) {
         r.addAll(c.getAllLeafColumns());
diff --git a/src/main/java/com/google/gwtorm/schema/QueryModel.java b/src/main/java/com/google/gwtorm/schema/QueryModel.java
index db776a7..9fa3485 100644
--- a/src/main/java/com/google/gwtorm/schema/QueryModel.java
+++ b/src/main/java/com/google/gwtorm/schema/QueryModel.java
@@ -68,7 +68,7 @@
   }
 
   public List<ColumnModel> getParameters() {
-    final ArrayList<ColumnModel> r = new ArrayList<ColumnModel>();
+    final ArrayList<ColumnModel> r = new ArrayList<>();
     if (parsedQuery != null) {
       findParameters(r, parsedQuery);
     }
@@ -100,7 +100,7 @@
   }
 
   public List<OrderBy> getOrderBy() {
-    ArrayList<OrderBy> r = new ArrayList<OrderBy>();
+    ArrayList<OrderBy> r = new ArrayList<>();
     if (parsedQuery != null) {
       Tree node = findOrderBy(parsedQuery);
       if (node != null) {
diff --git a/src/main/java/com/google/gwtorm/schema/RelationModel.java b/src/main/java/com/google/gwtorm/schema/RelationModel.java
index aab3132..f5b6c16 100644
--- a/src/main/java/com/google/gwtorm/schema/RelationModel.java
+++ b/src/main/java/com/google/gwtorm/schema/RelationModel.java
@@ -129,7 +129,7 @@
   }
 
   public Collection<ColumnModel> getDependentFields() {
-    final ArrayList<ColumnModel> r = new ArrayList<ColumnModel>();
+    final ArrayList<ColumnModel> r = new ArrayList<>();
     for (final ColumnModel c : fieldsByFieldName.values()) {
       if (!c.rowVersion && (primaryKey == null || primaryKey.getField() != c)) {
         r.add(c);
@@ -139,7 +139,7 @@
   }
 
   public Collection<ColumnModel> getDependentColumns() {
-    final ArrayList<ColumnModel> r = new ArrayList<ColumnModel>();
+    final ArrayList<ColumnModel> r = new ArrayList<>();
     for (final ColumnModel c : columnsByColumnName.values()) {
       if (!c.inPrimaryKey && !c.rowVersion) {
         r.add(c);
@@ -149,7 +149,7 @@
   }
 
   public Collection<ColumnModel> getRowVersionFields() {
-    final ArrayList<ColumnModel> r = new ArrayList<ColumnModel>();
+    final ArrayList<ColumnModel> r = new ArrayList<>();
     for (final ColumnModel c : fieldsByFieldName.values()) {
       if (c.rowVersion) {
         r.add(c);
@@ -159,7 +159,7 @@
   }
 
   public Collection<ColumnModel> getRowVersionColumns() {
-    final ArrayList<ColumnModel> r = new ArrayList<ColumnModel>();
+    final ArrayList<ColumnModel> r = new ArrayList<>();
     for (final ColumnModel c : columnsByColumnName.values()) {
       if (c.rowVersion) {
         r.add(c);
@@ -184,7 +184,7 @@
   }
 
   public Collection<ColumnModel> getColumns() {
-    final ArrayList<ColumnModel> r = new ArrayList<ColumnModel>();
+    final ArrayList<ColumnModel> r = new ArrayList<>();
     r.addAll(getDependentColumns());
     r.addAll(getRowVersionColumns());
     r.addAll(getPrimaryKeyColumns());
@@ -297,7 +297,7 @@
     List<ColumnModel> cols;
     int nth = 1;
 
-    cols = new ArrayList<ColumnModel>();
+    cols = new ArrayList<>();
     cols.addAll(getDependentColumns());
     cols.addAll(getRowVersionColumns());
     for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
@@ -311,7 +311,7 @@
     }
 
     r.append(" WHERE ");
-    cols = new ArrayList<ColumnModel>();
+    cols = new ArrayList<>();
     cols.addAll(getPrimaryKeyColumns());
     cols.addAll(getRowVersionColumns());
     for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
@@ -332,7 +332,7 @@
     r.append(relationName);
     int nth = 1;
     r.append(" WHERE ");
-    final List<ColumnModel> cols = new ArrayList<ColumnModel>();
+    final List<ColumnModel> cols = new ArrayList<>();
     cols.addAll(getPrimaryKeyColumns());
     cols.addAll(getRowVersionColumns());
     for (final Iterator<ColumnModel> i = cols.iterator(); i.hasNext();) {
diff --git a/src/main/java/com/google/gwtorm/schema/SchemaModel.java b/src/main/java/com/google/gwtorm/schema/SchemaModel.java
index ca1b3ff..b8ed338 100644
--- a/src/main/java/com/google/gwtorm/schema/SchemaModel.java
+++ b/src/main/java/com/google/gwtorm/schema/SchemaModel.java
@@ -29,9 +29,9 @@
   protected final Map<String, SequenceModel> sequences;
 
   protected SchemaModel() {
-    allNames = new HashSet<String>();
-    relations = new TreeMap<String, RelationModel>();
-    sequences = new TreeMap<String, SequenceModel>();
+    allNames = new HashSet<>();
+    relations = new TreeMap<>();
+    sequences = new TreeMap<>();
   }
 
   protected void add(final RelationModel r) throws OrmException {
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
index 16d3be8..9e2b30c 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaColumnModel.java
@@ -99,7 +99,7 @@
 
   private void initNested() throws OrmException {
     if (isNested()) {
-      final List<JavaColumnModel> col = new ArrayList<JavaColumnModel>();
+      final List<JavaColumnModel> col = new ArrayList<>();
       Class<?> in = primitiveType;
       while (in != null) {
         for (final Field f : getDeclaredFields(in)) {
diff --git a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
index 8f2020e..4778663 100644
--- a/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
+++ b/src/main/java/com/google/gwtorm/schema/java/JavaRelationModel.java
@@ -62,7 +62,7 @@
   }
 
   private void initColumns() throws OrmException {
-    final List<JavaColumnModel> col = new ArrayList<JavaColumnModel>();
+    final List<JavaColumnModel> col = new ArrayList<>();
     Class<?> in = entityType;
     while (in != null) {
       for (final Field f : JavaColumnModel.getDeclaredFields(in)) {
diff --git a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
index 0bbd524..900ce02 100644
--- a/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
+++ b/src/main/java/com/google/gwtorm/schema/java/ProtoFileGenerator.java
@@ -54,8 +54,8 @@
   ProtoFileGenerator(String schemaName, Collection<RelationModel> relations) {
     this.schemaName = schemaName;
     this.rels = relations;
-    this.seen = new HashSet<String>();
-    this.collisions = new HashSet<String>();
+    this.seen = new HashSet<>();
+    this.collisions = new HashSet<>();
   }
 
   void print(PrintWriter out) {
@@ -181,14 +181,14 @@
   }
 
   private static List<ColumnModel> sortColumns(Collection<ColumnModel> cols) {
-    ArrayList<ColumnModel> list = new ArrayList<ColumnModel>(cols);
+    ArrayList<ColumnModel> list = new ArrayList<>(cols);
     Collections.sort(list, COLUMN_COMPARATOR);
     return list;
   }
 
   private static List<RelationModel> sortRelations(
       Collection<RelationModel> rels) {
-    ArrayList<RelationModel> list = new ArrayList<RelationModel>(rels);
+    ArrayList<RelationModel> list = new ArrayList<>(rels);
     Collections.sort(list, RELATION_COMPARATOR);
     return list;
   }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java b/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
index 3cf7ff9..5111b72 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectH2.java
@@ -60,7 +60,7 @@
               + " FROM INFORMATION_SCHEMA.SEQUENCES"
               + " WHERE SEQUENCE_SCHEMA = 'PUBLIC'");
       try {
-        HashSet<String> sequences = new HashSet<String>();
+        HashSet<String> sequences = new HashSet<>();
         while (rs.next()) {
           sequences.add(rs.getString(1).toLowerCase());
         }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java b/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
index b1cbc07..df3ac31 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectMaxDB.java
@@ -59,7 +59,7 @@
       final ResultSet rs =
           s.executeQuery("SELECT sequence_name FROM sequences");
       try {
-        HashSet<String> sequences = new HashSet<String>();
+        HashSet<String> sequences = new HashSet<>();
         while (rs.next()) {
           sequences.add(rs.getString(1).toLowerCase());
         }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
index aad5037..c4cb7e1 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectMySQL.java
@@ -132,7 +132,7 @@
     final String[] types = new String[] {"TABLE"};
     final ResultSet rs = db.getMetaData().getTables(null, null, null, types);
     try {
-      HashSet<String> tables = new HashSet<String>();
+      HashSet<String> tables = new HashSet<>();
       while (rs.next()) {
         final String name = rs.getString("TABLE_NAME");
         if (!isSequence(db, name)) {
@@ -150,7 +150,7 @@
     final String[] types = new String[] {"TABLE"};
     final ResultSet rs = db.getMetaData().getTables(null, null, null, types);
     try {
-      HashSet<String> sequences = new HashSet<String>();
+      HashSet<String> sequences = new HashSet<>();
       while (rs.next()) {
         final String name = rs.getString("TABLE_NAME");
         if (isSequence(db, name)) {
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java b/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
index d006b16..b96081a 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectOracle.java
@@ -55,7 +55,7 @@
     try {
       ResultSet rs = s.executeQuery("SELECT table_name FROM user_tables");
       try {
-        Set<String> tables = new HashSet<String>();
+        Set<String> tables = new HashSet<>();
         while (rs.next()) {
           tables.add(rs.getString(1).toLowerCase());
         }
@@ -77,7 +77,7 @@
       s.setString(1, tableName.toUpperCase());
       ResultSet rs = s.executeQuery();
       try {
-        Set<String> indexes = new HashSet<String>();
+        Set<String> indexes = new HashSet<>();
         while (rs.next()) {
           indexes.add(rs.getString(1).toLowerCase());
         }
@@ -96,7 +96,7 @@
     try {
       ResultSet rs = s.executeQuery("SELECT sequence_name FROM user_sequences");
       try {
-        Set<String> sequences = new HashSet<String>();
+        Set<String> sequences = new HashSet<>();
         while (rs.next()) {
           sequences.add(rs.getString(1).toLowerCase());
         }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java b/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
index c707af6..fb8a75e 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/DialectPostgreSQL.java
@@ -97,7 +97,7 @@
       ResultSet rs =
           s.executeQuery("SELECT relname FROM pg_class WHERE relkind = 'S'");
       try {
-        HashSet<String> sequences = new HashSet<String>();
+        HashSet<String> sequences = new HashSet<>();
         while (rs.next()) {
           sequences.add(rs.getString(1).toLowerCase());
         }
diff --git a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
index 458d4f9..7e59126 100644
--- a/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
+++ b/src/main/java/com/google/gwtorm/schema/sql/SqlDialect.java
@@ -37,7 +37,7 @@
 
 public abstract class SqlDialect {
   private static final List<SqlDialect> DIALECTS =
-      new CopyOnWriteArrayList<SqlDialect>();
+      new CopyOnWriteArrayList<>();
 
   static {
     DIALECTS.add(new DialectH2());
@@ -66,7 +66,7 @@
   protected final Map<Integer, String> typeNames;
 
   protected SqlDialect() {
-    types = new HashMap<Class<?>, SqlTypeInfo>();
+    types = new HashMap<>();
     types.put(Boolean.TYPE, new SqlBooleanTypeInfo());
     types.put(Short.TYPE, new SqlShortTypeInfo());
     types.put(Integer.TYPE, new SqlIntTypeInfo());
@@ -77,7 +77,7 @@
     types.put(java.sql.Timestamp.class, new SqlTimestampTypeInfo());
     types.put(byte[].class, new SqlByteArrayTypeInfo());
 
-    typeNames = new HashMap<Integer, String>();
+    typeNames = new HashMap<>();
     typeNames.put(Types.VARBINARY, "BLOB");
     typeNames.put(Types.DATE, "DATE");
     typeNames.put(Types.SMALLINT, "SMALLINT");
@@ -225,7 +225,7 @@
     final String[] types = new String[] {"TABLE"};
     final ResultSet rs = db.getMetaData().getTables(null, null, null, types);
     try {
-      Set<String> tables = new HashSet<String>();
+      Set<String> tables = new HashSet<>();
       while (rs.next()) {
         tables.add(rs.getString("TABLE_NAME").toLowerCase());
       }
@@ -273,7 +273,7 @@
 
     ResultSet rs = meta.getIndexInfo(null, null, tableName, false, true);
     try {
-      Set<String> indexes = new HashSet<String>();
+      Set<String> indexes = new HashSet<>();
       while (rs.next()) {
         indexes.add(rs.getString("INDEX_NAME").toLowerCase());
       }
@@ -312,7 +312,7 @@
 
     ResultSet rs = meta.getColumns(null, null, tableName, null);
     try {
-      HashSet<String> columns = new HashSet<String>();
+      HashSet<String> columns = new HashSet<>();
       while (rs.next()) {
         columns.add(rs.getString("COLUMN_NAME").toLowerCase());
       }
diff --git a/src/main/java/com/google/gwtorm/server/AbstractAccess.java b/src/main/java/com/google/gwtorm/server/AbstractAccess.java
index f598630..a814ec8 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractAccess.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractAccess.java
@@ -43,20 +43,20 @@
 
   @Override
   public ResultSet<E> get(final Iterable<K> keys) throws OrmException {
-    final ArrayList<E> r = new ArrayList<E>();
+    final ArrayList<E> r = new ArrayList<>();
     for (final K key : keys) {
       final E o = get(key);
       if (o != null) {
         r.add(o);
       }
     }
-    return new ListResultSet<E>(r);
+    return new ListResultSet<>(r);
   }
 
   @Override
   public Map<K, E> toMap(final Iterable<E> c) {
     try {
-      final HashMap<K, E> r = new HashMap<K, E>();
+      final HashMap<K, E> r = new HashMap<>();
       for (final E e : c) {
         r.put(primaryKey(e), e);
       }
diff --git a/src/main/java/com/google/gwtorm/server/AbstractResultSet.java b/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
index 5eb2803..f3cf5ce 100644
--- a/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/AbstractResultSet.java
@@ -47,7 +47,7 @@
 
   @Override
   public List<T> toList() {
-    List<T> r = new ArrayList<T>();
+    List<T> r = new ArrayList<>();
     for (T obj : this) {
       r.add(obj);
     }
diff --git a/src/main/java/com/google/gwtorm/server/CodeGenSupport.java b/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
index 71756ee..df75300 100644
--- a/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
+++ b/src/main/java/com/google/gwtorm/server/CodeGenSupport.java
@@ -34,7 +34,7 @@
   private Type entityType;
 
   private int lastLocal = 2;
-  private List<Integer> freeLocals = new ArrayList<Integer>(4);
+  private List<Integer> freeLocals = new ArrayList<>(4);
 
   public CodeGenSupport(final MethodVisitor method) {
     mv = method;
diff --git a/src/main/java/com/google/gwtorm/server/ListResultSet.java b/src/main/java/com/google/gwtorm/server/ListResultSet.java
index 642dd0c..019d976 100644
--- a/src/main/java/com/google/gwtorm/server/ListResultSet.java
+++ b/src/main/java/com/google/gwtorm/server/ListResultSet.java
@@ -36,7 +36,7 @@
     if (items == null) {
       throw new IllegalStateException("Results already obtained");
     }
-    final List<T> r = new ArrayList<T>(items);
+    final List<T> r = new ArrayList<>(items);
     items = null;
     return r;
   }
diff --git a/src/main/java/com/google/gwtorm/server/SchemaGen.java b/src/main/java/com/google/gwtorm/server/SchemaGen.java
index ed17d15..b0a44de 100644
--- a/src/main/java/com/google/gwtorm/server/SchemaGen.java
+++ b/src/main/java/com/google/gwtorm/server/SchemaGen.java
@@ -94,7 +94,7 @@
   }
 
   private void defineRelationClasses() throws OrmException {
-    relations = new ArrayList<RelationGen>();
+    relations = new ArrayList<>();
     for (final RelationModel rel : schema.getRelations()) {
       final Class<?> a = accessGen.create(classLoader, rel);
       relations.add(new RelationGen(rel, a));
diff --git a/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java b/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
index 3fad032..808d66b 100644
--- a/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
+++ b/src/test/java/com/google/gwtorm/jdbc/AbstractTestJdbcAccess.java
@@ -86,7 +86,7 @@
         @Override
         Iterable<Data> createIterable(Data... data) {
           List<Data> list = Arrays.asList(data);
-          return new ListResultSet<Data>(list);
+          return new ListResultSet<>(list);
         }
       };
 
diff --git a/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java b/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
index 71672e5..a89627c 100644
--- a/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
+++ b/src/test/java/com/google/gwtorm/nosql/NoSqlPhoneBookTest.java
@@ -43,8 +43,8 @@
 
   @Before
   public void setUp() throws Exception {
-    db = new MemoryDatabase<PhoneBookDb>(PhoneBookDb.class);
-    openSchemas = new ArrayList<PhoneBookDb>();
+    db = new MemoryDatabase<>(PhoneBookDb.class);
+    openSchemas = new ArrayList<>();
   }
 
   @After
@@ -180,7 +180,7 @@
   @Test
   public void testInsertManyPeople() throws Exception {
     final PhoneBookDb schema = open();
-    final ArrayList<Person> all = new ArrayList<Person>();
+    final ArrayList<Person> all = new ArrayList<>();
     all.add(new Person(new Person.Key("Bob"), 18));
     all.add(new Person(new Person.Key("Mary"), 22));
     all.add(new Person(new Person.Key("Zak"), 33));
@@ -249,7 +249,7 @@
   @Test
   public void testFetchByAge() throws Exception {
     final PhoneBookDb schema = open();
-    final ArrayList<Person> all = new ArrayList<Person>();
+    final ArrayList<Person> all = new ArrayList<>();
     all.add(new Person(new Person.Key("Bob"), 18));
     all.add(new Person(new Person.Key("Mary"), 22));
     all.add(new Person(new Person.Key("Zak"), 33));
diff --git a/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java b/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
index 8b00dfd..bca38ee 100644
--- a/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
+++ b/src/test/java/com/google/gwtorm/protobuf/ProtobufEncoderTest.java
@@ -153,7 +153,7 @@
     ProtobufCodec<StringList> e = CodecFactory.encoder(StringList.class);
 
     StringList list = new StringList();
-    list.list = new ArrayList<String>();
+    list.list = new ArrayList<>();
     list.list.add("moe");
     list.list.add("larry");
 
@@ -173,7 +173,7 @@
     ProtobufCodec<StringSet> e = CodecFactory.encoder(StringSet.class);
 
     StringSet list = new StringSet();
-    list.list = new TreeSet<String>();
+    list.list = new TreeSet<>();
     list.list.add("larry");
     list.list.add("moe");
 
@@ -193,7 +193,7 @@
     ProtobufCodec<PersonList> e = CodecFactory.encoder(PersonList.class);
 
     PersonList list = new PersonList();
-    list.people = new ArrayList<Person>();
+    list.people = new ArrayList<>();
     list.people.add(new Person(new Person.Key("larry"), 1 << 16));
     list.people.add(new Person(new Person.Key("curly"), 1));
     list.people.add(new Person(new Person.Key("moe"), -1));
@@ -208,7 +208,7 @@
     ProtobufCodec<ItemList> e = CodecFactory.encoder(ItemList.class);
 
     ItemList list = new ItemList();
-    list.list = new ArrayList<Item>();
+    list.list = new ArrayList<>();
     list.list.add(new Item());
     list.list.add(new Item());
 
diff --git a/src/test/java/com/google/gwtorm/schema/QueryParserTest.java b/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
index ada20c9..ad90e0a 100644
--- a/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
+++ b/src/test/java/com/google/gwtorm/schema/QueryParserTest.java
@@ -67,7 +67,7 @@
   protected Tree parse(final String str) throws QueryParseException {
     final RelationModel dummy = new RelationModel() {
       {
-        final Collection<ColumnModel> c = new ArrayList<ColumnModel>();
+        final Collection<ColumnModel> c = new ArrayList<>();
         try {
           c.add(new DummyColumn(1, "name"));
           c.add(new DummyColumn(2, "a"));
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
index 9991b6f..8e86e1f 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectH2Test.java
@@ -50,9 +50,9 @@
     p.setProperty("driver", org.h2.Driver.class.getName());
     p.setProperty("url", db.getMetaData().getURL());
     phoneBook =
-        new Database<PhoneBookDb>(new SimpleDataSource(p), PhoneBookDb.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
     phoneBook2 =
-        new Database<PhoneBookDb2>(new SimpleDataSource(p), PhoneBookDb2.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
index c193719..7b21d10 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMaxDBTest.java
@@ -70,9 +70,9 @@
     p.setProperty("user", user);
     p.setProperty("password", pass);
     phoneBook =
-        new Database<PhoneBookDb>(new SimpleDataSource(p), PhoneBookDb.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
     phoneBook2 =
-        new Database<PhoneBookDb2>(new SimpleDataSource(p), PhoneBookDb2.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   private void drop(String drop) {
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
index 3b31595..46f1ec4 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectMySQLTest.java
@@ -65,9 +65,9 @@
     p.setProperty("user", user);
     p.setProperty("password", pass);
     phoneBook =
-        new Database<PhoneBookDb>(new SimpleDataSource(p), PhoneBookDb.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
     phoneBook2 =
-        new Database<PhoneBookDb2>(new SimpleDataSource(p), PhoneBookDb2.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
index 5e39c9b..431503d 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectOracleSQLTest.java
@@ -65,9 +65,9 @@
     p.setProperty("user", user);
     p.setProperty("password", pass);
     phoneBook =
-        new Database<PhoneBookDb>(new SimpleDataSource(p), PhoneBookDb.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
     phoneBook2 =
-        new Database<PhoneBookDb2>(new SimpleDataSource(p), PhoneBookDb2.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
diff --git a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
index ca9326c..fc6b0a9 100644
--- a/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
+++ b/src/test/java/com/google/gwtorm/schema/sql/DialectPostgreSQLTest.java
@@ -63,9 +63,9 @@
     p.setProperty("user", user);
     p.setProperty("password", pass);
     phoneBook =
-        new Database<PhoneBookDb>(new SimpleDataSource(p), PhoneBookDb.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
     phoneBook2 =
-        new Database<PhoneBookDb2>(new SimpleDataSource(p), PhoneBookDb2.class);
+        new Database<>(new SimpleDataSource(p), PhoneBookDb2.class);
   }
 
   @After
diff --git a/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java b/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
index 247a4a4..4f99f61 100644
--- a/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
+++ b/src/test/java/com/google/gwtorm/server/PhoneBookDbTestCase.java
@@ -52,8 +52,8 @@
     final Properties p = new Properties();
     p.setProperty("driver", org.h2.Driver.class.getName());
     p.setProperty("url", "jdbc:h2:mem:PhoneBookDb" + (runCount++));
-    db = new Database<PhoneBookDb>(new SimpleDataSource(p), PhoneBookDb.class);
-    openSchemas = new ArrayList<PhoneBookDb>();
+    db = new Database<>(new SimpleDataSource(p), PhoneBookDb.class);
+    openSchemas = new ArrayList<>();
   }
 
   @After
@@ -220,7 +220,7 @@
   @Test
   public void testInsertManyPeople() throws Exception {
     final PhoneBookDb schema = openAndCreate();
-    final ArrayList<Person> all = new ArrayList<Person>();
+    final ArrayList<Person> all = new ArrayList<>();
     all.add(new Person(new Person.Key("Bob"), 18));
     all.add(new Person(new Person.Key("Mary"), 22));
     all.add(new Person(new Person.Key("Zak"), 33));
@@ -316,7 +316,7 @@
   @Test
   public void testFetchByAge() throws Exception {
     final PhoneBookDb schema = openAndCreate();
-    final ArrayList<Person> all = new ArrayList<Person>();
+    final ArrayList<Person> all = new ArrayList<>();
     all.add(new Person(new Person.Key("Bob"), 18));
     all.add(new Person(new Person.Key("Mary"), 22));
     all.add(new Person(new Person.Key("Zak"), 33));
@@ -331,7 +331,7 @@
   @Test
   public void testFetchNotPerson() throws Exception {
     final PhoneBookDb schema = openAndCreate();
-    final ArrayList<Person> all = new ArrayList<Person>();
+    final ArrayList<Person> all = new ArrayList<>();
     all.add(new Person(new Person.Key("Bob"), 18));
     all.add(new Person(new Person.Key("Mary"), 22));
     all.add(new Person(new Person.Key("Zak"), 33));
