Merge remote-tracking branch 'origin/2.3-gae' into 2.3

# Conflicts:
#	src/main/java/freemarker/core/FreeMarkerTree.java
diff --git a/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java b/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
index 2b47a29..1440284 100644
--- a/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
+++ b/src/main/java/freemarker/cache/ByteArrayTemplateLoader.java
@@ -36,7 +36,7 @@
  */
 public class ByteArrayTemplateLoader implements TemplateLoader {
 
-    private final Map<String, ByteArrayTemplateSource> templates = new HashMap<String, ByteArrayTemplateSource>();
+    private final Map<String, ByteArrayTemplateSource> templates = new HashMap<>();
     
     /**
      * Adds a template to this template loader; see {@link StringTemplateLoader#putTemplate(String, String)} for more.
@@ -63,17 +63,21 @@
         return templates.remove(name) != null;
     }
     
+    @Override
     public void closeTemplateSource(Object templateSource) {
     }
     
+    @Override
     public Object findTemplateSource(String name) {
         return templates.get(name);
     }
     
+    @Override
     public long getLastModified(Object templateSource) {
         return ((ByteArrayTemplateSource) templateSource).lastModified;
     }
     
+    @Override
     public Reader getReader(Object templateSource, String encoding) throws UnsupportedEncodingException {
         return new InputStreamReader(
                 new ByteArrayInputStream(((ByteArrayTemplateSource) templateSource).templateContent),
diff --git a/src/main/java/freemarker/cache/FileTemplateLoader.java b/src/main/java/freemarker/cache/FileTemplateLoader.java
index 2ee7342..7dfa071 100644
--- a/src/main/java/freemarker/cache/FileTemplateLoader.java
+++ b/src/main/java/freemarker/cache/FileTemplateLoader.java
@@ -116,7 +116,8 @@
      */
     public FileTemplateLoader(final File baseDir, final boolean disableCanonicalPathCheck) throws IOException {
         try {
-            Object[] retval = (Object[]) AccessController.doPrivileged(new PrivilegedExceptionAction<Object[]>() {
+            Object[] retval = AccessController.doPrivileged(new PrivilegedExceptionAction<Object[]>() {
+                @Override
                 public Object[] run() throws IOException {
                     if (!baseDir.exists()) {
                         throw new FileNotFoundException(baseDir + " does not exist.");
@@ -150,9 +151,11 @@
         }
     }
     
+    @Override
     public Object findTemplateSource(final String name) throws IOException {
         try {
             return AccessController.doPrivileged(new PrivilegedExceptionAction<File>() {
+                @Override
                 public File run() throws IOException {
                     File source = new File(baseDir, SEP_IS_SLASH ? name : 
                         name.replace('/', File.separatorChar));
@@ -183,17 +186,21 @@
         }
     }
     
+    @Override
     public long getLastModified(final Object templateSource) {
         return (AccessController.doPrivileged(new PrivilegedAction<Long>() {
+            @Override
             public Long run() {
                 return Long.valueOf(((File) templateSource).lastModified());
             }
         })).longValue();
     }
     
+    @Override
     public Reader getReader(final Object templateSource, final String encoding) throws IOException {
         try {
             return AccessController.doPrivileged(new PrivilegedExceptionAction<Reader>() {
+                @Override
                 public Reader run() throws IOException {
                     if (!(templateSource instanceof File)) {
                         throw new IllegalArgumentException(
@@ -258,6 +265,7 @@
         return true;
     }
 
+    @Override
     public void closeTemplateSource(Object templateSource) {
         // Do nothing.
     }
diff --git a/src/main/java/freemarker/cache/MruCacheStorage.java b/src/main/java/freemarker/cache/MruCacheStorage.java
index e0ecc09..84d2072 100644
--- a/src/main/java/freemarker/cache/MruCacheStorage.java
+++ b/src/main/java/freemarker/cache/MruCacheStorage.java
@@ -82,6 +82,7 @@
         this.softSizeLimit = softSizeLimit;
     }
     
+    @Override
     public Object get(Object key) {
         removeClearedReferences();
         MruEntry entry = (MruEntry) map.get(key);
@@ -97,6 +98,7 @@
         return value;
     }
 
+    @Override
     public void put(Object key, Object value) {
         removeClearedReferences();
         MruEntry entry = (MruEntry) map.get(key);
@@ -110,6 +112,7 @@
         
     }
 
+    @Override
     public void remove(Object key) {
         removeClearedReferences();
         removeInternal(key);
@@ -122,6 +125,7 @@
         }
     }
 
+    @Override
     public void clear() {
         strongHead.makeHead();
         softHead.linkAfter(strongHead);
@@ -247,6 +251,7 @@
      * @see #getSoftSize()
      * @since 2.3.21
      */
+    @Override
     public int getSize() {
         return getSoftSize() + getStrongSize();
     }
diff --git a/src/main/java/freemarker/cache/MultiTemplateLoader.java b/src/main/java/freemarker/cache/MultiTemplateLoader.java
index c76846f..63bb91b 100644
--- a/src/main/java/freemarker/cache/MultiTemplateLoader.java
+++ b/src/main/java/freemarker/cache/MultiTemplateLoader.java
@@ -39,7 +39,7 @@
 
     private final TemplateLoader[] templateLoaders;
     private final Map<String, TemplateLoader> lastTemplateLoaderForName
-            = new ConcurrentHashMap<String, TemplateLoader>();
+            = new ConcurrentHashMap<>();
     
     private boolean sticky = true;
 
@@ -55,6 +55,7 @@
         this.templateLoaders = templateLoaders.clone();
     }
 
+    @Override
     public Object findTemplateSource(String name)
             throws IOException {
         TemplateLoader lastTemplateLoader = null;
@@ -93,15 +94,18 @@
         return null;
     }
 
+    @Override
     public long getLastModified(Object templateSource) {
         return ((MultiSource) templateSource).getLastModified();
     }
 
+    @Override
     public Reader getReader(Object templateSource, String encoding)
             throws IOException {
         return ((MultiSource) templateSource).getReader(encoding);
     }
 
+    @Override
     public void closeTemplateSource(Object templateSource)
             throws IOException {
         ((MultiSource) templateSource).close();
@@ -110,6 +114,7 @@
     /**
      * Clears the sickiness memory, also resets the state of all enclosed {@link StatefulTemplateLoader}-s.
      */
+    @Override
     public void resetState() {
         lastTemplateLoaderForName.clear();
         for (TemplateLoader loader : templateLoaders) {
diff --git a/src/main/java/freemarker/cache/NullCacheStorage.java b/src/main/java/freemarker/cache/NullCacheStorage.java
index c9a9cb5..04e39b3 100644
--- a/src/main/java/freemarker/cache/NullCacheStorage.java
+++ b/src/main/java/freemarker/cache/NullCacheStorage.java
@@ -34,22 +34,27 @@
      */
     public static final NullCacheStorage INSTANCE = new NullCacheStorage();
 
+    @Override
     public boolean isConcurrent() {
         return true;
     }
     
+    @Override
     public Object get(Object key) {
         return null;
     }
 
+    @Override
     public void put(Object key, Object value) {
         // do nothing
     }
 
+    @Override
     public void remove(Object key) {
         // do nothing
     }
     
+    @Override
     public void clear() {
         // do nothing
     }
@@ -59,6 +64,7 @@
      * 
      * @since 2.3.21
      */
+    @Override
     public int getSize() {
         return 0;
     }
diff --git a/src/main/java/freemarker/cache/SoftCacheStorage.java b/src/main/java/freemarker/cache/SoftCacheStorage.java
index e28e1f1..72d49ab 100644
--- a/src/main/java/freemarker/cache/SoftCacheStorage.java
+++ b/src/main/java/freemarker/cache/SoftCacheStorage.java
@@ -55,6 +55,7 @@
     /**
      * Returns true if the underlying Map is a {@code ConcurrentMap}.
      */
+    @Override
     public boolean isConcurrent() {
         return concurrent;
     }
@@ -64,22 +65,26 @@
         this.concurrent = map instanceof ConcurrentMap;
     }
     
+    @Override
     public Object get(Object key) {
         processQueue();
         Reference ref = (Reference) map.get(key);
         return ref == null ? null : ref.get();
     }
 
+    @Override
     public void put(Object key, Object value) {
         processQueue();
         map.put(key, new SoftValueReference(key, value, queue));
     }
 
+    @Override
     public void remove(Object key) {
         processQueue();
         map.remove(key);
     }
 
+    @Override
     public void clear() {
         map.clear();
         processQueue();
@@ -90,6 +95,7 @@
      * 
      * @since 2.3.21
      */
+    @Override
     public int getSize() {
         processQueue();
         return map.size();
@@ -105,9 +111,7 @@
             if (concurrent) {
                 try {
                     atomicRemove.invoke(map, new Object[] { key, ref });
-                } catch (IllegalAccessException e) {
-                    throw new UndeclaredThrowableException(e);
-                } catch (InvocationTargetException e) {
+                } catch (IllegalAccessException | InvocationTargetException e) {
                     throw new UndeclaredThrowableException(e);
                 }
             } else if (map.get(key) == ref) {
diff --git a/src/main/java/freemarker/cache/StringTemplateLoader.java b/src/main/java/freemarker/cache/StringTemplateLoader.java
index 972b60d..dd1610a 100644
--- a/src/main/java/freemarker/cache/StringTemplateLoader.java
+++ b/src/main/java/freemarker/cache/StringTemplateLoader.java
@@ -61,7 +61,7 @@
  */
 public class StringTemplateLoader implements TemplateLoader {
     
-    private final Map<String, StringTemplateSource> templates = new HashMap<String, StringTemplateSource>();
+    private final Map<String, StringTemplateSource> templates = new HashMap<>();
     
     /**
      * Puts a template into the loader. A call to this method is identical to 
@@ -117,17 +117,21 @@
         return templates.remove(name) != null;
     }
     
+    @Override
     public void closeTemplateSource(Object templateSource) {
     }
     
+    @Override
     public Object findTemplateSource(String name) {
         return templates.get(name);
     }
     
+    @Override
     public long getLastModified(Object templateSource) {
         return ((StringTemplateSource) templateSource).lastModified;
     }
     
+    @Override
     public Reader getReader(Object templateSource, String encoding) {
         return new StringReader(((StringTemplateSource) templateSource).templateContent);
     }
diff --git a/src/main/java/freemarker/cache/StrongCacheStorage.java b/src/main/java/freemarker/cache/StrongCacheStorage.java
index c423142..4ed8332 100644
--- a/src/main/java/freemarker/cache/StrongCacheStorage.java
+++ b/src/main/java/freemarker/cache/StrongCacheStorage.java
@@ -36,18 +36,22 @@
     /**
      * Always returns {@code true}.
      */
+    @Override
     public boolean isConcurrent() {
         return true;
     }
     
+    @Override
     public Object get(Object key) {
         return map.get(key);
     }
 
+    @Override
     public void put(Object key, Object value) {
         map.put(key, value);
     }
 
+    @Override
     public void remove(Object key) {
         map.remove(key);
     }
@@ -57,10 +61,12 @@
      * 
      * @since 2.3.21
      */
+    @Override
     public int getSize() {
         return map.size();
     }
     
+    @Override
     public void clear() {
         map.clear();
     }
diff --git a/src/main/java/freemarker/cache/TemplateCache.java b/src/main/java/freemarker/cache/TemplateCache.java
index b5485dc..be19aee 100644
--- a/src/main/java/freemarker/cache/TemplateCache.java
+++ b/src/main/java/freemarker/cache/TemplateCache.java
@@ -544,11 +544,8 @@
         {
             if (parseAsFTL) {
                 try {
-                    final Reader reader = templateLoader.getReader(source, initialEncoding);
-                    try {
+                    try (Reader reader = templateLoader.getReader(source, initialEncoding)) {
                         template = new Template(name, sourceName, reader, config, tc, initialEncoding);
-                    } finally {
-                        reader.close();
                     }
                 } catch (Template.WrongEncodingException wee) {
                     String actualEncoding = wee.getTemplateSpecifiedEncoding();
@@ -556,21 +553,18 @@
                         LOG.debug("Initial encoding \"" + initialEncoding + "\" was incorrect, re-reading with \""
                                 + actualEncoding + "\". Template: " + sourceName);
                     }
-                    
-                    final Reader reader = templateLoader.getReader(source, actualEncoding);
-                    try {
+
+                    try (Reader reader = templateLoader.getReader(source, actualEncoding)) {
                         template = new Template(name, sourceName, reader, config, tc, actualEncoding);
-                    } finally {
-                        reader.close();
                     }
                 }
             } else {
                 // Read the contents into a StringWriter, then construct a single-text-block template from it.
                 final StringWriter sw = new StringWriter();
                 final char[] buf = new char[4096];
-                final Reader reader = templateLoader.getReader(source, initialEncoding);
-                try {
-                    fetchChars: while (true) {
+                try (Reader reader = templateLoader.getReader(source, initialEncoding)) {
+                    fetchChars:
+                    while (true) {
                         int charsRead = reader.read(buf);
                         if (charsRead > 0) {
                             sw.write(buf, 0, charsRead);
@@ -578,8 +572,6 @@
                             break fetchChars;
                         }
                     }
-                } finally {
-                    reader.close();
                 }
                 template = Template.getPlainTextTemplate(name, sourceName, sw.toString(), config);
                 template.setEncoding(initialEncoding);
diff --git a/src/main/java/freemarker/cache/URLTemplateLoader.java b/src/main/java/freemarker/cache/URLTemplateLoader.java
index ae8cda5..aae0275 100644
--- a/src/main/java/freemarker/cache/URLTemplateLoader.java
+++ b/src/main/java/freemarker/cache/URLTemplateLoader.java
@@ -38,16 +38,19 @@
     
     private Boolean urlConnectionUsesCaches;
     
+    @Override
     public Object findTemplateSource(String name)
     throws IOException {
         URL url = getURL(name);
         return url == null ? null : new URLTemplateSource(url, getURLConnectionUsesCaches());
     }
     
+    @Override
     public long getLastModified(Object templateSource) {
         return ((URLTemplateSource) templateSource).lastModified();
     }
     
+    @Override
     public Reader getReader(Object templateSource, String encoding)
     throws IOException {
         return new InputStreamReader(
@@ -55,6 +58,7 @@
                 encoding);
     }
     
+    @Override
     public void closeTemplateSource(Object templateSource)
     throws IOException {
         ((URLTemplateSource) templateSource).close();
diff --git a/src/main/java/freemarker/cache/WebappTemplateLoader.java b/src/main/java/freemarker/cache/WebappTemplateLoader.java
index f3376d3..8ff7b6c 100644
--- a/src/main/java/freemarker/cache/WebappTemplateLoader.java
+++ b/src/main/java/freemarker/cache/WebappTemplateLoader.java
@@ -91,6 +91,7 @@
         this.servletContext = servletContext;
     }
 
+    @Override
     public Object findTemplateSource(String name) throws IOException {
         String fullPath = subdirPath + name;
 
@@ -121,6 +122,7 @@
         return url == null ? null : new URLTemplateSource(url, getURLConnectionUsesCaches());
     }
 
+    @Override
     public long getLastModified(Object templateSource) {
         if (templateSource instanceof File) {
             return ((File) templateSource).lastModified();
@@ -129,6 +131,7 @@
         }
     }
 
+    @Override
     public Reader getReader(Object templateSource, String encoding)
             throws IOException {
         if (templateSource instanceof File) {
@@ -142,6 +145,7 @@
         }
     }
 
+    @Override
     public void closeTemplateSource(Object templateSource) throws IOException {
         if (templateSource instanceof File) {
             // Do nothing.
diff --git a/src/main/java/freemarker/core/AddConcatExpression.java b/src/main/java/freemarker/core/AddConcatExpression.java
index b89b472..a4bfb9f 100644
--- a/src/main/java/freemarker/core/AddConcatExpression.java
+++ b/src/main/java/freemarker/core/AddConcatExpression.java
@@ -82,7 +82,7 @@
                 // we return null and do hash addition instead. (We can't simply give hash addition a priority, like
                 // with sequence addition above, as FTL strings are often also FTL hashes.)
                 Object leftOMOrStr = EvalUtil.coerceModelToStringOrMarkup(
-                        leftModel, leftExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, (String) null,
+                        leftModel, leftExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, null,
                         env);
                 if (leftOMOrStr == null) {
                     return _eval_concatenateHashes(leftModel, rightModel);
@@ -90,7 +90,7 @@
 
                 // Same trick with null return as above.
                 Object rightOMOrStr = EvalUtil.coerceModelToStringOrMarkup(
-                        rightModel, rightExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, (String) null,
+                        rightModel, rightExp, /* returnNullOnNonCoercableType = */ hashConcatPossible, null,
                         env);
                 if (rightOMOrStr == null) {
                     return _eval_concatenateHashes(leftModel, rightModel);
@@ -202,11 +202,13 @@
             this.right = right;
         }
 
+        @Override
         public int size()
         throws TemplateModelException {
             return left.size() + right.size();
         }
 
+        @Override
         public TemplateModel get(int i)
         throws TemplateModelException {
             int ls = left.size();
@@ -224,12 +226,14 @@
             this.right = right;
         }
         
+        @Override
         public TemplateModel get(String key)
         throws TemplateModelException {
             TemplateModel model = right.get(key);
             return (model != null) ? model : left.get(key);
         }
 
+        @Override
         public boolean isEmpty()
         throws TemplateModelException {
             return left.isEmpty() && right.isEmpty();
@@ -246,17 +250,20 @@
             super(left, right);
         }
         
+        @Override
         public int size() throws TemplateModelException {
             initKeys();
             return keys.size();
         }
 
+        @Override
         public TemplateCollectionModel keys()
         throws TemplateModelException {
             initKeys();
             return keys;
         }
 
+        @Override
         public TemplateCollectionModel values()
         throws TemplateModelException {
             initValues();
diff --git a/src/main/java/freemarker/core/ArithmeticEngine.java b/src/main/java/freemarker/core/ArithmeticEngine.java
index 31648f9..5492b7a 100644
--- a/src/main/java/freemarker/core/ArithmeticEngine.java
+++ b/src/main/java/freemarker/core/ArithmeticEngine.java
@@ -377,8 +377,8 @@
                     int n = n1 - n2;
                     return
                         ((n ^ n1) < 0 && (n ^ ~n2) < 0) // overflow check
-                        ? (Number) Long.valueOf(((long) n1) - n2)
-                        : (Number) Integer.valueOf(n);
+                        ? Long.valueOf(((long) n1) - n2)
+                        : Integer.valueOf(n);
                 }
                 case LONG: {
                     long n1 = first.longValue();
@@ -386,8 +386,8 @@
                     long n = n1 - n2;
                     return
                         ((n ^ n1) < 0 && (n ^ ~n2) < 0) // overflow check
-                        ? (Number) toBigInteger(first).subtract(toBigInteger(second))
-                        : (Number) Long.valueOf(n);
+                        ? toBigInteger(first).subtract(toBigInteger(second))
+                        : Long.valueOf(n);
                 }
                 case FLOAT: {
                     return Float.valueOf(first.floatValue() - second.floatValue());
@@ -420,8 +420,8 @@
                     int n = n1 * n2;
                     return
                         n1 == 0 || n / n1 == n2 // overflow check
-                        ? (Number) Integer.valueOf(n)
-                        : (Number) Long.valueOf(((long) n1) * n2);
+                        ? Integer.valueOf(n)
+                        : Long.valueOf(((long) n1) * n2);
                 }
                 case LONG: {
                     long n1 = first.longValue();
@@ -429,8 +429,8 @@
                     long n = n1 * n2;
                     return
                         n1 == 0L || n / n1 == n2 // overflow check
-                        ? (Number) Long.valueOf(n)
-                        : (Number) toBigInteger(first).multiply(toBigInteger(second));
+                        ? Long.valueOf(n)
+                        : toBigInteger(first).multiply(toBigInteger(second));
                 }
                 case FLOAT: {
                     return Float.valueOf(first.floatValue() * second.floatValue());
diff --git a/src/main/java/freemarker/core/BodyInstruction.java b/src/main/java/freemarker/core/BodyInstruction.java
index 102ce67..8a88c06 100644
--- a/src/main/java/freemarker/core/BodyInstruction.java
+++ b/src/main/java/freemarker/core/BodyInstruction.java
@@ -146,10 +146,12 @@
             }
         }
         
+        @Override
         public TemplateModel getLocalVariable(String name) throws TemplateModelException {
             return bodyVars == null ? null : bodyVars.get(name);
         }
         
+        @Override
         public Collection getLocalVariableNames() {
             List bodyParameterNames = invokingMacroContext.nestedContentParameterNames;
             return bodyParameterNames == null ? Collections.EMPTY_LIST : bodyParameterNames;
diff --git a/src/main/java/freemarker/core/BoundedRangeModel.java b/src/main/java/freemarker/core/BoundedRangeModel.java
index 84e2f28..5d23319 100644
--- a/src/main/java/freemarker/core/BoundedRangeModel.java
+++ b/src/main/java/freemarker/core/BoundedRangeModel.java
@@ -42,6 +42,7 @@
         this.affectedByStringSlicingBug = inclusiveEnd;
     }
 
+    @Override
     public int size() {
         return size;
     }
diff --git a/src/main/java/freemarker/core/BuiltIn.java b/src/main/java/freemarker/core/BuiltIn.java
index 36e74b7..30be937 100644
--- a/src/main/java/freemarker/core/BuiltIn.java
+++ b/src/main/java/freemarker/core/BuiltIn.java
@@ -82,8 +82,8 @@
     protected Expression target;
     protected String key;
 
-    static final Set<String> CAMEL_CASE_NAMES = new TreeSet<String>();
-    static final Set<String> SNAKE_CASE_NAMES = new TreeSet<String>();
+    static final Set<String> CAMEL_CASE_NAMES = new TreeSet<>();
+    static final Set<String> SNAKE_CASE_NAMES = new TreeSet<>();
     static final int NUMBER_OF_BIS = 289;
     static final HashMap<String, BuiltIn> BUILT_INS_BY_NAME = new HashMap(NUMBER_OF_BIS * 3 / 2 + 1, 1f);
 
diff --git a/src/main/java/freemarker/core/BuiltInsForCallables.java b/src/main/java/freemarker/core/BuiltInsForCallables.java
index 87d6647..e27d2cc 100644
--- a/src/main/java/freemarker/core/BuiltInsForCallables.java
+++ b/src/main/java/freemarker/core/BuiltInsForCallables.java
@@ -44,6 +44,7 @@
 
         protected abstract boolean isOrderLast();
 
+        @Override
         TemplateModel _eval(Environment env) throws TemplateException {
             TemplateModel model = target.eval(env);
             if (model instanceof Macro) {
@@ -69,6 +70,7 @@
                 this.macroOrFunction = macroOrFunction;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args.size(), 1);
                 TemplateModel argTM = (TemplateModel) args.get(0);
@@ -99,6 +101,7 @@
                 this.method = method;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args.size(), 1);
                 TemplateModel argTM = (TemplateModel) args.get(0);
@@ -107,9 +110,10 @@
                     final TemplateSequenceModel withArgs = (TemplateSequenceModel) argTM;
                     if (method instanceof TemplateMethodModelEx) {
                         return new TemplateMethodModelEx() {
+                            @Override
                             public Object exec(List origArgs) throws TemplateModelException {
                                 int withArgsSize = withArgs.size();
-                                List<TemplateModel> newArgs = new ArrayList<TemplateModel>(
+                                List<TemplateModel> newArgs = new ArrayList<>(
                                         withArgsSize + origArgs.size());
 
                                 if (isOrderLast()) {
@@ -127,9 +131,10 @@
                         };
                     } else {
                         return new TemplateMethodModel() {
+                            @Override
                             public Object exec(List origArgs) throws TemplateModelException {
                                 int withArgsSize = withArgs.size();
-                                List<String> newArgs = new ArrayList<String>(
+                                List<String> newArgs = new ArrayList<>(
                                         withArgsSize + origArgs.size());
 
                                 if (isOrderLast()) {
@@ -187,6 +192,7 @@
                 this.directive = directive;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args.size(), 1);
                 TemplateModel argTM = (TemplateModel) args.get(0);
@@ -194,12 +200,13 @@
                 if (argTM instanceof TemplateHashModelEx) {
                     final TemplateHashModelEx withArgs = (TemplateHashModelEx) argTM;
                     return new TemplateDirectiveModel() {
+                        @Override
                         public void execute(Environment env, Map origArgs, TemplateModel[] loopVars,
                                 TemplateDirectiveBody body) throws TemplateException, IOException {
                             int withArgsSize = withArgs.size();
                             // This is unnecessarily big if there are overridden arguments, but we care more about
                             // avoiding rehashing.
-                            Map<String, TemplateModel> newArgs = new LinkedHashMap<String, TemplateModel>(
+                            Map<String, TemplateModel> newArgs = new LinkedHashMap<>(
                                     (withArgsSize + origArgs.size()) * 4 / 3, 1f);
 
                             TemplateHashModelEx2.KeyValuePairIterator withArgsIter =
diff --git a/src/main/java/freemarker/core/BuiltInsForDates.java b/src/main/java/freemarker/core/BuiltInsForDates.java
index 5fc0a22..c4f660b 100644
--- a/src/main/java/freemarker/core/BuiltInsForDates.java
+++ b/src/main/java/freemarker/core/BuiltInsForDates.java
@@ -88,6 +88,7 @@
                 this.env = env;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 
diff --git a/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java b/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
index 9e83d37..ea8b466 100644
--- a/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
+++ b/src/main/java/freemarker/core/BuiltInsForExistenceHandling.java
@@ -71,6 +71,7 @@
                 this.constant = constant;
             }
 
+            @Override
             public Object exec(List args) {
                 return constant;
             }
@@ -82,6 +83,7 @@
          */
         private static final TemplateMethodModelEx FIRST_NON_NULL_METHOD =
             new TemplateMethodModelEx() {
+                @Override
                 public Object exec(List args) throws TemplateModelException {
                     int argCnt = args.size();
                     if (argCnt == 0) throw _MessageUtil.newArgCntError("?default", argCnt, 1, Integer.MAX_VALUE);
diff --git a/src/main/java/freemarker/core/BuiltInsForLoopVariables.java b/src/main/java/freemarker/core/BuiltInsForLoopVariables.java
index 416774a..311a71a 100644
--- a/src/main/java/freemarker/core/BuiltInsForLoopVariables.java
+++ b/src/main/java/freemarker/core/BuiltInsForLoopVariables.java
@@ -140,6 +140,7 @@
                 this.iterCtx = iterCtx;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1, Integer.MAX_VALUE);
                 return args.get(iterCtx.getIndex() % args.size());
diff --git a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java b/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
index cf70c31..a8b1130 100644
--- a/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
+++ b/src/main/java/freemarker/core/BuiltInsForMultipleTypes.java
@@ -125,10 +125,12 @@
             return new SimpleScalar(env.getCNumberFormat().format(num));
         }
 
+        @Override
         public int getMinimumICIVersion() {
             return _TemplateAPI.VERSION_INT_2_3_21;
         }
         
+        @Override
         public Object getPreviousICIChainMember() {
             return prevICIObj;
         }
@@ -153,11 +155,13 @@
                 this.defaultFormat = env.getTemplateDateFormat(dateType, Date.class, target, false);
             }
             
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 0, 1);
                 return args.size() == 0 ? getAsDateModel() : get((String) args.get(0));
             }
             
+            @Override
             public TemplateModel get(String pattern) throws TemplateModelException {
                 TemplateDateFormat format;
                 try {
@@ -188,14 +192,17 @@
                 return cachedValue;
             }
             
+            @Override
             public Date getAsDate() throws TemplateModelException {
                 return getAsDateModel().getAsDate();
             }
     
+            @Override
             public int getDateType() {
                 return dateType;
             }
     
+            @Override
             public boolean isEmpty() {
                 return false;
             }
@@ -577,11 +584,13 @@
                 this.env = env;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 2);
                 return new SimpleScalar((String) args.get(bool.getAsBoolean() ? 0 : 1));
             }
     
+            @Override
             public String getAsString() throws TemplateModelException {
                 // Boolean should have come first... but that change would be non-BC. 
                 if (bool instanceof TemplateScalarModel) {
@@ -618,11 +627,13 @@
                                 dateType, EvalUtil.modelToDate(dateModel, target).getClass(), target, true);
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return formatWith((String) args.get(0));
             }
 
+            @Override
             public TemplateModel get(String key)
             throws TemplateModelException {
                 return formatWith(key);
@@ -638,6 +649,7 @@
                 }
             }
             
+            @Override
             public String getAsString()
             throws TemplateModelException {
                 if (cachedValue == null) {
@@ -662,6 +674,7 @@
                 return cachedValue;
             }
     
+            @Override
             public boolean isEmpty() {
                 return false;
             }
@@ -692,11 +705,13 @@
                 }
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return get((String) args.get(0));
             }
     
+            @Override
             public TemplateModel get(String key) throws TemplateModelException {
                 TemplateNumberFormat format;
                 try {
@@ -721,6 +736,7 @@
                 return new SimpleScalar(result);
             }
             
+            @Override
             public String getAsString() throws TemplateModelException {
                 if (cachedValue == null) {
                     try {
@@ -738,6 +754,7 @@
                 return cachedValue;
             }
     
+            @Override
             public boolean isEmpty() {
                 return false;
             }
diff --git a/src/main/java/freemarker/core/BuiltInsForNodes.java b/src/main/java/freemarker/core/BuiltInsForNodes.java
index acd9fdf..71e76bd 100644
--- a/src/main/java/freemarker/core/BuiltInsForNodes.java
+++ b/src/main/java/freemarker/core/BuiltInsForNodes.java
@@ -127,6 +127,7 @@
             this.env = env;
         }
         
+        @Override
         public Object exec(List names) throws TemplateModelException {
             if (names == null || names.isEmpty()) {
                 return this;
diff --git a/src/main/java/freemarker/core/BuiltInsForNumbers.java b/src/main/java/freemarker/core/BuiltInsForNumbers.java
index a2d9cbb..73ff888 100644
--- a/src/main/java/freemarker/core/BuiltInsForNumbers.java
+++ b/src/main/java/freemarker/core/BuiltInsForNumbers.java
@@ -85,7 +85,7 @@
         @Override
         TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateModelException {
             if (num instanceof Integer) {
-                int n = ((Integer) num).intValue();
+                int n = num.intValue();
                 if (n < 0) {
                     return new SimpleNumber(-n);
                 } else {
@@ -99,35 +99,35 @@
                     return model;
                 }
             } else if (num instanceof Double) {
-                double n = ((Double) num).doubleValue();
+                double n = num.doubleValue();
                 if (n < 0) {
                     return new SimpleNumber(-n);
                 } else {
                     return model;
                 }
             } else if (num instanceof Float) {
-                float n = ((Float) num).floatValue();
+                float n = num.floatValue();
                 if (n < 0) {
                     return new SimpleNumber(-n);
                 } else {
                     return model;
                 }
             } else if (num instanceof Long) {
-                long n = ((Long) num).longValue();
+                long n = num.longValue();
                 if (n < 0) {
                     return new SimpleNumber(-n);
                 } else {
                     return model;
                 }
             } else if (num instanceof Short) {
-                short n = ((Short) num).shortValue();
+                short n = num.shortValue();
                 if (n < 0) {
                     return new SimpleNumber(-n);
                 } else {
                     return model;
                 }
             } else if (num instanceof Byte) {
-                byte n = ((Byte) num).byteValue();
+                byte n = num.byteValue();
                 if (n < 0) {
                     return new SimpleNumber(-n);
                 } else {
@@ -270,7 +270,7 @@
 
     private static final long safeToLong(Number num) throws TemplateModelException {
         if (num instanceof Double) {
-            double d = Math.round(((Double) num).doubleValue());
+            double d = Math.round(num.doubleValue());
             if (d > Long.MAX_VALUE || d < Long.MIN_VALUE) {
                 throw new _TemplateModelException(
                         "Number doesn't fit into a 64 bit signed integer (long): ", Double.valueOf(d));
@@ -278,7 +278,7 @@
                 return (long) d;
             }
         } else if (num instanceof Float) {
-            float f = Math.round(((Float) num).floatValue());
+            float f = Math.round(num.floatValue());
             if (f > Long.MAX_VALUE || f < Long.MIN_VALUE) {
                 throw new _TemplateModelException(
                         "Number doesn't fit into a 64 bit signed integer (long): ", Float.valueOf(f));
diff --git a/src/main/java/freemarker/core/BuiltInsForSequences.java b/src/main/java/freemarker/core/BuiltInsForSequences.java
index fcaeebd..b80f42e 100644
--- a/src/main/java/freemarker/core/BuiltInsForSequences.java
+++ b/src/main/java/freemarker/core/BuiltInsForSequences.java
@@ -64,6 +64,7 @@
                 this.tsm = tsm;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1, 2);
                 int chunkSize = getNumberMethodArg(args, 0).intValue();
@@ -97,6 +98,7 @@
                 numberOfChunks = (wrappedTsm.size() + chunkSize - 1) / chunkSize; 
             }
 
+            @Override
             public TemplateModel get(final int chunkIndex)
                     throws TemplateModelException {
                 if (chunkIndex >= numberOfChunks) {
@@ -107,6 +109,7 @@
                     
                     private final int baseIndex = chunkIndex * chunkSize;
 
+                    @Override
                     public TemplateModel get(int relIndex)
                             throws TemplateModelException {
                         int absIndex = baseIndex + relIndex;
@@ -119,6 +122,7 @@
                         }
                     }
 
+                    @Override
                     public int size() throws TemplateModelException {
                         return fillerItem != null || chunkIndex + 1 < numberOfChunks
                                 ? chunkSize
@@ -128,6 +132,7 @@
                 };
             }
 
+            @Override
             public int size() throws TemplateModelException {
                 return numberOfChunks;
             }
@@ -200,6 +205,7 @@
                 this.coll = coll;
             }
 
+            @Override
             public Object exec(List args)
                     throws TemplateModelException {
                 checkMethodArgCount(args, 1, 3);
@@ -278,10 +284,12 @@
                 this.seq = seq;
             }
 
+            @Override
             public TemplateModel get(int index) throws TemplateModelException {
                 return seq.get(seq.size() - 1 - index);
             }
 
+            @Override
             public int size() throws TemplateModelException {
                 return seq.size();
             }
@@ -313,6 +321,7 @@
                 m_env = env;
             }
 
+            @Override
             public Object exec(List args)
                     throws TemplateModelException {
                 checkMethodArgCount(args, 1);
@@ -338,6 +347,7 @@
                 m_env = env;
             }
 
+            @Override
             public Object exec(List args)
                     throws TemplateModelException {
                 checkMethodArgCount(args, 1);
@@ -406,6 +416,7 @@
                 m_env = env;
             }
 
+            @Override
             public final Object exec(List args)
                     throws TemplateModelException {
                 int argCnt = args.size();
@@ -542,6 +553,7 @@
                 this.seq = seq;
             }
             
+            @Override
             public Object exec(List args)
                     throws TemplateModelException {
                 // Should be:
@@ -590,6 +602,7 @@
         
         private static class BooleanKVPComparator implements Comparator, Serializable {
 
+            @Override
             public int compare(Object arg0, Object arg1) {
                 // JDK 1.2 doesn't have Boolean.compareTo
                 boolean b0 = ((Boolean) ((KVP) arg0).key).booleanValue();
@@ -603,6 +616,7 @@
         }
         private static class DateKVPComparator implements Comparator, Serializable {
 
+            @Override
             public int compare(Object arg0, Object arg1) {
                 return ((Date) ((KVP) arg0).key).compareTo(
                         (Date) ((KVP) arg1).key);
@@ -627,6 +641,7 @@
                 this.collator = collator;
             }
 
+            @Override
             public int compare(Object arg0, Object arg1) {
                 return collator.compare(
                         ((KVP) arg0).key, ((KVP) arg1).key);
@@ -639,6 +654,7 @@
                 this.ae = ae;
             }
 
+            @Override
             public int compare(Object arg0, Object arg1) {
                 try {
                     return ae.compareNumbers(
@@ -1034,6 +1050,7 @@
 
     static class filterBI extends FilterLikeBI {
 
+        @Override
         protected TemplateModel calculateResult(
                 final TemplateModelIterator lhoIterator, final TemplateModel lho,
                 boolean lhoIsSequence, final ElementTransformer elementTransformer,
@@ -1043,7 +1060,7 @@
                     throw _MessageUtil.newLazilyGeneratedCollectionMustBeSequenceException(filterBI.this);
                 }
 
-                List<TemplateModel> resultList = new ArrayList<TemplateModel>();
+                List<TemplateModel> resultList = new ArrayList<>();
                 while (lhoIterator.hasNext()) {
                     TemplateModel element = lhoIterator.next();
                     if (elementMatches(element, elementTransformer, env)) {
@@ -1058,6 +1075,7 @@
                             TemplateModel prefetchedElement;
                             boolean prefetchedEndOfIterator;
 
+                            @Override
                             public TemplateModel next() throws TemplateModelException {
                                 ensurePrefetchDone();
                                 if (prefetchedEndOfIterator) {
@@ -1067,6 +1085,7 @@
                                 return prefetchedElement;
                             }
 
+                            @Override
                             public boolean hasNext() throws TemplateModelException {
                                 ensurePrefetchDone();
                                 return !prefetchedEndOfIterator;
@@ -1109,6 +1128,7 @@
 
     static class take_whileBI extends FilterLikeBI {
 
+        @Override
         protected TemplateModel calculateResult(
                 final TemplateModelIterator lhoIterator, final TemplateModel lho,
                 boolean lhoIsSequence, final ElementTransformer elementTransformer,
@@ -1118,7 +1138,7 @@
                     throw _MessageUtil.newLazilyGeneratedCollectionMustBeSequenceException(take_whileBI.this);
                 }
 
-                List<TemplateModel> resultList = new ArrayList<TemplateModel>();
+                List<TemplateModel> resultList = new ArrayList<>();
                 while (lhoIterator.hasNext()) {
                     TemplateModel element = lhoIterator.next();
                     if (elementMatches(element, elementTransformer, env)) {
@@ -1135,6 +1155,7 @@
                             TemplateModel prefetchedElement;
                             boolean prefetchedEndOfIterator;
 
+                            @Override
                             public TemplateModel next() throws TemplateModelException {
                                 ensurePrefetchDone();
                                 if (prefetchedEndOfIterator) {
@@ -1144,6 +1165,7 @@
                                 return prefetchedElement;
                             }
 
+                            @Override
                             public boolean hasNext() throws TemplateModelException {
                                 ensurePrefetchDone();
                                 return !prefetchedEndOfIterator;
@@ -1184,6 +1206,7 @@
 
     static class mapBI extends IntermediateStreamOperationLikeBuiltIn {
 
+        @Override
         protected TemplateModel calculateResult(
                 final TemplateModelIterator lhoIterator, TemplateModel lho, boolean lhoIsSequence, final ElementTransformer elementTransformer,
                 final Environment env) throws TemplateException {
@@ -1192,13 +1215,14 @@
                     throw _MessageUtil.newLazilyGeneratedCollectionMustBeSequenceException(mapBI.this);
                 }
 
-                List<TemplateModel> resultList = new ArrayList<TemplateModel>();
+                List<TemplateModel> resultList = new ArrayList<>();
                 while (lhoIterator.hasNext()) {
                     resultList.add(fetchAndMapNextElement(lhoIterator, elementTransformer, env));
                 }
                 return new TemplateModelListSequence(resultList);
             } else {
                 TemplateModelIterator mappedLhoIterator = new TemplateModelIterator() {
+                    @Override
                     public TemplateModel next() throws TemplateModelException {
                         try {
                             return fetchAndMapNextElement(lhoIterator, elementTransformer, env);
@@ -1207,6 +1231,7 @@
                         }
                     }
 
+                    @Override
                     public boolean hasNext() throws TemplateModelException {
                         return lhoIterator.hasNext();
                     }
@@ -1239,6 +1264,7 @@
 
     static class drop_whileBI extends FilterLikeBI {
 
+        @Override
         protected TemplateModel calculateResult(
                 final TemplateModelIterator lhoIterator, final TemplateModel lho,
                 boolean lhoIsSequence, final ElementTransformer elementTransformer,
@@ -1248,7 +1274,7 @@
                     throw _MessageUtil.newLazilyGeneratedCollectionMustBeSequenceException(drop_whileBI.this);
                 }
 
-                List<TemplateModel> resultList = new ArrayList<TemplateModel>();
+                List<TemplateModel> resultList = new ArrayList<>();
                 while (lhoIterator.hasNext()) {
                     TemplateModel element = lhoIterator.next();
                     if (!elementMatches(element, elementTransformer, env)) {
@@ -1268,6 +1294,7 @@
                             TemplateModel prefetchedElement;
                             boolean prefetchedEndOfIterator;
 
+                            @Override
                             public TemplateModel next() throws TemplateModelException {
                                 ensurePrefetchDone();
                                 if (prefetchedEndOfIterator) {
@@ -1277,6 +1304,7 @@
                                 return prefetchedElement;
                             }
 
+                            @Override
                             public boolean hasNext() throws TemplateModelException {
                                 ensurePrefetchDone();
                                 return !prefetchedEndOfIterator;
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsBasic.java b/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
index 4afffb8..4ab8c40 100644
--- a/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
+++ b/src/main/java/freemarker/core/BuiltInsForStringsBasic.java
@@ -81,6 +81,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return s.indexOf(getStringMethodArg(args, 0)) != -1
@@ -104,6 +105,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return s.endsWith(getStringMethodArg(args, 0)) ?
@@ -126,6 +128,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 String suffix = getStringMethodArg(args, 0);
@@ -148,6 +151,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1, 3);
                 
@@ -197,6 +201,7 @@
                 this.s = s;
             }
             
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -231,6 +236,7 @@
                 this.s = s;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -276,6 +282,7 @@
                 this.s = s;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -328,6 +335,7 @@
                 this.s = s;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -371,6 +379,7 @@
                 this.s = s;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -438,6 +447,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt  = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -487,6 +497,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 String prefix = getStringMethodArg(args, 0);
@@ -509,6 +520,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 String suffix = getStringMethodArg(args, 0);
@@ -530,6 +542,7 @@
                 this.s = s;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -564,6 +577,7 @@
                 this.s = s;
             }
     
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return s.startsWith(getStringMethodArg(args, 0)) ?
@@ -583,6 +597,7 @@
         TemplateModel calculateResult(final String s, final Environment env) throws TemplateException {
             return new TemplateMethodModelEx() {
                 
+                @Override
                 public Object exec(java.util.List args) throws TemplateModelException {
                     int argCount = args.size();
                     checkMethodArgCount(argCount, 1, 2);
@@ -647,6 +662,7 @@
         @Override
         TemplateModel calculateResult(final String s, final Environment env) {
             return new TemplateMethodModelEx() {
+                @Override
                 public Object exec(java.util.List args) throws TemplateModelException {
                     int argCount = args.size();
                     checkMethodArgCount(argCount, 1, 3);
@@ -701,6 +717,7 @@
     }
 
     static class truncateBI extends AbstractTruncateBI {
+        @Override
         protected TemplateModel truncate(
                 TruncateBuiltinAlgorithm algorithm, String s, int maxLength,
                 TemplateModel terminator, Integer terminatorLength, Environment env)
@@ -708,12 +725,14 @@
             return algorithm.truncate(s, maxLength, (TemplateScalarModel) terminator, terminatorLength, env);
         }
 
+        @Override
         protected boolean allowMarkupTerminator() {
             return false;
         }
     }
 
     static class truncate_wBI extends AbstractTruncateBI {
+        @Override
         protected TemplateModel truncate(
                 TruncateBuiltinAlgorithm algorithm, String s, int maxLength,
                 TemplateModel terminator, Integer terminatorLength, Environment env)
@@ -721,12 +740,14 @@
             return algorithm.truncateW(s, maxLength, (TemplateScalarModel) terminator, terminatorLength, env);
         }
 
+        @Override
         protected boolean allowMarkupTerminator() {
             return false;
         }
     }
 
     static class truncate_cBI extends AbstractTruncateBI {
+        @Override
         protected TemplateModel truncate(
                 TruncateBuiltinAlgorithm algorithm, String s, int maxLength,
                 TemplateModel terminator, Integer terminatorLength, Environment env)
@@ -734,12 +755,14 @@
             return algorithm.truncateC(s, maxLength, (TemplateScalarModel) terminator, terminatorLength, env);
         }
 
+        @Override
         protected boolean allowMarkupTerminator() {
             return false;
         }
     }
 
     static class truncate_mBI extends AbstractTruncateBI {
+        @Override
         protected TemplateModel truncate(
                 TruncateBuiltinAlgorithm algorithm, String s, int maxLength,
                 TemplateModel terminator, Integer terminatorLength, Environment env)
@@ -747,12 +770,14 @@
             return algorithm.truncateM(s, maxLength, terminator, terminatorLength, env);
         }
 
+        @Override
         protected boolean allowMarkupTerminator() {
             return true;
         }
     }
 
     static class truncate_w_mBI extends AbstractTruncateBI {
+        @Override
         protected TemplateModel truncate(
                 TruncateBuiltinAlgorithm algorithm, String s, int maxLength,
                 TemplateModel terminator, Integer terminatorLength, Environment env)
@@ -760,12 +785,14 @@
             return algorithm.truncateWM(s, maxLength, terminator, terminatorLength, env);
         }
 
+        @Override
         protected boolean allowMarkupTerminator() {
             return true;
         }
     }
 
     static class truncate_c_mBI extends AbstractTruncateBI {
+        @Override
         protected TemplateModel truncate(
                 TruncateBuiltinAlgorithm algorithm, String s, int maxLength,
                 TemplateModel terminator, Integer terminatorLength, Environment env)
@@ -773,6 +800,7 @@
             return algorithm.truncateCM(s, maxLength, terminator, terminatorLength, env);
         }
 
+        @Override
         protected boolean allowMarkupTerminator() {
             return true;
         }
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java b/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
index 3cfb241..f600135 100644
--- a/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
+++ b/src/main/java/freemarker/core/BuiltInsForStringsEncoding.java
@@ -49,10 +49,12 @@
             return new SimpleScalar(StringUtil.XHTMLEnc(s));
         }
     
+        @Override
         public int getMinimumICIVersion() {
             return _TemplateAPI.VERSION_INT_2_3_20;
         }
     
+        @Override
         public Object getPreviousICIChainMember() {
             return prevICIObj;
         }
@@ -164,6 +166,7 @@
         
         protected abstract String encodeWithCharset(String cs) throws UnsupportedEncodingException;
     
+        @Override
         public Object exec(List args) throws TemplateModelException {
             parent.checkMethodArgCount(args.size(), 1);
             try {
@@ -173,6 +176,7 @@
             }
         }
         
+        @Override
         public String getAsString() throws TemplateModelException {
             if (cachedResult == null) {
                 String cs = env.getEffectiveURLEscapingCharset();
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsMisc.java b/src/main/java/freemarker/core/BuiltInsForStringsMisc.java
index e1bf88b..012a007 100644
--- a/src/main/java/freemarker/core/BuiltInsForStringsMisc.java
+++ b/src/main/java/freemarker/core/BuiltInsForStringsMisc.java
@@ -139,11 +139,13 @@
                 this.env = env;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return resolvePath(getStringMethodArg(args, 0));
             }
 
+            @Override
             public String getAsString() throws TemplateModelException {
                 return resolvePath(getTemplate().getName());
             }
diff --git a/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java b/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
index d6d3082..eddc97c 100644
--- a/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
+++ b/src/main/java/freemarker/core/BuiltInsForStringsRegexp.java
@@ -71,6 +71,7 @@
                 this.matchString = matchString;
             }
             
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
@@ -101,6 +102,7 @@
                 this.s = s;
             }
 
+            @Override
             public Object exec(List args) throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 2, 3);
@@ -149,6 +151,7 @@
                 }
             }
             
+            @Override
             public String getAsString() {
                 return matchedInputPart;
             }
@@ -168,6 +171,7 @@
             this.input = input;
         }
         
+        @Override
         public TemplateModel get(int i) throws TemplateModelException {
             ArrayList matchingInputParts = this.matchingInputParts;
             if (matchingInputParts == null) {
@@ -176,6 +180,7 @@
             return (TemplateModel) matchingInputParts.get(i);
         }
         
+        @Override
         public boolean getAsBoolean() {
             Boolean result = entireInputMatched;
             return result != null ? result.booleanValue() : isEntrieInputMatchesAndStoreResults();
@@ -193,6 +198,7 @@
                
                 entireInputMatchGroups = new TemplateSequenceModel() {
                     
+                    @Override
                     public TemplateModel get(int i) throws TemplateModelException {
                         try {
                             return new SimpleScalar(firedEntireInputMatcher.group(i));
@@ -201,6 +207,7 @@
                         }
                     }
                     
+                    @Override
                     public int size() throws TemplateModelException {
                         try {
                             return firedEntireInputMatcher.groupCount() + 1;
@@ -235,6 +242,7 @@
             return matches;
         }
         
+        @Override
         public TemplateModelIterator iterator() {
             final ArrayList matchingInputParts = this.matchingInputParts;
             if (matchingInputParts == null) {
@@ -244,6 +252,7 @@
                     private int nextIdx = 0;
                     boolean hasFindInfo = matcher.find();
                     
+                    @Override
                     public boolean hasNext() {
                         final ArrayList matchingInputParts = RegexMatchModel.this.matchingInputParts;
                         if (matchingInputParts == null) {
@@ -253,6 +262,7 @@
                         }
                     }
                     
+                    @Override
                     public TemplateModel next() throws TemplateModelException {
                         final ArrayList matchingInputParts = RegexMatchModel.this.matchingInputParts;
                         if (matchingInputParts == null) {
@@ -278,10 +288,12 @@
                     
                     private int nextIdx = 0;
                     
+                    @Override
                     public boolean hasNext() {
                         return nextIdx < matchingInputParts.size();
                     }
                     
+                    @Override
                     public TemplateModel next() throws TemplateModelException {
                         try {
                             return (TemplateModel) matchingInputParts.get(nextIdx++);
@@ -293,6 +305,7 @@
             }
         }
         
+        @Override
         public int size() throws TemplateModelException {
             ArrayList matchingInputParts = this.matchingInputParts;
             if (matchingInputParts == null) {
diff --git a/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java b/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
index c5f1be1..f4491a9 100644
--- a/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
+++ b/src/main/java/freemarker/core/BuiltInsWithLazyConditionals.java
@@ -66,7 +66,7 @@
         
         @Override
         protected List<Expression> getArgumentsAsList() {
-            ArrayList<Expression> args = new ArrayList<Expression>(2);
+            ArrayList<Expression> args = new ArrayList<>(2);
             args.add(whenTrueExp);
             args.add(whenFalseExp);
             return args;
@@ -110,13 +110,13 @@
 
         @Override
         protected Expression getArgumentParameterValue(int argIdx) {
-            return (Expression) parameters.get(argIdx);
+            return parameters.get(argIdx);
         }
 
         @Override
         protected void cloneArguments(Expression clone, String replacedIdentifier, Expression replacement,
                 ReplacemenetState replacementState) {
-            List<Expression> parametersClone = new ArrayList<Expression>(parameters.size());
+            List<Expression> parametersClone = new ArrayList<>(parameters.size());
             for (Expression parameter : parameters) {
                 parametersClone.add(parameter
                         .deepCloneWithIdentifierReplaced(replacedIdentifier, replacement, replacementState));
diff --git a/src/main/java/freemarker/core/BuiltinVariable.java b/src/main/java/freemarker/core/BuiltinVariable.java
index 7436dcb..5002a03 100644
--- a/src/main/java/freemarker/core/BuiltinVariable.java
+++ b/src/main/java/freemarker/core/BuiltinVariable.java
@@ -319,10 +319,12 @@
             this.env = env;
         }
         
+        @Override
         public TemplateModel get(String key) throws TemplateModelException {
             return env.getVariable(key);
         }
         
+        @Override
         public boolean isEmpty() {
             return false;
         }
diff --git a/src/main/java/freemarker/core/CollectionAndSequence.java b/src/main/java/freemarker/core/CollectionAndSequence.java
index affb7fe..adca684 100644
--- a/src/main/java/freemarker/core/CollectionAndSequence.java
+++ b/src/main/java/freemarker/core/CollectionAndSequence.java
@@ -47,6 +47,7 @@
         this.sequence = sequence;
     }
 
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         if (collection != null) {
             return collection.iterator();
@@ -55,6 +56,7 @@
         }
     }
 
+    @Override
     public TemplateModel get(int i) throws TemplateModelException {
         if (sequence != null) {
             return sequence.get(i);
@@ -64,6 +66,7 @@
         }
     }
 
+    @Override
     public int size() throws TemplateModelException {
         if (sequence != null) {
             return sequence.size();
@@ -77,7 +80,7 @@
 
     private void initSequence() throws TemplateModelException {
         if (data == null) {
-            data = new ArrayList<TemplateModel>();
+            data = new ArrayList<>();
             TemplateModelIterator it = collection.iterator();
             while (it.hasNext()) {
                 data.add(it.next());
diff --git a/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java b/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
index 754ddf5..0a04fce 100644
--- a/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
+++ b/src/main/java/freemarker/core/CommonTemplateMarkupOutputModel.java
@@ -43,6 +43,7 @@
         this.markupContent = markupContent;
     }
 
+    @Override
     public abstract CommonMarkupOutputFormat<MO> getOutputFormat();
 
     /** Maybe {@code null}, but then {@link #getMarkupContent()} isn't {@code null}. */
diff --git a/src/main/java/freemarker/core/Configurable.java b/src/main/java/freemarker/core/Configurable.java
index a0ad656..8b2e0e0 100644
--- a/src/main/java/freemarker/core/Configurable.java
+++ b/src/main/java/freemarker/core/Configurable.java
@@ -501,7 +501,7 @@
     public Configurable(Configurable parent) {
         this.parent = parent;
         properties = new Properties(parent.properties);
-        customAttributes = new HashMap<Object, Object>(0);
+        customAttributes = new HashMap<>(0);
     }
     
     @Override
@@ -1934,7 +1934,7 @@
     }
 
     private void initAutoImportsMap() {
-        autoImports = new LinkedHashMap<String, String>(4);
+        autoImports = new LinkedHashMap<>(4);
     }
     
     /**
@@ -2074,7 +2074,7 @@
     }
 
     private void initAutoIncludesList() {
-        autoIncludes = new ArrayList<String>(4);
+        autoIncludes = new ArrayList<>(4);
     }
     
     /**
@@ -2860,7 +2860,7 @@
      * @since 2.3.24
      */
     public Set<String> getSettingNames(boolean camelCase) {
-        return new _SortedArraySet<String>(camelCase ? SETTING_NAMES_CAMEL_CASE : SETTING_NAMES_SNAKE_CASE); 
+        return new _SortedArraySet<>(camelCase ? SETTING_NAMES_CAMEL_CASE : SETTING_NAMES_SNAKE_CASE);
     }
 
     private TimeZone parseTimeZoneSettingValue(String value) {
@@ -2959,7 +2959,7 @@
             super(env,
                     "Unknown FreeMarker configuration setting: ", new _DelayedJQuote(name),
                     correctedName == null
-                            ? (Object) "" : new Object[] { ". You may meant: ", new _DelayedJQuote(correctedName) });
+                            ? "" : new Object[] { ". You may meant: ", new _DelayedJQuote(correctedName) });
         }
         
     }
diff --git a/src/main/java/freemarker/core/DefaultToExpression.java b/src/main/java/freemarker/core/DefaultToExpression.java
index 245525d..b109b79 100755
--- a/src/main/java/freemarker/core/DefaultToExpression.java
+++ b/src/main/java/freemarker/core/DefaultToExpression.java
@@ -37,27 +37,35 @@
     
 	static private class EmptyStringAndSequenceAndHash implements TemplateScalarModel, TemplateSequenceModel,
 	        TemplateHashModelEx2 {
-		public String getAsString() {
+		@Override
+        public String getAsString() {
 			return "";
 		}
-		public TemplateModel get(int i) {
+		@Override
+        public TemplateModel get(int i) {
 			return null;
 		}
-		public TemplateModel get(String s) {
+		@Override
+        public TemplateModel get(String s) {
 			return null;
 		}
-		public int size() {
+		@Override
+        public int size() {
 			return 0;
 		}
-		public boolean isEmpty() {
+		@Override
+        public boolean isEmpty() {
 			return true;
 		}
-		public TemplateCollectionModel keys() {
+		@Override
+        public TemplateCollectionModel keys() {
 			return EMPTY_COLLECTION;
 		}
-		public TemplateCollectionModel values() {
+		@Override
+        public TemplateCollectionModel values() {
 			return EMPTY_COLLECTION;
 		}
+        @Override
         public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
             return Constants.EMPTY_KEY_VALUE_PAIR_ITERATOR;
         }
diff --git a/src/main/java/freemarker/core/Dot.java b/src/main/java/freemarker/core/Dot.java
index a7a9428..54bae57 100644
--- a/src/main/java/freemarker/core/Dot.java
+++ b/src/main/java/freemarker/core/Dot.java
@@ -78,7 +78,7 @@
 
     @Override
     Object getParameterValue(int idx) {
-        return idx == 0 ? (Object) target : (Object) key;
+        return idx == 0 ? target : key;
     }
 
     @Override
diff --git a/src/main/java/freemarker/core/DynamicKeyName.java b/src/main/java/freemarker/core/DynamicKeyName.java
index e455b94..b651f38 100644
--- a/src/main/java/freemarker/core/DynamicKeyName.java
+++ b/src/main/java/freemarker/core/DynamicKeyName.java
@@ -284,7 +284,7 @@
             // In principle we should take lazilyGeneratedResultEnabled into account, but that wouldn't be backward
             // compatible. For example, with lazily generated sequence result <#list xs[b..e] as x> would behave
             // differently if xs is modified inside the #list nested content.
-            ArrayList<TemplateModel> resultList = new ArrayList<TemplateModel>(resultSize);
+            ArrayList<TemplateModel> resultList = new ArrayList<>(resultSize);
             int srcIdx = firstIdx;
             for (int i = 0; i < resultSize; i++) {
                 resultList.add(targetSeq.get(srcIdx));
@@ -335,6 +335,7 @@
                 private boolean elementsBeforeFirsIndexWereSkipped;
                 private int nextIdx;
 
+                @Override
                 public TemplateModel next() throws TemplateModelException {
                     ensureElementsBeforeFirstIndexWereSkipped();
                     if (!rightUnbounded && nextIdx > lastIdx) {
@@ -351,6 +352,7 @@
                     return result;
                 }
 
+                @Override
                 public boolean hasNext() throws TemplateModelException {
                     ensureElementsBeforeFirstIndexWereSkipped();
                     return (rightUnbounded || nextIdx <= lastIdx) && (!rightAdaptive || targetIter.hasNext());
diff --git a/src/main/java/freemarker/core/Environment.java b/src/main/java/freemarker/core/Environment.java
index c48954e..cd4f783 100644
--- a/src/main/java/freemarker/core/Environment.java
+++ b/src/main/java/freemarker/core/Environment.java
@@ -174,7 +174,7 @@
     private Throwable lastThrowable;
 
     private TemplateModel lastReturnValue;
-    private Map<Object, Namespace> macroToNamespaceLookup = new IdentityHashMap<Object, Namespace>();
+    private Map<Object, Namespace> macroToNamespaceLookup = new IdentityHashMap<>();
 
     private TemplateNodeModel currentVisitorNode;
     private TemplateSequenceModel nodeNamespaces;
@@ -435,11 +435,13 @@
         if (outArgs.length > 0) {
             pushLocalContext(new LocalContext() {
 
+                @Override
                 public TemplateModel getLocalVariable(String name) {
                     int index = bodyParameterNames.indexOf(name);
                     return index != -1 ? outArgs[index] : null;
                 }
 
+                @Override
                 public Collection getLocalVariableNames() {
                     return bodyParameterNames;
                 }
@@ -509,11 +511,7 @@
                     } else {
                         throw t;
                     }
-                } catch (TemplateException e) {
-                    throw e;
-                } catch (IOException e) {
-                    throw e;
-                } catch (Error e) {
+                } catch (TemplateException | IOException | Error e) {
                     throw e;
                 } catch (Throwable e) {
                     if (EvalUtil.shouldWrapUncheckedException(e, this)) {
@@ -710,10 +708,12 @@
             this.lambdaArgValue = lambdaArgValue;
         }
 
+        @Override
         public TemplateModel getLocalVariable(String name) throws TemplateModelException {
             return name.equals(lambdaArgName) ? lambdaArgValue : null;
         }
 
+        @Override
         public Collection getLocalVariableNames() throws TemplateModelException {
             return Collections.singleton(lambdaArgName);
         }
@@ -942,7 +942,7 @@
                         } else {
                             List<NameValuePair> orderLastByNameCatchAll = withArgsState.orderLastByNameCatchAll;
                             if (orderLastByNameCatchAll == null) {
-                                orderLastByNameCatchAll = new ArrayList<NameValuePair>();
+                                orderLastByNameCatchAll = new ArrayList<>();
                                 withArgsState.orderLastByNameCatchAll = orderLastByNameCatchAll;
                             }
                             orderLastByNameCatchAll.add(new NameValuePair(argName, argValue));
@@ -1599,7 +1599,7 @@
             throws TemplateValueFormatException {
         if (cachedTemplateNumberFormats == null) {
             if (cacheResult) {
-                cachedTemplateNumberFormats = new HashMap<String, TemplateNumberFormat>();
+                cachedTemplateNumberFormats = new HashMap<>();
             }
         } else {
             TemplateNumberFormat format = cachedTemplateNumberFormats.get(formatString);
@@ -2073,7 +2073,7 @@
                 cachedFormatsByFormatString = cachedTempDateFormatsByFmtStrArray[cacheArrIdx];
                 if (cachedFormatsByFormatString == null) {
                     if (cacheResult) {
-                        cachedFormatsByFormatString = new HashMap<String, TemplateDateFormat>(4);
+                        cachedFormatsByFormatString = new HashMap<>(4);
                         cachedTempDateFormatsByFmtStrArray[cacheArrIdx] = cachedFormatsByFormatString;
                         format = null;
                     } else {
@@ -2606,10 +2606,12 @@
     public TemplateHashModel getDataModel() {
         return rootDataModel instanceof TemplateHashModelEx
                 ? new TemplateHashModelEx() {
+                    @Override
                     public boolean isEmpty() throws TemplateModelException {
                         return false;
                     }
 
+                    @Override
                     public TemplateModel get(String key) throws TemplateModelException {
                         return getDataModelOrSharedVariable(key);
                     }
@@ -2617,23 +2619,28 @@
                     // NB: The methods below do not take into account
                     // configuration shared variables even though
                     // the hash will return them, if only for BWC reasons
+                    @Override
                     public TemplateCollectionModel values() throws TemplateModelException {
                         return ((TemplateHashModelEx) rootDataModel).values();
                     }
 
+                    @Override
                     public TemplateCollectionModel keys() throws TemplateModelException {
                         return ((TemplateHashModelEx) rootDataModel).keys();
                     }
 
+                    @Override
                     public int size() throws TemplateModelException {
                         return ((TemplateHashModelEx) rootDataModel).size();
                     }
                 }
             : new TemplateHashModel() {
+                @Override
                 public boolean isEmpty() {
                     return false;
                 }
 
+                @Override
                 public TemplateModel get(String key) throws TemplateModelException {
                     TemplateModel value = rootDataModel.get(key);
                     return value != null ? value : configuration.getSharedVariable(key);
@@ -2649,10 +2656,12 @@
     public TemplateHashModel getGlobalVariables() {
         return new TemplateHashModel() {
 
+            @Override
             public boolean isEmpty() {
                 return false;
             }
 
+            @Override
             public TemplateModel get(String key) throws TemplateModelException {
                 TemplateModel result = globalNamespace.get(key);
                 if (result == null) {
@@ -3196,7 +3205,7 @@
     public Object setCustomState(Object identityKey, Object value) {
         IdentityHashMap<Object, Object> customStateVariables = this.customStateVariables;
         if (customStateVariables == null) {
-            customStateVariables = new IdentityHashMap<Object, Object>();
+            customStateVariables = new IdentityHashMap<>();
             this.customStateVariables = customStateVariables;
         }
         return customStateVariables.put(identityKey, value);
@@ -3210,6 +3219,7 @@
             this.childBuffer = childBuffer;
         }
 
+        @Override
         public void render(Writer newOut) throws TemplateException, IOException {
             Writer prevOut = out;
             out = newOut;
diff --git a/src/main/java/freemarker/core/EvalUtil.java b/src/main/java/freemarker/core/EvalUtil.java
index 9af8d83..a358208 100644
--- a/src/main/java/freemarker/core/EvalUtil.java
+++ b/src/main/java/freemarker/core/EvalUtil.java
@@ -306,12 +306,12 @@
                     "Left hand operand ",
                     (quoteOperandsInErrors && leftExp != null
                             ? new Object[] { "(", new _DelayedGetCanonicalForm(leftExp), ") value " }
-                            : (Object) ""),
+                            : ""),
                     "is ", new _DelayedAOrAn(new _DelayedFTLTypeDescription(leftValue)), ".\n",
                     "Right hand operand ",
                     (quoteOperandsInErrors && rightExp != null
                             ? new Object[] { "(", new _DelayedGetCanonicalForm(rightExp), ") value " }
-                            : (Object) ""),
+                            : ""),
                     "is ", new _DelayedAOrAn(new _DelayedFTLTypeDescription(rightValue)),
                     ".");
         }
diff --git a/src/main/java/freemarker/core/Expression.java b/src/main/java/freemarker/core/Expression.java
index 5a69095..b4fd0d6 100644
--- a/src/main/java/freemarker/core/Expression.java
+++ b/src/main/java/freemarker/core/Expression.java
@@ -99,9 +99,7 @@
     final TemplateModel eval(Environment env) throws TemplateException {
         try {
             return constantValue != null ? constantValue : _eval(env);
-        } catch (FlowControlException e) {
-            throw e;
-        } catch (TemplateException e) {
+        } catch (FlowControlException | TemplateException e) {
             throw e;
         } catch (Exception e) {
             if (env != null && EvalUtil.shouldWrapUncheckedException(e, env)) {
diff --git a/src/main/java/freemarker/core/ExpressionWithFixedResult.java b/src/main/java/freemarker/core/ExpressionWithFixedResult.java
index 37aee8f..a3bd58e 100644
--- a/src/main/java/freemarker/core/ExpressionWithFixedResult.java
+++ b/src/main/java/freemarker/core/ExpressionWithFixedResult.java
@@ -34,14 +34,17 @@
         this.sourceExpression = sourceExpression;
     }
 
+    @Override
     TemplateModel _eval(Environment env) throws TemplateException {
         return fixedResult;
     }
 
+    @Override
     boolean isLiteral() {
         return sourceExpression.isLiteral();
     }
 
+    @Override
     protected Expression deepCloneWithIdentifierReplaced_inner(String replacedIdentifier, Expression replacement,
             ReplacemenetState replacementState) {
         return new ExpressionWithFixedResult(
@@ -49,22 +52,27 @@
                 sourceExpression.deepCloneWithIdentifierReplaced(replacedIdentifier, replacement, replacementState));
     }
 
+    @Override
     public String getCanonicalForm() {
         return sourceExpression.getCanonicalForm();
     }
 
+    @Override
     String getNodeTypeSymbol() {
         return sourceExpression.getNodeTypeSymbol();
     }
 
+    @Override
     int getParameterCount() {
         return sourceExpression.getParameterCount();
     }
 
+    @Override
     Object getParameterValue(int idx) {
         return sourceExpression.getParameterValue(idx);
     }
 
+    @Override
     ParameterRole getParameterRole(int idx) {
         return sourceExpression.getParameterRole(idx);
     }
diff --git a/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java b/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
index 398f382..02e0fba 100644
--- a/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
+++ b/src/main/java/freemarker/core/ExtendedDecimalFormatParser.java
@@ -59,8 +59,9 @@
     
     private static final HashMap<String, ? extends ParameterHandler> PARAM_HANDLERS;
     static {
-        HashMap<String, ParameterHandler> m = new HashMap<String, ParameterHandler>();
+        HashMap<String, ParameterHandler> m = new HashMap<>();
         m.put(PARAM_ROUNDING_MODE, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 RoundingMode parsedValue;
@@ -91,6 +92,7 @@
             }
         });
         ParameterHandler multiplierParamHandler = new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 try {
@@ -103,6 +105,7 @@
         m.put(PARAM_MULTIPLIER, multiplierParamHandler);
         m.put(PARAM_MULTIPIER, multiplierParamHandler);
         m.put(PARAM_DECIMAL_SEPARATOR, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 if (value.length() != 1) {
@@ -112,6 +115,7 @@
             }
         });
         m.put(PARAM_MONETARY_DECIMAL_SEPARATOR, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 if (value.length() != 1) {
@@ -121,6 +125,7 @@
             }
         });
         m.put(PARAM_GROUP_SEPARATOR, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 if (value.length() != 1) {
@@ -130,12 +135,14 @@
             }
         });
         m.put(PARAM_EXPONENT_SEPARATOR, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 parser.symbols.setExponentSeparator(value);
             }
         });
         m.put(PARAM_MINUS_SIGN, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 if (value.length() != 1) {
@@ -145,18 +152,21 @@
             }
         });
         m.put(PARAM_INFINITY, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 parser.symbols.setInfinity(value);
             }
         });
         m.put(PARAM_NAN, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 parser.symbols.setNaN(value);
             }
         });
         m.put(PARAM_PERCENT, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 if (value.length() != 1) {
@@ -166,6 +176,7 @@
             }
         });
         m.put(PARAM_PER_MILL, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 if (value.length() != 1) {
@@ -175,6 +186,7 @@
             }
         });
         m.put(PARAM_ZERO_DIGIT, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 if (value.length() != 1) {
@@ -184,6 +196,7 @@
             }
         });
         m.put(PARAM_CURRENCY_CODE, new ParameterHandler() {
+            @Override
             public void handle(ExtendedDecimalFormatParser parser, String value)
                     throws InvalidParameterValueException {
                 Currency currency;
diff --git a/src/main/java/freemarker/core/GetOptionalTemplateMethod.java b/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
index be6c822..bb4d2f1 100644
--- a/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
+++ b/src/main/java/freemarker/core/GetOptionalTemplateMethod.java
@@ -64,6 +64,7 @@
         this.methodName = "." + builtInVarName;
     }
 
+    @Override
     public Object exec(List args) throws TemplateModelException {
         final int argCnt = args.size();
         if (argCnt < 1 || argCnt > 2) {
@@ -149,6 +150,7 @@
         // conveniently provided like in <@optTemp.include!myDefaultMacro />.
         if (template != null) {
             result.put(RESULT_INCLUDE, new TemplateDirectiveModel() {
+                @Override
                 public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
                         throws TemplateException, IOException {
                     if (!params.isEmpty()) {
@@ -165,6 +167,7 @@
                 }
             });
             result.put(RESULT_IMPORT, new TemplateMethodModelEx() {
+                @Override
                 public Object exec(List args) throws TemplateModelException {
                     if (!args.isEmpty()) {
                         throw new TemplateModelException("This method supports no parameters.");
@@ -172,9 +175,7 @@
                     
                     try {
                         return env.importLib(template, null);
-                    } catch (IOException e) {
-                        throw new _TemplateModelException(e, "Failed to import loaded template; see cause exception");
-                    } catch (TemplateException e) {
+                    } catch (IOException | TemplateException e) {
                         throw new _TemplateModelException(e, "Failed to import loaded template; see cause exception");
                     }
                 }
diff --git a/src/main/java/freemarker/core/HashLiteral.java b/src/main/java/freemarker/core/HashLiteral.java
index 7b4607c..f358ba3 100644
--- a/src/main/java/freemarker/core/HashLiteral.java
+++ b/src/main/java/freemarker/core/HashLiteral.java
@@ -91,12 +91,12 @@
     @Override
     protected Expression deepCloneWithIdentifierReplaced_inner(
             String replacedIdentifier, Expression replacement, ReplacemenetState replacementState) {
-		List<Expression> clonedKeys = new ArrayList<Expression>(keys.size());
+		List<Expression> clonedKeys = new ArrayList<>(keys.size());
         for (Expression key : keys) {
             clonedKeys.add(key.deepCloneWithIdentifierReplaced(replacedIdentifier, replacement, replacementState));
         }
 
-        List<Expression> clonedValues = new ArrayList<Expression>(values.size());
+        List<Expression> clonedValues = new ArrayList<>(values.size());
         for (Expression value : values) {
             clonedValues.add(value.deepCloneWithIdentifierReplaced(replacedIdentifier, replacement, replacementState));
         }
@@ -112,7 +112,7 @@
 
         SequenceHash(Environment env) throws TemplateException {
             if (_TemplateAPI.getTemplateLanguageVersionAsInt(HashLiteral.this) >= _TemplateAPI.VERSION_INT_2_3_21) {
-                map = new LinkedHashMap<String, TemplateModel>();
+                map = new LinkedHashMap<>();
                 for (int i = 0; i < size; i++) {
                     Expression keyExp = keys.get(i);
                     Expression valExp = values.get(i);
@@ -126,7 +126,7 @@
             } else {
                 // Legacy hash literal, where repeated keys were kept when doing ?values or ?keys, yet overwritten when
                 // doing hash[key].
-                map = new HashMap<String, TemplateModel>();
+                map = new HashMap<>();
                 SimpleSequence keyList = new SimpleSequence(size, _TemplateAPI.SAFE_OBJECT_WRAPPER);
                 SimpleSequence valueList = new SimpleSequence(size, _TemplateAPI.SAFE_OBJECT_WRAPPER);
                 for (int i = 0; i < size; i++) {
@@ -146,10 +146,12 @@
             }
         }
 
+        @Override
         public int size() {
             return size;
         }
 
+        @Override
         public TemplateCollectionModel keys() {
             if (keyCollection == null) {
                 // This can only happen when IcI >= 2.3.21, an the map is a LinkedHashMap.
@@ -159,6 +161,7 @@
             return keyCollection;
         }
 
+        @Override
         public TemplateCollectionModel values() {
             if (valueCollection == null) {
                 // This can only happen when IcI >= 2.3.21, an the map is a LinkedHashMap.
@@ -168,10 +171,12 @@
             return valueCollection;
         }
 
+        @Override
         public TemplateModel get(String key) {
             return map.get(key);
         }
 
+        @Override
         public boolean isEmpty() {
             return size == 0;
         }
@@ -181,24 +186,29 @@
             return getCanonicalForm();
         }
 
+        @Override
         public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
             return new KeyValuePairIterator() {
                 private final TemplateModelIterator keyIterator = keys().iterator();
                 private final TemplateModelIterator valueIterator = values().iterator();
 
+                @Override
                 public boolean hasNext() throws TemplateModelException {
                     return keyIterator.hasNext();
                 }
 
+                @Override
                 public KeyValuePair next() throws TemplateModelException {
                     return new KeyValuePair() {
                         private final TemplateModel key = keyIterator.next();
                         private final TemplateModel value = valueIterator.next();
 
+                        @Override
                         public TemplateModel getKey() {
                             return key;
                         }
 
+                        @Override
                         public TemplateModel getValue() {
                             return value;
                         }
diff --git a/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java b/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
index d743d8d..a42d999 100644
--- a/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
+++ b/src/main/java/freemarker/core/IntermediateStreamOperationLikeBuiltIn.java
@@ -84,14 +84,17 @@
         target.enableLazilyGeneratedResult();
     }
 
+    @Override
     protected List<Expression> getArgumentsAsList() {
         return Collections.singletonList(elementTransformerExp);
     }
 
+    @Override
     protected int getArgumentsCount() {
         return 1;
     }
 
+    @Override
     protected Expression getArgumentParameterValue(int argIdx) {
         if (argIdx != 0) {
             throw new IndexOutOfBoundsException();
@@ -103,6 +106,7 @@
         return elementTransformerExp;
     }
 
+    @Override
     protected void cloneArguments(
             Expression clone, String replacedIdentifier, Expression replacement, ReplacemenetState replacementState) {
         try {
@@ -114,6 +118,7 @@
         }
     }
 
+    @Override
     TemplateModel _eval(Environment env) throws TemplateException {
         TemplateModel targetValue = target.eval(env);
 
@@ -186,6 +191,7 @@
             this.elementTransformerExp = elementTransformerExp;
         }
 
+        @Override
         public TemplateModel transformElement(TemplateModel element, Environment env) throws TemplateException {
             return elementTransformerExp.invokeLambdaDefinedFunction(element, env);
         }
@@ -199,6 +205,7 @@
             this.elementTransformer = elementTransformer;
         }
 
+        @Override
         public TemplateModel transformElement(TemplateModel element, Environment env)
                 throws TemplateModelException {
             Object result = elementTransformer.exec(Collections.singletonList(element));
@@ -216,6 +223,7 @@
             this.elementTransformerExp = elementTransformerExp;
         }
 
+        @Override
         public TemplateModel transformElement(TemplateModel element, Environment env) throws
                 TemplateException {
             // #function-s were originally designed to be called from templates directly, so they expect an
diff --git a/src/main/java/freemarker/core/Interpret.java b/src/main/java/freemarker/core/Interpret.java
index 7252a2f..9b4cb41 100644
--- a/src/main/java/freemarker/core/Interpret.java
+++ b/src/main/java/freemarker/core/Interpret.java
@@ -119,6 +119,7 @@
             this.template = template;
         }
         
+        @Override
         public Writer getWriter(final Writer out, Map args) throws TemplateModelException, IOException {
             try {
                 Environment env = Environment.getCurrentEnvironment();
diff --git a/src/main/java/freemarker/core/IteratorBlock.java b/src/main/java/freemarker/core/IteratorBlock.java
index 14aac31..f9e19c9 100644
--- a/src/main/java/freemarker/core/IteratorBlock.java
+++ b/src/main/java/freemarker/core/IteratorBlock.java
@@ -452,6 +452,7 @@
             return visibleLoopVarName.equals(visibleLoopVar1Name) || visibleLoopVarName.equals(loopVar2Name);
         }
 
+        @Override
         public TemplateModel getLocalVariable(String name) {
             String visibleLoopVar1Name = this.visibleLoopVar1Name; // Not this.loopVar1Name!
             if (visibleLoopVar1Name == null) {
@@ -487,6 +488,7 @@
             return null;
         }
         
+        @Override
         public Collection<String> getLocalVariableNames() {
             String visibleLoopVar1Name = this.visibleLoopVar1Name; // Not this.loopVar1Name!
             if (visibleLoopVar1Name != null) {
diff --git a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java b/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
index 9aedec9..257895a 100644
--- a/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
+++ b/src/main/java/freemarker/core/JavaTemplateDateFormatFactory.java
@@ -36,7 +36,7 @@
     private static final Logger LOG = Logger.getLogger("freemarker.runtime");
 
     private static final ConcurrentHashMap<CacheKey, DateFormat> GLOBAL_FORMAT_CACHE
-            = new ConcurrentHashMap<CacheKey, DateFormat>();
+            = new ConcurrentHashMap<>();
     private static final int LEAK_ALERT_DATE_FORMAT_CACHE_SIZE = 1024;
     
     private JavaTemplateDateFormatFactory() {
diff --git a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java b/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
index 6cbf9a9..42262ed 100644
--- a/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
+++ b/src/main/java/freemarker/core/JavaTemplateNumberFormatFactory.java
@@ -35,7 +35,7 @@
     private static final Logger LOG = Logger.getLogger("freemarker.runtime");
 
     private static final ConcurrentHashMap<CacheKey, NumberFormat> GLOBAL_FORMAT_CACHE
-            = new ConcurrentHashMap<CacheKey, NumberFormat>();
+            = new ConcurrentHashMap<>();
     private static final int LEAK_ALERT_NUMBER_FORMAT_CACHE_SIZE = 1024;
     
     private JavaTemplateNumberFormatFactory() {
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java b/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
index 99df53f..ef8030a 100644
--- a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
+++ b/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithAlreadyKnownSize.java
@@ -30,10 +30,12 @@
         this.size = size;
     }
 
+    @Override
     public int size() throws TemplateModelException {
         return size;
     }
 
+    @Override
     public boolean isEmpty() {
         return size == 0;
     }
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java b/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
index 6917273..997a002 100644
--- a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
+++ b/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeCollEx.java
@@ -38,10 +38,12 @@
         this.sizeSourceCollEx = sizeSourceCollEx;
     }
 
+    @Override
     public int size() throws TemplateModelException {
         return sizeSourceCollEx.size();
     }
 
+    @Override
     public boolean isEmpty() throws TemplateModelException {
         return sizeSourceCollEx.isEmpty();
     }
diff --git a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java b/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
index 15e7c4a..e3ee7e7 100644
--- a/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
+++ b/src/main/java/freemarker/core/LazilyGeneratedCollectionModelWithSameSizeSeq.java
@@ -38,10 +38,12 @@
         this.sizeSourceSeq = sizeSourceSeq;
     }
 
+    @Override
     public int size() throws TemplateModelException {
         return sizeSourceSeq.size();
     }
 
+    @Override
     public boolean isEmpty() throws TemplateModelException {
         return sizeSourceSeq.size() == 0;
     }
diff --git a/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java b/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
index aa55c26..ffad49b 100644
--- a/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
+++ b/src/main/java/freemarker/core/LazyCollectionTemplateModelIterator.java
@@ -36,11 +36,13 @@
         this.templateCollectionModel = templateCollectionModel;
     }
 
+    @Override
     public TemplateModel next() throws TemplateModelException {
         ensureIteratorInitialized();
         return iterator.next();
     }
 
+    @Override
     public boolean hasNext() throws TemplateModelException {
         ensureIteratorInitialized();
         return iterator.hasNext();
diff --git a/src/main/java/freemarker/core/LazySequenceIterator.java b/src/main/java/freemarker/core/LazySequenceIterator.java
index 8bcf78d..277b52d 100644
--- a/src/main/java/freemarker/core/LazySequenceIterator.java
+++ b/src/main/java/freemarker/core/LazySequenceIterator.java
@@ -38,10 +38,12 @@
         this.sequence = sequence;
 
     }
+    @Override
     public TemplateModel next() throws TemplateModelException {
         return sequence.get(index++);
     }
 
+    @Override
     public boolean hasNext() {
         if (size == null) {
             try {
diff --git a/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java b/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
index a9a1e8e..e2f51b5 100644
--- a/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
+++ b/src/main/java/freemarker/core/LegacyConstructorParserConfiguration.java
@@ -57,30 +57,37 @@
         this.arithmeticEngine = arithmeticEngine;
     }
 
+    @Override
     public int getTagSyntax() {
         return tagSyntax;
     }
     
+    @Override
     public int getInterpolationSyntax() {
         return interpolationSyntax;
     }
 
+    @Override
     public int getNamingConvention() {
         return namingConvention;
     }
 
+    @Override
     public boolean getWhitespaceStripping() {
         return whitespaceStripping;
     }
 
+    @Override
     public boolean getStrictSyntaxMode() {
         return strictSyntaxMode;
     }
 
+    @Override
     public Version getIncompatibleImprovements() {
         return incompatibleImprovements;
     }
 
+    @Override
     public ArithmeticEngine getArithmeticEngine() {
         if (arithmeticEngine == null) {
             throw new IllegalStateException();
@@ -94,6 +101,7 @@
         }
     }
 
+    @Override
     public int getAutoEscapingPolicy() {
         if (autoEscapingPolicy == null) {
             throw new IllegalStateException();
@@ -107,6 +115,7 @@
         }
     }
 
+    @Override
     public OutputFormat getOutputFormat() {
         if (outputFormat == null) {
             throw new IllegalStateException();
@@ -120,6 +129,7 @@
         }
     }
 
+    @Override
     public boolean getRecognizeStandardFileExtensions() {
         if (recognizeStandardFileExtensions == null) {
             throw new IllegalStateException();
@@ -133,6 +143,7 @@
         }
     }
 
+    @Override
     public int getTabSize() {
         if (tabSize == null) {
             throw new IllegalStateException();
diff --git a/src/main/java/freemarker/core/ListLiteral.java b/src/main/java/freemarker/core/ListLiteral.java
index e384cd0..7745db7 100644
--- a/src/main/java/freemarker/core/ListLiteral.java
+++ b/src/main/java/freemarker/core/ListLiteral.java
@@ -66,7 +66,7 @@
                 return Collections.EMPTY_LIST;
             }
             case 1: {
-                return Collections.singletonList(((Expression) items.get(0)).evalAndCoerceToPlainText(env));
+                return Collections.singletonList(items.get(0).evalAndCoerceToPlainText(env));
             }
             default: {
                 List result = new ArrayList(items.size());
@@ -89,7 +89,7 @@
                 return Collections.EMPTY_LIST;
             }
             case 1: {
-                return Collections.singletonList(((Expression) items.get(0)).eval(env));
+                return Collections.singletonList(items.get(0).eval(env));
             }
             default: {
                 List result = new ArrayList(items.size());
@@ -107,7 +107,7 @@
         StringBuilder buf = new StringBuilder("[");
         int size = items.size();
         for (int i = 0; i < size; i++) {
-            Expression value = (Expression) items.get(i);
+            Expression value = items.get(i);
             buf.append(value.getCanonicalForm());
             if (i != size - 1) {
                 buf.append(", ");
@@ -128,7 +128,7 @@
             return true;
         }
         for (int i = 0; i < items.size(); i++) {
-            Expression exp = (Expression) items.get(i);
+            Expression exp = items.get(i);
             if (!exp.isLiteral()) {
                 return false;
             }
diff --git a/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java b/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
index b61cf76..c30a868 100644
--- a/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
+++ b/src/main/java/freemarker/core/ListableRightUnboundedRangeModel.java
@@ -38,10 +38,12 @@
         super(begin);
     }
 
+    @Override
     public int size() throws TemplateModelException {
         return Integer.MAX_VALUE;
     }
 
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         return new TemplateModelIterator() {
             boolean needInc;
@@ -50,6 +52,7 @@
             long nextLong;
             BigInteger nextBigInteger;
 
+            @Override
             public TemplateModel next() throws TemplateModelException {
                 if (needInc) {
                     switch (nextType) {
@@ -82,6 +85,7 @@
                         : new SimpleNumber(nextBigInteger)); 
             }
 
+            @Override
             public boolean hasNext() throws TemplateModelException {
                 return true;
             }
diff --git a/src/main/java/freemarker/core/LocalLambdaExpression.java b/src/main/java/freemarker/core/LocalLambdaExpression.java
index 852a934..95a8438 100644
--- a/src/main/java/freemarker/core/LocalLambdaExpression.java
+++ b/src/main/java/freemarker/core/LocalLambdaExpression.java
@@ -52,6 +52,7 @@
         return "->";
     }
 
+    @Override
     TemplateModel _eval(Environment env) throws TemplateException {
         throw new TemplateException("Can't get lambda expression as a value: Lambdas currently can only be used on a " +
                 "few special places.",
diff --git a/src/main/java/freemarker/core/Macro.java b/src/main/java/freemarker/core/Macro.java
index 79b0c83..31d621e 100644
--- a/src/main/java/freemarker/core/Macro.java
+++ b/src/main/java/freemarker/core/Macro.java
@@ -185,7 +185,7 @@
             String paramName = paramNames[i];
             sb.append(_CoreStringUtils.toFTLTopLevelIdentifierReference(paramName));
 
-            Expression paramDefaultExp = (Expression) paramNamesWithDefault.get(paramName);
+            Expression paramDefaultExp = paramNamesWithDefault.get(paramName);
             if (paramDefaultExp != null) {
                 sb.append('=');
                 if (function) {
@@ -399,6 +399,7 @@
             } // if (argsSpecVarDraft != null)
         }
 
+        @Override
         public TemplateModel getLocalVariable(String name) throws TemplateModelException {
              return localVars.get(name);
         }
@@ -414,6 +415,7 @@
             localVars.put(name, var);
         }
 
+        @Override
         public Collection getLocalVariableNames() throws TemplateModelException {
             HashSet result = new HashSet();
             for (TemplateModelIterator it = localVars.keys().iterator(); it.hasNext(); ) {
diff --git a/src/main/java/freemarker/core/MiscUtil.java b/src/main/java/freemarker/core/MiscUtil.java
index 505edb4..b6a2677 100644
--- a/src/main/java/freemarker/core/MiscUtil.java
+++ b/src/main/java/freemarker/core/MiscUtil.java
@@ -43,6 +43,7 @@
         ArrayList res = new ArrayList(map.entrySet());
         Collections.sort(res, 
                 new Comparator() {  // for sorting to source code order
+                    @Override
                     public int compare(Object o1, Object o2) {
                         Map.Entry ent1 = (Map.Entry) o1;
                         Expression exp1 = (Expression) ent1.getValue();
diff --git a/src/main/java/freemarker/core/NewBI.java b/src/main/java/freemarker/core/NewBI.java
index 5d86a85..fa76168 100644
--- a/src/main/java/freemarker/core/NewBI.java
+++ b/src/main/java/freemarker/core/NewBI.java
@@ -73,6 +73,7 @@
             }
         }
 
+        @Override
         public Object exec(List arguments) throws TemplateModelException {
             ObjectWrapper ow = env.getObjectWrapper();
             BeansWrapper bw = 
diff --git a/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java b/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
index b03d8f4..3808cff 100644
--- a/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
+++ b/src/main/java/freemarker/core/NonListableRightUnboundedRangeModel.java
@@ -32,6 +32,7 @@
         super(begin);
     }
 
+    @Override
     public int size() throws TemplateModelException {
         return 0;
     }
diff --git a/src/main/java/freemarker/core/NumberLiteral.java b/src/main/java/freemarker/core/NumberLiteral.java
index b2a58d0..2be737f 100644
--- a/src/main/java/freemarker/core/NumberLiteral.java
+++ b/src/main/java/freemarker/core/NumberLiteral.java
@@ -46,6 +46,7 @@
         return env.formatNumberToPlainText(this, this, false);
     }
 
+    @Override
     public Number getAsNumber() {
         return value;
     }
diff --git a/src/main/java/freemarker/core/OptInTemplateClassResolver.java b/src/main/java/freemarker/core/OptInTemplateClassResolver.java
index 94dd4e9..b0e606a 100644
--- a/src/main/java/freemarker/core/OptInTemplateClassResolver.java
+++ b/src/main/java/freemarker/core/OptInTemplateClassResolver.java
@@ -88,6 +88,7 @@
         }
     }
 
+    @Override
     public Class resolve(String className, Environment env, Template template)
     throws TemplateException {
         String templateName = safeGetTemplateName(template);
diff --git a/src/main/java/freemarker/core/ParseException.java b/src/main/java/freemarker/core/ParseException.java
index 985c783..4307508 100644
--- a/src/main/java/freemarker/core/ParseException.java
+++ b/src/main/java/freemarker/core/ParseException.java
@@ -131,7 +131,7 @@
      */
     @Deprecated
     public ParseException(String description, int lineNumber, int columnNumber) {
-        this(description, (Template) null, lineNumber, columnNumber, null);
+        this(description, null, lineNumber, columnNumber, null);
     }
 
     /**
diff --git a/src/main/java/freemarker/core/Range.java b/src/main/java/freemarker/core/Range.java
index 5dec1a2..a141c7c 100644
--- a/src/main/java/freemarker/core/Range.java
+++ b/src/main/java/freemarker/core/Range.java
@@ -57,8 +57,8 @@
                     endType == END_INCLUSIVE, endType == END_SIZE_LIMITED); 
         } else {
             return _TemplateAPI.getTemplateLanguageVersionAsInt(this) >= _TemplateAPI.VERSION_INT_2_3_21
-                    ? (RangeModel) new ListableRightUnboundedRangeModel(begin)
-                    : (RangeModel) new NonListableRightUnboundedRangeModel(begin);
+                    ? new ListableRightUnboundedRangeModel(begin)
+                    : new NonListableRightUnboundedRangeModel(begin);
         }
     }
     
diff --git a/src/main/java/freemarker/core/RangeModel.java b/src/main/java/freemarker/core/RangeModel.java
index e4f55a2..d7cdeec 100644
--- a/src/main/java/freemarker/core/RangeModel.java
+++ b/src/main/java/freemarker/core/RangeModel.java
@@ -36,6 +36,7 @@
         return begin;
     }
     
+    @Override
     final public TemplateModel get(int index) throws TemplateModelException {
         if (index < 0 || index >= size()) {
             throw new _TemplateModelException("Range item index ", Integer.valueOf(index), " is out of bounds.");
diff --git a/src/main/java/freemarker/core/SequenceIterator.java b/src/main/java/freemarker/core/SequenceIterator.java
index 3c8e84a..02bd0bd 100644
--- a/src/main/java/freemarker/core/SequenceIterator.java
+++ b/src/main/java/freemarker/core/SequenceIterator.java
@@ -34,10 +34,12 @@
         this.size = sequence.size();
 
     }
+    @Override
     public TemplateModel next() throws TemplateModelException {
         return sequence.get(index++);
     }
 
+    @Override
     public boolean hasNext() {
         return index < size;
     }
diff --git a/src/main/java/freemarker/core/SingleIterationCollectionModel.java b/src/main/java/freemarker/core/SingleIterationCollectionModel.java
index f8e8471..fcde865 100644
--- a/src/main/java/freemarker/core/SingleIterationCollectionModel.java
+++ b/src/main/java/freemarker/core/SingleIterationCollectionModel.java
@@ -39,6 +39,7 @@
         this.iterator = iterator;
     }
 
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         if (iterator == null) {
             throw new IllegalStateException(
diff --git a/src/main/java/freemarker/core/StringArraySequence.java b/src/main/java/freemarker/core/StringArraySequence.java
index 740172d..7bc1d5b 100644
--- a/src/main/java/freemarker/core/StringArraySequence.java
+++ b/src/main/java/freemarker/core/StringArraySequence.java
@@ -40,6 +40,7 @@
         this.stringArray = stringArray;
     }
 
+    @Override
     public TemplateModel get(int index) {
         if (array == null) {
             array = new TemplateScalarModel[stringArray.length];
@@ -52,6 +53,7 @@
         return result;
     }
 
+    @Override
     public int size() {
         return stringArray.length;
     }
diff --git a/src/main/java/freemarker/core/StringLiteral.java b/src/main/java/freemarker/core/StringLiteral.java
index c116498..87507ec 100644
--- a/src/main/java/freemarker/core/StringLiteral.java
+++ b/src/main/java/freemarker/core/StringLiteral.java
@@ -133,6 +133,7 @@
         }
     }
 
+    @Override
     public String getAsString() {
         return value;
     }
diff --git a/src/main/java/freemarker/core/TemplateClassResolver.java b/src/main/java/freemarker/core/TemplateClassResolver.java
index 67c5720..c8a6b48 100644
--- a/src/main/java/freemarker/core/TemplateClassResolver.java
+++ b/src/main/java/freemarker/core/TemplateClassResolver.java
@@ -44,6 +44,7 @@
      */
     TemplateClassResolver UNRESTRICTED_RESOLVER = new TemplateClassResolver() {
 
+        @Override
         public Class resolve(String className, Environment env, Template template)
         throws TemplateException {
             try {
@@ -61,6 +62,7 @@
      */
     TemplateClassResolver SAFER_RESOLVER =  new TemplateClassResolver() {
 
+        @Override
         public Class resolve(String className, Environment env, Template template)
         throws TemplateException {
             if (className.equals(ObjectConstructor.class.getName())
@@ -82,6 +84,7 @@
      */
     TemplateClassResolver ALLOWS_NOTHING_RESOLVER =  new TemplateClassResolver() {
 
+        @Override
         public Class resolve(String className, Environment env, Template template)
         throws TemplateException {
             throw _MessageUtil.newInstantiatingClassNotAllowedException(className, env);
diff --git a/src/main/java/freemarker/core/TemplateConfiguration.java b/src/main/java/freemarker/core/TemplateConfiguration.java
index 4fb907b..92cc671 100644
--- a/src/main/java/freemarker/core/TemplateConfiguration.java
+++ b/src/main/java/freemarker/core/TemplateConfiguration.java
@@ -411,6 +411,7 @@
     /**
      * The getter pair of {@link #setTagSyntax(int)}.
      */
+    @Override
     public int getTagSyntax() {
         return tagSyntax != null ? tagSyntax.intValue() : getNonNullParentConfiguration().getTagSyntax();
     }
@@ -433,6 +434,7 @@
     /**
      * The getter pair of {@link #setInterpolationSyntax(int)}.
      */
+    @Override
     public int getInterpolationSyntax() {
         return interpolationSyntax != null ? interpolationSyntax.intValue()
                 : getNonNullParentConfiguration().getInterpolationSyntax();
@@ -456,6 +458,7 @@
     /**
      * The getter pair of {@link #setNamingConvention(int)}.
      */
+    @Override
     public int getNamingConvention() {
         return namingConvention != null ? namingConvention.intValue()
                 : getNonNullParentConfiguration().getNamingConvention();
@@ -478,6 +481,7 @@
     /**
      * The getter pair of {@link #getWhitespaceStripping()}.
      */
+    @Override
     public boolean getWhitespaceStripping() {
         return whitespaceStripping != null ? whitespaceStripping.booleanValue()
                 : getNonNullParentConfiguration().getWhitespaceStripping();
@@ -501,6 +505,7 @@
     /**
      * The getter pair of {@link #setAutoEscapingPolicy(int)}.
      */
+    @Override
     public int getAutoEscapingPolicy() {
         return autoEscapingPolicy != null ? autoEscapingPolicy.intValue()
                 : getNonNullParentConfiguration().getAutoEscapingPolicy();
@@ -524,6 +529,7 @@
     /**
      * The getter pair of {@link #setOutputFormat(OutputFormat)}.
      */
+    @Override
     public OutputFormat getOutputFormat() {
         return outputFormat != null ? outputFormat : getNonNullParentConfiguration().getOutputFormat();
     }
@@ -545,6 +551,7 @@
     /**
      * Getter pair of {@link #setRecognizeStandardFileExtensions(boolean)}.
      */
+    @Override
     public boolean getRecognizeStandardFileExtensions() {
         return recognizeStandardFileExtensions != null ? recognizeStandardFileExtensions.booleanValue()
                 : getNonNullParentConfiguration().getRecognizeStandardFileExtensions();
@@ -567,6 +574,7 @@
     /**
      * The getter pair of {@link #setStrictSyntaxMode(boolean)}.
      */
+    @Override
     public boolean getStrictSyntaxMode() {
         return strictSyntaxMode != null ? strictSyntaxMode.booleanValue()
                 : getNonNullParentConfiguration().getStrictSyntaxMode();
@@ -625,6 +633,7 @@
      * 
      * @since 2.3.25
      */
+    @Override
     public int getTabSize() {
         return tabSize != null ? tabSize.intValue()
                 : getNonNullParentConfiguration().getTabSize();
@@ -646,6 +655,7 @@
      * @throws IllegalStateException
      *             If the parent configuration wasn't yet set.
      */
+    @Override
     public Version getIncompatibleImprovements() {
         return getNonNullParentConfiguration().getIncompatibleImprovements();
     }
@@ -709,7 +719,7 @@
         if (list1.isEmpty()) return list2;
         if (list2.isEmpty()) return list1;
         
-        ArrayList<String> mergedList = new ArrayList<String>(list1.size() + list2.size());
+        ArrayList<String> mergedList = new ArrayList<>(list1.size() + list2.size());
         mergedList.addAll(list1);
         mergedList.addAll(list2);
         return mergedList;
diff --git a/src/main/java/freemarker/core/UnexpectedTypeException.java b/src/main/java/freemarker/core/UnexpectedTypeException.java
index 6caf9ce..d99ed2b 100644
--- a/src/main/java/freemarker/core/UnexpectedTypeException.java
+++ b/src/main/java/freemarker/core/UnexpectedTypeException.java
@@ -110,7 +110,7 @@
         return new Object[] {
                 "Expected ", new _DelayedAOrAn(expectedTypesDesc), ", but ",
                 (blamedAssignmentTargetVarName == null
-                        ? (Object) (blamed != null ? "this" : "the expression")
+                        ? blamed != null ? "this" : "the expression"
                         : new Object[] {
                                 "assignment target variable ",
                                 new _DelayedJQuote(blamedAssignmentTargetVarName) }), 
diff --git a/src/main/java/freemarker/core/UnifiedCall.java b/src/main/java/freemarker/core/UnifiedCall.java
index ebed306..5f2d0ba 100644
--- a/src/main/java/freemarker/core/UnifiedCall.java
+++ b/src/main/java/freemarker/core/UnifiedCall.java
@@ -121,7 +121,7 @@
         boolean nameIsInParen = sb.charAt(sb.length() - 1) == ')';
         if (positionalArgs != null) {
             for (int i = 0; i < positionalArgs.size(); i++) {
-                Expression argExp = (Expression) positionalArgs.get(i);
+                Expression argExp = positionalArgs.get(i);
                 if (i != 0) {
                     sb.append(',');
                 }
@@ -145,7 +145,7 @@
                 if (i != 0) {
                     sb.append(", ");
                 }
-                sb.append(_CoreStringUtils.toFTLTopLevelIdentifierReference((String) bodyParameterNames.get(i)));
+                sb.append(_CoreStringUtils.toFTLTopLevelIdentifierReference(bodyParameterNames.get(i)));
             }
         }
         if (canonical) {
@@ -250,6 +250,7 @@
         return res;
     }
 
+    @Override
     @SuppressFBWarnings(value={ "IS2_INCONSISTENT_SYNC", "DC_DOUBLECHECK" }, justification="Performance tricks")
     public Object getOrCreateCustomData(Object providerIdentity, ObjectFactory objectFactory)
             throws CallPlaceCustomDataInitializationException {
@@ -299,6 +300,7 @@
         return customDataHolder;
     }
 
+    @Override
     public boolean isNestedOutputCacheable() {
         return isChildrenOutputCacheable();
     }
diff --git a/src/main/java/freemarker/core/_ArrayEnumeration.java b/src/main/java/freemarker/core/_ArrayEnumeration.java
index 6bb57ba..70d7983 100644
--- a/src/main/java/freemarker/core/_ArrayEnumeration.java
+++ b/src/main/java/freemarker/core/_ArrayEnumeration.java
@@ -35,10 +35,12 @@
         this.nextIndex = 0;
     }
 
+    @Override
     public boolean hasMoreElements() {
         return nextIndex < size;
     }
 
+    @Override
     public Object nextElement() {
         if (nextIndex >= size) {
             throw new NoSuchElementException();
diff --git a/src/main/java/freemarker/core/_ArrayIterator.java b/src/main/java/freemarker/core/_ArrayIterator.java
index 4e5a4f6..f7cca25 100644
--- a/src/main/java/freemarker/core/_ArrayIterator.java
+++ b/src/main/java/freemarker/core/_ArrayIterator.java
@@ -33,10 +33,12 @@
         this.nextIndex = 0;
     }
 
+    @Override
     public boolean hasNext() {
         return nextIndex < array.length;
     }
 
+    @Override
     public Object next() {
         if (nextIndex >= array.length) {
             throw new NoSuchElementException();
@@ -44,6 +46,7 @@
         return array[nextIndex++];
     }
 
+    @Override
     public void remove() {
         throw new UnsupportedOperationException();
     }
diff --git a/src/main/java/freemarker/core/_Java8Impl.java b/src/main/java/freemarker/core/_Java8Impl.java
index fa8b528..a25e0f3 100644
--- a/src/main/java/freemarker/core/_Java8Impl.java
+++ b/src/main/java/freemarker/core/_Java8Impl.java
@@ -34,6 +34,7 @@
         // Not meant to be instantiated
     }    
 
+    @Override
     public boolean isDefaultMethod(Method method) {
         return method.isDefault();
     }
diff --git a/src/main/java/freemarker/core/_MessageUtil.java b/src/main/java/freemarker/core/_MessageUtil.java
index 13f3d00..081835c 100644
--- a/src/main/java/freemarker/core/_MessageUtil.java
+++ b/src/main/java/freemarker/core/_MessageUtil.java
@@ -318,8 +318,8 @@
                 e.getMessage())
                 .blame(dataSrcExp); 
         return useTempModelExc
-                ? new _TemplateModelException(e, (Environment) null, desc)
-                : new _MiscTemplateException(e, (Environment) null, desc);
+                ? new _TemplateModelException(e, null, desc)
+                : new _MiscTemplateException(e, null, desc);
     }
     
     public static TemplateException newCantFormatNumberException(TemplateNumberFormat format, Expression dataSrcExp,
@@ -329,8 +329,8 @@
                 e.getMessage())
                 .blame(dataSrcExp); 
         return useTempModelExc
-                ? new _TemplateModelException(e, (Environment) null, desc)
-                : new _MiscTemplateException(e, (Environment) null, desc);
+                ? new _TemplateModelException(e, null, desc)
+                : new _MiscTemplateException(e, null, desc);
     }
 
     public static TemplateModelException newKeyValuePairListingNonStringKeyExceptionMessage(
diff --git a/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java b/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
index 72152ce..82d20a0 100644
--- a/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
+++ b/src/main/java/freemarker/core/_ParserConfigurationWithInheritedFormat.java
@@ -36,46 +36,57 @@
         this.wrappedPCfg = wrappedPCfg;
     }
 
+    @Override
     public boolean getWhitespaceStripping() {
         return wrappedPCfg.getWhitespaceStripping();
     }
 
+    @Override
     public int getTagSyntax() {
         return wrappedPCfg.getTagSyntax();
     }
 
+    @Override
     public int getInterpolationSyntax() {
         return wrappedPCfg.getInterpolationSyntax();
     }
 
+    @Override
     public boolean getStrictSyntaxMode() {
         return wrappedPCfg.getStrictSyntaxMode();
     }
 
+    @Override
     public OutputFormat getOutputFormat() {
         return outputFormat != null ? outputFormat : wrappedPCfg.getOutputFormat();
     }
 
+    @Override
     public boolean getRecognizeStandardFileExtensions() {
         return false;
     }
 
+    @Override
     public int getNamingConvention() {
         return wrappedPCfg.getNamingConvention();
     }
 
+    @Override
     public Version getIncompatibleImprovements() {
         return wrappedPCfg.getIncompatibleImprovements();
     }
 
+    @Override
     public int getAutoEscapingPolicy() {
         return autoEscapingPolicy != null ? autoEscapingPolicy.intValue() : wrappedPCfg.getAutoEscapingPolicy();
     }
 
+    @Override
     public ArithmeticEngine getArithmeticEngine() {
         return wrappedPCfg.getArithmeticEngine();
     }
 
+    @Override
     public int getTabSize() {
         return wrappedPCfg.getTabSize();
     }
diff --git a/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java b/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
index da98830..e3b82ab 100644
--- a/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
+++ b/src/main/java/freemarker/core/_UnmodifiableCompositeSet.java
@@ -52,6 +52,7 @@
         private Iterator<E> it1, it2;
         private boolean it1Deplected;
         
+        @Override
         public boolean hasNext() {
             if (!it1Deplected) {
                 if (it1 == null) {
@@ -69,6 +70,7 @@
             return it2.hasNext();
         }
 
+        @Override
         public E next() {
             if (!it1Deplected) {
                 if (it1 == null) {
@@ -86,6 +88,7 @@
             return it2.next();
         }
 
+        @Override
         public void remove() {
             throw new UnsupportedOperationException();
         }
diff --git a/src/main/java/freemarker/debug/Breakpoint.java b/src/main/java/freemarker/debug/Breakpoint.java
index 8766500..f572d89 100644
--- a/src/main/java/freemarker/debug/Breakpoint.java
+++ b/src/main/java/freemarker/debug/Breakpoint.java
@@ -67,6 +67,7 @@
         return false;
     }
     
+    @Override
     public int compareTo(Object o) {
         Breakpoint b = (Breakpoint) o;
         int r = templateName.compareTo(b.templateName);
diff --git a/src/main/java/freemarker/debug/DebuggerClient.java b/src/main/java/freemarker/debug/DebuggerClient.java
index 1433881..86c5954 100644
--- a/src/main/java/freemarker/debug/DebuggerClient.java
+++ b/src/main/java/freemarker/debug/DebuggerClient.java
@@ -60,15 +60,14 @@
     public static Debugger getDebugger(InetAddress host, int port, String password)
     throws IOException {
         try {
-            Socket s = new Socket(host, port);
-            try {
+            try (Socket s = new Socket(host, port)) {
                 ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
                 ObjectInputStream in = new ObjectInputStream(s.getInputStream());
                 int protocolVersion = in.readInt();
                 if (protocolVersion > 220) {
                     throw new IOException(
-                        "Incompatible protocol version " + protocolVersion + 
-                        ". At most 220 was expected.");
+                            "Incompatible protocol version " + protocolVersion +
+                                    ". At most 220 was expected.");
                 }
                 byte[] challenge = (byte[]) in.readObject();
                 MessageDigest md = MessageDigest.getInstance("SHA");
@@ -77,8 +76,6 @@
                 out.writeObject(md.digest());
                 return new LocalDebuggerProxy((Debugger) in.readObject());
                 //return (Debugger)in.readObject();
-            } finally {
-                s.close();
             }
         } catch (IOException e) {
             throw e;
@@ -94,11 +91,13 @@
             this.remoteDebugger = remoteDebugger;
         }
 
+        @Override
         public void addBreakpoint(Breakpoint breakpoint) throws RemoteException {
             remoteDebugger.addBreakpoint(breakpoint);
         }
 
-        public Object addDebuggerListener(DebuggerListener listener) 
+        @Override
+        public Object addDebuggerListener(DebuggerListener listener)
         throws RemoteException {
             if (listener instanceof RemoteObject) {
                 return remoteDebugger.addDebuggerListener(listener);
@@ -109,30 +108,37 @@
             }
         }
 
+        @Override
         public List getBreakpoints() throws RemoteException {
             return remoteDebugger.getBreakpoints();
         }
 
+        @Override
         public List getBreakpoints(String templateName) throws RemoteException {
             return remoteDebugger.getBreakpoints(templateName);
         }
 
+        @Override
         public Collection getSuspendedEnvironments() throws RemoteException {
             return remoteDebugger.getSuspendedEnvironments();
         }
 
+        @Override
         public void removeBreakpoint(Breakpoint breakpoint) throws RemoteException {
             remoteDebugger.removeBreakpoint(breakpoint);
         }
 
+        @Override
         public void removeBreakpoints(String templateName) throws RemoteException {
             remoteDebugger.removeBreakpoints(templateName);
         }
 
+        @Override
         public void removeBreakpoints() throws RemoteException {
             remoteDebugger.removeBreakpoints();
         }
 
+        @Override
         public void removeDebuggerListener(Object id) throws RemoteException {
             remoteDebugger.removeDebuggerListener(id);
         }
diff --git a/src/main/java/freemarker/debug/impl/DebuggerServer.java b/src/main/java/freemarker/debug/impl/DebuggerServer.java
index c98715a..24fef1d 100644
--- a/src/main/java/freemarker/debug/impl/DebuggerServer.java
+++ b/src/main/java/freemarker/debug/impl/DebuggerServer.java
@@ -62,6 +62,7 @@
     public void start() {
         new Thread(new Runnable()
         {
+            @Override
             public void run() {
                 startInternal();
             }
@@ -87,6 +88,7 @@
             this.s = s;
         }
         
+        @Override
         public void run() {
             try {
                 ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream());
diff --git a/src/main/java/freemarker/debug/impl/DebuggerService.java b/src/main/java/freemarker/debug/impl/DebuggerService.java
index 5ba0c40..75a09aa 100644
--- a/src/main/java/freemarker/debug/impl/DebuggerService.java
+++ b/src/main/java/freemarker/debug/impl/DebuggerService.java
@@ -41,8 +41,8 @@
         // RMI service.
         return 
             SecurityUtilities.getSystemProperty("freemarker.debug.password", null) == null
-            ? (DebuggerService) new NoOpDebuggerService()
-            : (DebuggerService) new RmiDebuggerService();
+            ? new NoOpDebuggerService()
+            : new RmiDebuggerService();
     }
 
     public static List getBreakpoints(String templateName) {
diff --git a/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java b/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
index dd009b2..54dd7c8 100644
--- a/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
+++ b/src/main/java/freemarker/debug/impl/RmiDebugModelImpl.java
@@ -58,26 +58,32 @@
     private static DebugModel getDebugModel(TemplateModel tm) throws RemoteException {
         return (DebugModel) RmiDebuggedEnvironmentImpl.getCachedWrapperFor(tm);
     }
+    @Override
     public String getAsString() throws TemplateModelException {
         return ((TemplateScalarModel) model).getAsString();
     }
 
+    @Override
     public Number getAsNumber() throws TemplateModelException {
         return ((TemplateNumberModel) model).getAsNumber();
     }
 
+    @Override
     public Date getAsDate() throws TemplateModelException {
         return ((TemplateDateModel) model).getAsDate();
     }
 
+    @Override
     public int getDateType() {
         return ((TemplateDateModel) model).getDateType();
     }
 
+    @Override
     public boolean getAsBoolean() throws TemplateModelException {
         return ((TemplateBooleanModel) model).getAsBoolean();
     }
 
+    @Override
     public int size() throws TemplateModelException {
         if (model instanceof TemplateSequenceModel) {
             return ((TemplateSequenceModel) model).size();
@@ -85,10 +91,12 @@
         return ((TemplateHashModelEx) model).size();
     }
 
+    @Override
     public DebugModel get(int index) throws TemplateModelException, RemoteException {
         return getDebugModel(((TemplateSequenceModel) model).get(index));
     }
     
+    @Override
     public DebugModel[] get(int fromIndex, int toIndex) throws TemplateModelException, RemoteException {
         DebugModel[] dm = new DebugModel[toIndex - fromIndex];
         TemplateSequenceModel s = (TemplateSequenceModel) model;
@@ -98,6 +106,7 @@
         return dm;
     }
 
+    @Override
     public DebugModel[] getCollection() throws TemplateModelException, RemoteException {
         List list = new ArrayList();
         TemplateModelIterator i = ((TemplateCollectionModel) model).iterator();
@@ -107,10 +116,12 @@
         return (DebugModel[]) list.toArray(new DebugModel[list.size()]);
     }
     
+    @Override
     public DebugModel get(String key) throws TemplateModelException, RemoteException {
         return getDebugModel(((TemplateHashModel) model).get(key));
     }
     
+    @Override
     public DebugModel[] get(String[] keys) throws TemplateModelException, RemoteException {
         DebugModel[] dm = new DebugModel[keys.length];
         TemplateHashModel h = (TemplateHashModel) model;
@@ -120,6 +131,7 @@
         return dm;
     }
 
+    @Override
     public String[] keys() throws TemplateModelException {
         TemplateHashModelEx h = (TemplateHashModelEx) model;
         List list = new ArrayList();
@@ -130,6 +142,7 @@
         return (String[]) list.toArray(new String[list.size()]);
     }
 
+    @Override
     public int getModelTypes() {
         return type;
     }
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java b/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
index d80bedf..8719fcb 100644
--- a/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
+++ b/src/main/java/freemarker/debug/impl/RmiDebuggedEnvironmentImpl.java
@@ -106,6 +106,7 @@
     }
 
     // TODO See in SuppressFBWarnings
+    @Override
     @SuppressFBWarnings(value="NN_NAKED_NOTIFY", justification="Will have to be re-desigend; postponed.")
     public void resume() {
         synchronized (this) {
@@ -113,11 +114,13 @@
         }
     }
 
+    @Override
     public void stop() {
         stopped = true;
         resume();
     }
 
+    @Override
     public long getId() {
         return id;
     }
@@ -127,14 +130,17 @@
     }
     
     private abstract static class DebugMapModel implements TemplateHashModelEx {
+        @Override
         public int size() {
             return keySet().size();
         }
 
+        @Override
         public TemplateCollectionModel keys() {
             return new SimpleCollection(keySet());
         }
 
+        @Override
         public TemplateCollectionModel values() throws TemplateModelException {
             Collection keys = keySet();
             List list = new ArrayList(keys.size());
@@ -145,6 +151,7 @@
             return new SimpleCollection(list);
         }
 
+        @Override
         public boolean isEmpty() {
             return size() == 0;
         }
@@ -182,6 +189,7 @@
             return KEYS;
         }
         
+        @Override
         public TemplateModel get(String key) throws TemplateModelException {
             String s = configurable.getSetting(key);
             return s == null ? null : new SimpleScalar(s);
@@ -199,6 +207,7 @@
                 return ((Configuration) configurable).getSharedVariableNames();
             }
         
+            @Override
             public TemplateModel get(String key) {
                 return ((Configuration) configurable).getSharedVariable(key);
             }
@@ -280,6 +289,7 @@
                 }
             }
         
+            @Override
             public TemplateModel get(String key) throws TemplateModelException {
                 return ((Environment) configurable).getVariable(key);
             }
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java b/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
index 48d9848..db14ada 100644
--- a/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
+++ b/src/main/java/freemarker/debug/impl/RmiDebuggerImpl.java
@@ -43,38 +43,47 @@
         this.service = service;
     }
 
+    @Override
     public void addBreakpoint(Breakpoint breakpoint) {
         service.addBreakpoint(breakpoint);
     }
 
+    @Override
     public Object addDebuggerListener(DebuggerListener listener) {
         return service.addDebuggerListener(listener);
     }
 
+    @Override
     public List getBreakpoints() {
         return service.getBreakpointsSpi();
     }
 
+    @Override
     public List getBreakpoints(String templateName) {
         return service.getBreakpointsSpi(templateName);
     }
 
+    @Override
     public Collection getSuspendedEnvironments() {
         return service.getSuspendedEnvironments();
     }
 
+    @Override
     public void removeBreakpoint(Breakpoint breakpoint) {
         service.removeBreakpoint(breakpoint);
     }
 
+    @Override
     public void removeDebuggerListener(Object id) {
         service.removeDebuggerListener(id);
     }
 
+    @Override
     public void removeBreakpoints() {
         service.removeBreakpoints();
     }
 
+    @Override
     public void removeBreakpoints(String templateName) {
         service.removeBreakpoints(templateName);
     }
diff --git a/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java b/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
index eb3041e..a99a2a3 100644
--- a/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
+++ b/src/main/java/freemarker/debug/impl/RmiDebuggerListenerImpl.java
@@ -44,6 +44,7 @@
 
     private final DebuggerListener listener;
 
+    @Override
     public void unreferenced() {
         try {
             UnicastRemoteObject.unexportObject(this, false);
@@ -57,7 +58,8 @@
         this.listener = listener;
     }
 
-    public void environmentSuspended(EnvironmentSuspendedEvent e) 
+    @Override
+    public void environmentSuspended(EnvironmentSuspendedEvent e)
     throws RemoteException {
         listener.environmentSuspended(e);
     }
diff --git a/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java b/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
index c8943e5..58c5cb7 100644
--- a/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
+++ b/src/main/java/freemarker/ext/ant/FreemarkerXmlTask.java
@@ -507,8 +507,8 @@
 
                 // Process the template and write out
                 // the result as the outFile.
-                Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), encoding));
-                try {
+                try (Writer writer = new BufferedWriter(
+                        new OutputStreamWriter(new FileOutputStream(outFile), encoding))) {
                     if (parsedTemplate == null) {
                         throw new BuildException("No template file specified in build script or in XML file");
                     }
@@ -534,8 +534,6 @@
                     }
                     env.process();
                     writer.flush();
-                } finally {
-                    writer.close();
                 }
 
                 log("Output: " + outFile, Project.MSG_INFO );
diff --git a/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java b/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
index 71a9a48..21584a0 100644
--- a/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
+++ b/src/main/java/freemarker/ext/ant/UnlinkedJythonOperationsImpl.java
@@ -32,11 +32,13 @@
  */
 public class UnlinkedJythonOperationsImpl implements UnlinkedJythonOperations {
     
+    @Override
     public void execute(String script, Map vars) throws BuildException {
         PythonInterpreter pi = createInterpreter(vars);
         pi.exec(script);
     }
 
+    @Override
     public void execute(File file, Map vars) throws BuildException {
         PythonInterpreter pi = createInterpreter(vars);
         try {
diff --git a/src/main/java/freemarker/ext/beans/ArgumentTypes.java b/src/main/java/freemarker/ext/beans/ArgumentTypes.java
index 506f4d0..2bba006 100644
--- a/src/main/java/freemarker/ext/beans/ArgumentTypes.java
+++ b/src/main/java/freemarker/ext/beans/ArgumentTypes.java
@@ -118,7 +118,7 @@
             return applicables.getFirst();
         }
         
-        LinkedList<CallableMemberDescriptor> maximals = new LinkedList<CallableMemberDescriptor>();
+        LinkedList<CallableMemberDescriptor> maximals = new LinkedList<>();
         for (CallableMemberDescriptor applicable : applicables) {
             boolean lessSpecific = false;
             for (Iterator<CallableMemberDescriptor> maximalsIter = maximals.iterator(); 
@@ -453,7 +453,7 @@
      */
     LinkedList<CallableMemberDescriptor> getApplicables(
             List<ReflectionCallableMemberDescriptor> memberDescs, boolean varArg) {
-        LinkedList<CallableMemberDescriptor> applicables = new LinkedList<CallableMemberDescriptor>();
+        LinkedList<CallableMemberDescriptor> applicables = new LinkedList<>();
         for (ReflectionCallableMemberDescriptor memberDesc : memberDescs) {
             int difficulty = isApplicable(memberDesc, varArg);
             if (difficulty != CONVERSION_DIFFICULTY_IMPOSSIBLE) {
diff --git a/src/main/java/freemarker/ext/beans/ArrayModel.java b/src/main/java/freemarker/ext/beans/ArrayModel.java
index fc92e22..22ea149 100644
--- a/src/main/java/freemarker/ext/beans/ArrayModel.java
+++ b/src/main/java/freemarker/ext/beans/ArrayModel.java
@@ -43,6 +43,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new ArrayModel(object, (BeansWrapper) wrapper);
             }
@@ -69,10 +70,12 @@
     }
 
 
+    @Override
     public TemplateModelIterator iterator() {
         return new Iterator();
     }
 
+    @Override
     public TemplateModel get(int index)
     throws TemplateModelException {
         try {
@@ -89,20 +92,24 @@
         TemplateModelIterator {
         private int position = 0;
 
+        @Override
         public boolean hasNext() {
             return position < length;
         }
 
+        @Override
         public TemplateModel get(int index)
         throws TemplateModelException {
             return ArrayModel.this.get(index);
         }
 
+        @Override
         public TemplateModel next()
         throws TemplateModelException {
             return position < length ? get(position++) : null;
         }
 
+        @Override
         public int size() {
             return ArrayModel.this.size();
         }
diff --git a/src/main/java/freemarker/ext/beans/BeanModel.java b/src/main/java/freemarker/ext/beans/BeanModel.java
index a6c5e4a..e7d0baa 100644
--- a/src/main/java/freemarker/ext/beans/BeanModel.java
+++ b/src/main/java/freemarker/ext/beans/BeanModel.java
@@ -72,6 +72,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new BeanModel(object, (BeansWrapper) wrapper);
             }
@@ -137,6 +138,7 @@
      * @throws TemplateModelException if there was no property nor method nor
      * a generic <tt>get</tt> method to invoke.
      */
+    @Override
     public TemplateModel get(String key)
         throws TemplateModelException {
         Class<?> clazz = object.getClass();
@@ -247,7 +249,7 @@
         if (cachedModel != null) {
             synchronized (this) {
                 if (memberCache == null) {
-                    memberCache = new HashMap<Object, TemplateModel>();
+                    memberCache = new HashMap<>();
                 }
                 memberCache.put(desc, cachedModel);
             }
@@ -286,6 +288,7 @@
      * Tells whether the model is empty. It is empty if either the wrapped 
      * object is null, or it's a Boolean with false value.
      */
+    @Override
     public boolean isEmpty() {
         if (object instanceof String) {
             return ((String) object).length() == 0;
@@ -306,24 +309,29 @@
      * Returns the same as {@link #getWrappedObject()}; to ensure that, this method will be final starting from 2.4.
      * This behavior of {@link BeanModel} is assumed by some FreeMarker code. 
      */
+    @Override
     public Object getAdaptedObject(Class<?> hint) {
         return object;  // return getWrappedObject(); starting from 2.4
     }
 
+    @Override
     public Object getWrappedObject() {
         return object;
     }
     
+    @Override
     public int size() {
         return wrapper.getClassIntrospector().keyCount(object.getClass());
     }
 
+    @Override
     public TemplateCollectionModel keys() {
         return new CollectionAndSequence(new SimpleSequence(keySet(), wrapper));
     }
 
+    @Override
     public TemplateCollectionModel values() throws TemplateModelException {
-        List<Object> values = new ArrayList<Object>(size());
+        List<Object> values = new ArrayList<>(size());
         TemplateModelIterator it = keys().iterator();
         while (it.hasNext()) {
             String key = ((TemplateScalarModel) it.next()).getAsString();
@@ -363,6 +371,7 @@
         return wrapper.getClassIntrospector().keySet(object.getClass());
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return wrapper.wrapAsAPI(object);
     }
diff --git a/src/main/java/freemarker/ext/beans/BeansModelCache.java b/src/main/java/freemarker/ext/beans/BeansModelCache.java
index 8d6cae5..99374b6 100644
--- a/src/main/java/freemarker/ext/beans/BeansModelCache.java
+++ b/src/main/java/freemarker/ext/beans/BeansModelCache.java
@@ -30,8 +30,8 @@
 import freemarker.template.TemplateModel;
 
 public class BeansModelCache extends ModelCache {
-    private final Map<Class<?>, ModelFactory> classToFactory = new ConcurrentHashMap<Class<?>, ModelFactory>();
-    private final Set<String> mappedClassNames = new HashSet<String>();
+    private final Map<Class<?>, ModelFactory> classToFactory = new ConcurrentHashMap<>();
+    private final Set<String> mappedClassNames = new HashSet<>();
 
     private final BeansWrapper wrapper;
     
@@ -54,7 +54,7 @@
         if (factory == null) {
             // Synchronized so that we won't unnecessarily create the same factory for multiple times in parallel.
             synchronized (classToFactory) {
-                factory = (ModelFactory) classToFactory.get(clazz);
+                factory = classToFactory.get(clazz);
                 if (factory == null) {
                     String className = clazz.getName();
                     // clear mappings when class reloading is detected
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapper.java b/src/main/java/freemarker/ext/beans/BeansWrapper.java
index 8190715..c321558 100644
--- a/src/main/java/freemarker/ext/beans/BeansWrapper.java
+++ b/src/main/java/freemarker/ext/beans/BeansWrapper.java
@@ -330,6 +330,7 @@
                 bwConf = (BeansWrapperConfiguration) bwConf.clone(false);
                 bwConf.setMethodAppearanceFineTuner(new MethodAppearanceFineTuner() {
 
+                    @Override
                     public void process(
                             MethodAppearanceDecisionInput in, MethodAppearanceDecision out) {
                         BeansWrapper.this.finetuneMethodAppearance(in.getContainingClass(), in.getMethod(), out);
@@ -403,6 +404,7 @@
      * 
      * @since 2.3.21
      */
+    @Override
     public void writeProtect() {
         writeProtected = true;
     }
@@ -410,6 +412,7 @@
     /**
      * @since 2.3.21
      */
+    @Override
     public boolean isWriteProtected() {
         return writeProtected;
     }
@@ -929,6 +932,7 @@
      * <li>otherwise, returns a generic {@link StringModel} for it.
      * </ul>
      */
+    @Override
     public TemplateModel wrap(Object object) throws TemplateModelException {
         if (object == null) return nullModel;
         return modelCache.getInstance(object);
@@ -955,6 +959,7 @@
     /**
      * @since 2.3.22
      */
+    @Override
     public TemplateHashModel wrapAsAPI(Object obj) throws TemplateModelException {
         return new APIModel(obj, this);
     }
@@ -972,18 +977,21 @@
     }
 
     private final ModelFactory BOOLEAN_FACTORY = new ModelFactory() {
+        @Override
         public TemplateModel create(Object object, ObjectWrapper wrapper) {
             return ((Boolean) object).booleanValue() ? trueModel : falseModel; 
         }
     };
 
     private static final ModelFactory ITERATOR_FACTORY = new ModelFactory() {
+        @Override
         public TemplateModel create(Object object, ObjectWrapper wrapper) {
             return new IteratorModel((Iterator<?>) object, (BeansWrapper) wrapper); 
         }
     };
 
     private static final ModelFactory ENUMERATION_FACTORY = new ModelFactory() {
+        @Override
         public TemplateModel create(Object object, ObjectWrapper wrapper) {
             return new EnumerationModel((Enumeration<?>) object, (BeansWrapper) wrapper); 
         }
@@ -1033,6 +1041,7 @@
      * returned unchanged.
      * @throws TemplateModelException if an attempted unwrapping fails.
      */
+    @Override
     public Object unwrap(TemplateModel model) throws TemplateModelException {
         return unwrap(model, Object.class);
     }
@@ -1063,6 +1072,7 @@
     /**
      * @since 2.3.22
      */
+    @Override
     public Object tryUnwrapTo(TemplateModel model, Class<?> targetClass) throws TemplateModelException {
         return tryUnwrapTo(model, targetClass, 0);
     }
@@ -1326,7 +1336,7 @@
                 return retval;
             }
         } else {
-            recursionStops = new IdentityHashMap<Object, Object>();
+            recursionStops = new IdentityHashMap<>();
         }
         Class<?> componentType = arrayClass.getComponentType();
         final int size = seq.size();
@@ -1371,7 +1381,7 @@
                 return retval;
             }
         } else {
-            recursionStops = new IdentityHashMap<Object, Object>();
+            recursionStops = new IdentityHashMap<>();
         }
         Class<?> componentType = arrayClass.getComponentType();
         Object array = Array.newInstance(componentType, list.size());
diff --git a/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java b/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
index 6072a1e..b9a812e 100644
--- a/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
+++ b/src/main/java/freemarker/ext/beans/BeansWrapperBuilder.java
@@ -114,15 +114,15 @@
 public class BeansWrapperBuilder extends BeansWrapperConfiguration {
 
     private final static Map<ClassLoader, Map<BeansWrapperConfiguration, WeakReference<BeansWrapper>>>
-            INSTANCE_CACHE = new WeakHashMap<
-                    ClassLoader, Map<BeansWrapperConfiguration, WeakReference<BeansWrapper>>>();
-    private final static ReferenceQueue<BeansWrapper> INSTANCE_CACHE_REF_QUEUE = new ReferenceQueue<BeansWrapper>();
+            INSTANCE_CACHE = new WeakHashMap<>();
+    private final static ReferenceQueue<BeansWrapper> INSTANCE_CACHE_REF_QUEUE = new ReferenceQueue<>();
    
     private static class BeansWrapperFactory
             implements _BeansAPI._BeansWrapperSubclassFactory<BeansWrapper, BeansWrapperConfiguration> {
         
         private static final BeansWrapperFactory INSTANCE = new BeansWrapperFactory(); 
 
+        @Override
         public BeansWrapper create(BeansWrapperConfiguration bwConf) {
             return new BeansWrapper(bwConf, true);
         }
diff --git a/src/main/java/freemarker/ext/beans/BooleanModel.java b/src/main/java/freemarker/ext/beans/BooleanModel.java
index 016a221..2f43c97 100644
--- a/src/main/java/freemarker/ext/beans/BooleanModel.java
+++ b/src/main/java/freemarker/ext/beans/BooleanModel.java
@@ -33,6 +33,7 @@
         value = bool.booleanValue();
     }
 
+    @Override
     public boolean getAsBoolean() {
         return value;
     }
diff --git a/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java b/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
index fd836d4..be79db1 100644
--- a/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
+++ b/src/main/java/freemarker/ext/beans/ClassBasedModelFactory.java
@@ -37,13 +37,14 @@
 abstract class ClassBasedModelFactory implements TemplateHashModel {
     private final BeansWrapper wrapper;
     
-    private final Map<String,TemplateModel> cache = new ConcurrentHashMap<String,TemplateModel>();
-    private final Set<String> classIntrospectionsInProgress = new HashSet<String>();
+    private final Map<String,TemplateModel> cache = new ConcurrentHashMap<>();
+    private final Set<String> classIntrospectionsInProgress = new HashSet<>();
     
     protected ClassBasedModelFactory(BeansWrapper wrapper) {
         this.wrapper = wrapper;
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         try {
             return getInternal(key);
@@ -133,6 +134,7 @@
         }
     }
 
+    @Override
     public boolean isEmpty() {
         return false;
     }
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospector.java b/src/main/java/freemarker/ext/beans/ClassIntrospector.java
index e92226d..e0c5135 100644
--- a/src/main/java/freemarker/ext/beans/ClassIntrospector.java
+++ b/src/main/java/freemarker/ext/beans/ClassIntrospector.java
@@ -165,13 +165,13 @@
 
     private final Object sharedLock;
     private final Map<Class<?>, Map<Object, Object>> cache
-            = new ConcurrentHashMap<Class<?>, Map<Object, Object>>(0, 0.75f, 16);
-    private final Set<String> cacheClassNames = new HashSet<String>(0);
-    private final Set<Class<?>> classIntrospectionsInProgress = new HashSet<Class<?>>(0);
+            = new ConcurrentHashMap<>(0, 0.75f, 16);
+    private final Set<String> cacheClassNames = new HashSet<>(0);
+    private final Set<Class<?>> classIntrospectionsInProgress = new HashSet<>(0);
 
     private final List<WeakReference<Object/*ClassBasedModelFactory|ModelCache>*/>> modelFactories
-            = new LinkedList<WeakReference<Object>>();
-    private final ReferenceQueue<Object> modelFactoriesRefQueue = new ReferenceQueue<Object>();
+            = new LinkedList<>();
+    private final ReferenceQueue<Object> modelFactoriesRefQueue = new ReferenceQueue<>();
 
     private int clearingCounter;
 
@@ -275,7 +275,7 @@
      * Creates a {@link Map} with the content as described for the return value of {@link #get(Class)}.
      */
     private Map<Object, Object> createClassIntrospectionData(Class<?> clazz) {
-        final Map<Object, Object> introspData = new HashMap<Object, Object>();
+        final Map<Object, Object> introspData = new HashMap<>();
         MemberAccessPolicy effMemberAccessPolicy = getEffectiveMemberAccessPolicy();
         ClassMemberAccessPolicy effClassMemberAccessPolicy = effMemberAccessPolicy.forClass(clazz);
 
@@ -394,7 +394,7 @@
                                     method.getParameterTypes());
                             if (replaced != null) {
                                 if (argTypesUsedByIndexerPropReaders == null) {
-                                    argTypesUsedByIndexerPropReaders = new IdentityHashMap<Method, Void>();
+                                    argTypesUsedByIndexerPropReaders = new IdentityHashMap<>();
                                 }
                                 argTypesUsedByIndexerPropReaders.put(method, null);                                
                             }
@@ -444,7 +444,7 @@
                     if (propName != null) {
                         if (mergedPRMPs == null) {
                             // Lazy initialization
-                            mergedPRMPs = new LinkedHashMap<String, Object>();
+                            mergedPRMPs = new LinkedHashMap<>();
                         }
                         if (paramTypes.length == 0) {
                             mergeInPropertyReaderMethod(mergedPRMPs, propName, method);
@@ -467,7 +467,7 @@
         }
         
         // Now we convert the PRMPs to PDs, handling case where the normal and the indexed read methods contradict.
-        List<PropertyDescriptor> mergedPDs = new ArrayList<PropertyDescriptor>(mergedPRMPs.size());
+        List<PropertyDescriptor> mergedPDs = new ArrayList<>(mergedPRMPs.size());
         for (Entry<String, Object> entry : mergedPRMPs.entrySet()) {
             String propName = entry.getKey();
             Object propDescObj = entry.getValue();
@@ -616,11 +616,11 @@
         for (Method method : clazz.getMethods()) {
             if (_JavaVersions.JAVA_8.isDefaultMethod(method) && !method.isBridge()) {
                 if (defaultMethodsToAddByName == null) {
-                    defaultMethodsToAddByName = new HashMap<String, List<Method>>();
+                    defaultMethodsToAddByName = new HashMap<>();
                 }
                 List<Method> overloads = defaultMethodsToAddByName.get(method.getName());
                 if (overloads == null) {
-                    overloads = new ArrayList<Method>(0);
+                    overloads = new ArrayList<>(0);
                     defaultMethodsToAddByName.put(method.getName(), overloads);
                 }
                 overloads.add(method);
@@ -634,7 +634,7 @@
 
         // Recreate introspectionMDs so that its size can grow: 
         ArrayList<MethodDescriptor> newIntrospectionMDs
-                = new ArrayList<MethodDescriptor>(introspectionMDs.size() + 16);
+                = new ArrayList<>(introspectionMDs.size() + 16);
         for (MethodDescriptor introspectorMD : introspectionMDs) {
             Method introspectorM = introspectorMD.getMethod();
             // Prevent cases where the same method is added with different return types both from the list of default
@@ -731,7 +731,7 @@
             Class<?> clazz, ClassMemberAccessPolicy effClassMemberAccessPolicy) {
         try {
             Constructor<?>[] ctorsUnfiltered = clazz.getConstructors();
-            List<Constructor<?>> ctors = new ArrayList<Constructor<?>>(ctorsUnfiltered.length);
+            List<Constructor<?>> ctors = new ArrayList<>(ctorsUnfiltered.length);
             for (Constructor<?> ctor : ctorsUnfiltered) {
                 if (effClassMemberAccessPolicy.isConstructorExposed(ctor)) {
                     ctors.add(ctor);
@@ -763,7 +763,7 @@
      * superclasses and interfaces. Basically upcasts every method to the nearest accessible method.
      */
     private static Map<ExecutableMemberSignature, List<Method>> discoverAccessibleMethods(Class<?> clazz) {
-        Map<ExecutableMemberSignature, List<Method>> accessibles = new HashMap<ExecutableMemberSignature, List<Method>>();
+        Map<ExecutableMemberSignature, List<Method>> accessibles = new HashMap<>();
         discoverAccessibleMethods(clazz, accessibles);
         return accessibles;
     }
@@ -790,7 +790,7 @@
                     List<Method> methodList = accessibles.get(sig);
                     if (methodList == null) {
                      // TODO Collection.singletonList is more efficient, though read only.
-                        methodList = new LinkedList<Method>();
+                        methodList = new LinkedList<>();
                         accessibles.put(sig, methodList);
                     }
                     methodList.add(method);
@@ -867,7 +867,7 @@
         @SuppressWarnings("unchecked")
         Map<Method, Class<?>[]> argTypes = (Map<Method, Class<?>[]>) classInfo.get(ARG_TYPES_BY_METHOD_KEY);
         if (argTypes == null) {
-            argTypes = new HashMap<Method, Class<?>[]>();
+            argTypes = new HashMap<>();
             classInfo.put(ARG_TYPES_BY_METHOD_KEY, argTypes);
         }
         return argTypes;
@@ -978,7 +978,7 @@
     private void registerModelFactory(Object mf) {
         // Note that this `synchronized (sharedLock)` is also need for the BeansWrapper constructor to work safely.
         synchronized (sharedLock) {
-            modelFactories.add(new WeakReference<Object>(mf, modelFactoriesRefQueue));
+            modelFactories.add(new WeakReference<>(mf, modelFactoriesRefQueue));
             removeClearedModelFactoryReferences();
         }
     }
@@ -1044,7 +1044,7 @@
      * interface.
      */
     Set<Object> keySet(Class<?> clazz) {
-        Set<Object> set = new HashSet<Object>(get(clazz).keySet());
+        Set<Object> set = new HashSet<>(get(clazz).keySet());
         set.remove(CONSTRUCTORS_KEY);
         set.remove(GENERIC_GET_KEY);
         set.remove(ARG_TYPES_BY_METHOD_KEY);
diff --git a/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java b/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
index e2847ab..cd4df0f 100644
--- a/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
+++ b/src/main/java/freemarker/ext/beans/ClassIntrospectorBuilder.java
@@ -34,9 +34,9 @@
 final class ClassIntrospectorBuilder implements Cloneable {
 
     private static final Map<ClassIntrospectorBuilder, Reference<ClassIntrospector>> INSTANCE_CACHE
-            = new HashMap<ClassIntrospectorBuilder, Reference<ClassIntrospector>>();
+            = new HashMap<>();
     private static final ReferenceQueue<ClassIntrospector> INSTANCE_CACHE_REF_QUEUE
-            = new ReferenceQueue<ClassIntrospector>();
+            = new ReferenceQueue<>();
 
     private final Version incompatibleImprovements;
 
@@ -232,7 +232,7 @@
                 if (instance == null) {
                     ClassIntrospectorBuilder thisClone = (ClassIntrospectorBuilder) clone();  // prevent any aliasing issues
                     instance = new ClassIntrospector(thisClone, new Object(), true, true);
-                    INSTANCE_CACHE.put(thisClone, new WeakReference<ClassIntrospector>(instance, INSTANCE_CACHE_REF_QUEUE));
+                    INSTANCE_CACHE.put(thisClone, new WeakReference<>(instance, INSTANCE_CACHE_REF_QUEUE));
                 }
             }
             
diff --git a/src/main/java/freemarker/ext/beans/CollectionAdapter.java b/src/main/java/freemarker/ext/beans/CollectionAdapter.java
index efe1c42..8c1e5b9 100644
--- a/src/main/java/freemarker/ext/beans/CollectionAdapter.java
+++ b/src/main/java/freemarker/ext/beans/CollectionAdapter.java
@@ -42,6 +42,7 @@
         this.wrapper = wrapper;
     }
     
+    @Override
     public TemplateModel getTemplateModel() {
         return model;
     }
@@ -57,6 +58,7 @@
             return new Iterator() {
                 final TemplateModelIterator i = model.iterator();
     
+                @Override
                 public boolean hasNext() {
                     try {
                         return i.hasNext();
@@ -65,6 +67,7 @@
                     }
                 }
                 
+                @Override
                 public Object next() {
                     try {
                         return wrapper.unwrap(i.next());
@@ -73,6 +76,7 @@
                     }
                 }
                 
+                @Override
                 public void remove() {
                     throw new UnsupportedOperationException();
                 }
diff --git a/src/main/java/freemarker/ext/beans/CollectionModel.java b/src/main/java/freemarker/ext/beans/CollectionModel.java
index ba79cb2..c86d84d 100644
--- a/src/main/java/freemarker/ext/beans/CollectionModel.java
+++ b/src/main/java/freemarker/ext/beans/CollectionModel.java
@@ -44,6 +44,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new CollectionModel((Collection) object, (BeansWrapper) wrapper);
             }
@@ -67,6 +68,7 @@
      * @throws TemplateModelException if the index is out of bounds, or the
      * underlying collection is not a List.
      */
+    @Override
     public TemplateModel get(int index)
     throws TemplateModelException {
         // Don't forget to keep getSupportsIndexedAccess in sync with this!
@@ -95,6 +97,7 @@
         return object instanceof List;
     }
     
+    @Override
     public TemplateModelIterator iterator() {
         return new IteratorModel(((Collection) object).iterator(), wrapper);
     }
diff --git a/src/main/java/freemarker/ext/beans/DateModel.java b/src/main/java/freemarker/ext/beans/DateModel.java
index aeca3f5..276701e 100644
--- a/src/main/java/freemarker/ext/beans/DateModel.java
+++ b/src/main/java/freemarker/ext/beans/DateModel.java
@@ -39,6 +39,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new DateModel((Date) object, (BeansWrapper) wrapper);
             }
@@ -67,10 +68,12 @@
         }
     }
 
+    @Override
     public Date getAsDate() {
         return (Date) object;
     }
 
+    @Override
     public int getDateType() {
         return type;
     }
diff --git a/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java b/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
index bc8b6d8..5f0b26c 100644
--- a/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
+++ b/src/main/java/freemarker/ext/beans/DefaultMemberAccessPolicy.java
@@ -66,10 +66,10 @@
         try {
             ClassLoader classLoader = DefaultMemberAccessPolicy.class.getClassLoader();
 
-            whitelistRuleFinalClasses = new HashSet<Class<?>>();
-            whitelistRuleNonFinalClasses = new HashSet<Class<?>>();
-            Set<Class<?>> typesWithBlacklistUnlistedRule = new HashSet<Class<?>>();
-            List<MemberSelector> whitelistMemberSelectors = new ArrayList<MemberSelector>();
+            whitelistRuleFinalClasses = new HashSet<>();
+            whitelistRuleNonFinalClasses = new HashSet<>();
+            Set<Class<?>> typesWithBlacklistUnlistedRule = new HashSet<>();
+            List<MemberSelector> whitelistMemberSelectors = new ArrayList<>();
             for (String line : loadMemberSelectorFileLines()) {
                 line = line.trim();
                 if (!MemberSelector.isIgnoredLine(line)) {
@@ -128,7 +128,7 @@
             whitelistMemberAccessPolicy = new WhitelistMemberAccessPolicy(whitelistMemberSelectors);
 
             // Generate blacklists based on the whitelist and the members of "blacklistUnlistedMembers" types:
-            List<MemberSelector> blacklistMemberSelectors = new ArrayList<MemberSelector>();
+            List<MemberSelector> blacklistMemberSelectors = new ArrayList<>();
             for (Class<?> blacklistUnlistedRuleType : typesWithBlacklistUnlistedRule) {
                 ClassMemberAccessPolicy classPolicy = whitelistMemberAccessPolicy.forClass(blacklistUnlistedRuleType);
                 for (Method method : blacklistUnlistedRuleType.getMethods()) {
@@ -158,24 +158,21 @@
     }
 
     private static List<String> loadMemberSelectorFileLines() throws IOException {
-        List<String> whitelist = new ArrayList<String>();
-        BufferedReader reader =
-                new BufferedReader(
-                        new InputStreamReader(
-                                DefaultMemberAccessPolicy.class.getResourceAsStream("DefaultMemberAccessPolicy-rules"),
-                                "UTF-8"));
-        try {
+        List<String> whitelist = new ArrayList<>();
+        try (BufferedReader reader = new BufferedReader(
+                new InputStreamReader(
+                        DefaultMemberAccessPolicy.class.getResourceAsStream("DefaultMemberAccessPolicy-rules"),
+                        "UTF-8"))) {
             String line;
-            while ((line = reader.readLine()) != null){
+            while ((line = reader.readLine()) != null) {
                 whitelist.add(line);
             }
-        } finally {
-            reader.close();
         }
 
         return whitelist;
     }
 
+    @Override
     public ClassMemberAccessPolicy forClass(Class<?> contextClass) {
         if (isTypeWithWhitelistRule(contextClass)) {
             return whitelistMemberAccessPolicy.forClass(contextClass);
diff --git a/src/main/java/freemarker/ext/beans/EnumerationModel.java b/src/main/java/freemarker/ext/beans/EnumerationModel.java
index fc34c50..75888bb 100644
--- a/src/main/java/freemarker/ext/beans/EnumerationModel.java
+++ b/src/main/java/freemarker/ext/beans/EnumerationModel.java
@@ -61,6 +61,7 @@
      * This allows the enumeration to be used in a <tt>&lt;#list&gt;</tt> block.
      * @return "this"
      */
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         synchronized (this) {
             if (accessed) {
@@ -76,6 +77,7 @@
     /**
      * Calls underlying {@link Enumeration#nextElement()}.
      */
+    @Override
     public boolean hasNext() {
         return ((Enumeration) object).hasMoreElements();
     }
@@ -84,6 +86,7 @@
     /**
      * Calls underlying {@link Enumeration#nextElement()} and wraps the result.
      */
+    @Override
     public TemplateModel next()
     throws TemplateModelException {
         try {
diff --git a/src/main/java/freemarker/ext/beans/HashAdapter.java b/src/main/java/freemarker/ext/beans/HashAdapter.java
index 7d20e44..f4f58a0 100644
--- a/src/main/java/freemarker/ext/beans/HashAdapter.java
+++ b/src/main/java/freemarker/ext/beans/HashAdapter.java
@@ -45,6 +45,7 @@
         this.wrapper = wrapper;
     }
     
+    @Override
     public TemplateModel getTemplateModel() {
         return model;
     }
@@ -100,6 +101,7 @@
                     throw new UndeclaredThrowableException(e);
                 }
                 return new Iterator() {
+                    @Override
                     public boolean hasNext() {
                         try {
                             return i.hasNext();
@@ -108,6 +110,7 @@
                         }
                     }
                     
+                    @Override
                     public Object next() {
                         final Object key;
                         try {
@@ -116,14 +119,17 @@
                             throw new UndeclaredThrowableException(e);
                         }
                         return new Map.Entry() {
+                            @Override
                             public Object getKey() {
                                 return key;
                             }
                             
+                            @Override
                             public Object getValue() {
                                 return get(key);
                             }
                             
+                            @Override
                             public Object setValue(Object value) {
                                 throw new UnsupportedOperationException();
                             }
@@ -153,6 +159,7 @@
                         };
                     }
                     
+                    @Override
                     public void remove() {
                         throw new UnsupportedOperationException();
                     }
diff --git a/src/main/java/freemarker/ext/beans/IteratorModel.java b/src/main/java/freemarker/ext/beans/IteratorModel.java
index f21f641..e7aec98 100644
--- a/src/main/java/freemarker/ext/beans/IteratorModel.java
+++ b/src/main/java/freemarker/ext/beans/IteratorModel.java
@@ -65,6 +65,7 @@
      * This allows the iterator to be used in a <tt>&lt;#list&gt;</tt> block.
      * @return "this"
      */
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         synchronized (this) {
             if (accessed) {
@@ -80,6 +81,7 @@
     /**
      * Calls underlying {@link Iterator#hasNext()}.
      */
+    @Override
     public boolean hasNext() {
         return ((Iterator) object).hasNext();
     }
@@ -88,6 +90,7 @@
     /**
      * Calls underlying {@link Iterator#next()} and wraps the result.
      */
+    @Override
     public TemplateModel next()
     throws TemplateModelException {
         try {
diff --git a/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java b/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
index 21a39df..2cf81fe 100644
--- a/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
+++ b/src/main/java/freemarker/ext/beans/JRebelClassChangeNotifier.java
@@ -30,6 +30,7 @@
         ReloaderFactory.getInstance();
     }
 
+    @Override
     public void subscribe(ClassIntrospector classIntrospector) {
         ReloaderFactory.getInstance().addClassReloadListener(
                 new ClassIntrospectorCacheInvalidator(classIntrospector));
@@ -43,6 +44,7 @@
             ref = new WeakReference(w);
         }
 
+        @Override
         public void onClassEvent(int eventType, Class pClass) {
             ClassIntrospector ci = (ClassIntrospector) ref.get();
             if (ci == null) {
diff --git a/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java b/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
index 08c7c8f..adff8c2 100644
--- a/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
+++ b/src/main/java/freemarker/ext/beans/LegacyDefaultMemberAccessPolicy.java
@@ -45,15 +45,11 @@
     private static Set<Method> createUnsafeMethodsSet() {
         try {
             Properties props = ClassUtil.loadProperties(BeansWrapper.class, UNSAFE_METHODS_PROPERTIES);
-            Set<Method> set = new HashSet<Method>(props.size() * 4 / 3, 1f);
+            Set<Method> set = new HashSet<>(props.size() * 4 / 3, 1f);
             for (Object key : props.keySet()) {
                 try {
                     set.add(parseMethodSpec((String) key));
-                } catch (ClassNotFoundException e) {
-                    if (ClassIntrospector.DEVELOPMENT_MODE) {
-                        throw e;
-                    }
-                } catch (NoSuchMethodException e) {
+                } catch (ClassNotFoundException | NoSuchMethodException e) {
                     if (ClassIntrospector.DEVELOPMENT_MODE) {
                         throw e;
                     }
@@ -89,6 +85,7 @@
     private LegacyDefaultMemberAccessPolicy() {
     }
 
+    @Override
     public ClassMemberAccessPolicy forClass(Class<?> containingClass) {
         return CLASS_MEMBER_ACCESS_POLICY_INSTANCE;
     }
@@ -102,14 +99,17 @@
             = new BlacklistClassMemberAccessPolicy();
     private static class BlacklistClassMemberAccessPolicy implements ClassMemberAccessPolicy {
 
+        @Override
         public boolean isMethodExposed(Method method) {
             return !UNSAFE_METHODS.contains(method);
         }
 
+        @Override
         public boolean isConstructorExposed(Constructor<?> constructor) {
             return true;
         }
 
+        @Override
         public boolean isFieldExposed(Field field) {
             return true;
         }
diff --git a/src/main/java/freemarker/ext/beans/MapModel.java b/src/main/java/freemarker/ext/beans/MapModel.java
index c672f49..7bb8105 100644
--- a/src/main/java/freemarker/ext/beans/MapModel.java
+++ b/src/main/java/freemarker/ext/beans/MapModel.java
@@ -50,6 +50,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new MapModel((Map) object, (BeansWrapper) wrapper);
             }
@@ -70,6 +71,7 @@
     /**
      * The first argument is used as a key to call the map's <tt>get</tt> method.
      */
+    @Override
     public Object exec(List arguments)
     throws TemplateModelException {
         Object key = unwrap((TemplateModel) arguments.get(0));
diff --git a/src/main/java/freemarker/ext/beans/MemberMatcher.java b/src/main/java/freemarker/ext/beans/MemberMatcher.java
index 34ccc9c..14453fb 100644
--- a/src/main/java/freemarker/ext/beans/MemberMatcher.java
+++ b/src/main/java/freemarker/ext/beans/MemberMatcher.java
@@ -33,10 +33,10 @@
  * @since 2.3.30
  */
 abstract class MemberMatcher<M extends Member, S> {
-    private final Map<S, Types> signaturesToUpperBoundTypes = new HashMap<S, Types>();
+    private final Map<S, Types> signaturesToUpperBoundTypes = new HashMap<>();
 
     private static class Types {
-        private final Set<Class<?>> set = new HashSet<Class<?>>();
+        private final Set<Class<?>> set = new HashSet<>();
         private boolean containsInterfaces;
     }
 
diff --git a/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java b/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
index a1eee12..2ed2fd4 100644
--- a/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
+++ b/src/main/java/freemarker/ext/beans/MemberSelectorListMemberAccessPolicy.java
@@ -271,7 +271,7 @@
         public static List<MemberSelector> parse(
                 Collection<String> memberSelectors, boolean ignoreMissingClassOrMember, ClassLoader classLoader)
                 throws ClassNotFoundException, NoSuchMethodException, NoSuchFieldException {
-            List<MemberSelector> parsedMemberSelectors = new ArrayList<MemberSelector>(memberSelectors.size());
+            List<MemberSelector> parsedMemberSelectors = new ArrayList<>(memberSelectors.size());
             for (String memberSelector : memberSelectors) {
                 if (!isIgnoredLine(memberSelector)) {
                     try {
@@ -328,8 +328,10 @@
         }
     }
 
+    @Override
     public final ClassMemberAccessPolicy forClass(final Class<?> contextClass) {
         return new ClassMemberAccessPolicy() {
+            @Override
             public boolean isMethodExposed(Method method) {
                 return matchResultToIsExposedResult(
                         methodMatcher.matches(contextClass, method)
@@ -338,6 +340,7 @@
                                         != null);
             }
 
+            @Override
             public boolean isConstructorExposed(Constructor<?> constructor) {
                 return matchResultToIsExposedResult(
                         constructorMatcher.matches(contextClass, constructor)
@@ -346,6 +349,7 @@
                                         != null);
             }
 
+            @Override
             public boolean isFieldExposed(Field field) {
                 return matchResultToIsExposedResult(
                         fieldMatcher.matches(contextClass, field)
diff --git a/src/main/java/freemarker/ext/beans/NumberModel.java b/src/main/java/freemarker/ext/beans/NumberModel.java
index 4e6e679..c3b6449 100644
--- a/src/main/java/freemarker/ext/beans/NumberModel.java
+++ b/src/main/java/freemarker/ext/beans/NumberModel.java
@@ -37,6 +37,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new NumberModel((Number) object, (BeansWrapper) wrapper);
             }
@@ -53,6 +54,7 @@
         super(number, wrapper);
     }
 
+    @Override
     public Number getAsNumber() {
         return (Number) object;
     }
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethods.java b/src/main/java/freemarker/ext/beans/OverloadedMethods.java
index 586714d..6f9dccb 100644
--- a/src/main/java/freemarker/ext/beans/OverloadedMethods.java
+++ b/src/main/java/freemarker/ext/beans/OverloadedMethods.java
@@ -135,12 +135,12 @@
                 tmArgs != null
                         ? new Object[] {
                                 "\nThe FTL type of the argument values were: ", getTMActualParameterTypes(tmArgs), "." }
-                        : (Object) "",
+                        : "",
                 unwrappedArgs != null
                         ? new Object[] {
                                 "\nThe Java type of the argument values were: ",
                                 getUnwrappedActualParameterTypes(unwrappedArgs) + "." }
-                        : (Object) ""};
+                        : ""};
     }
 
     private _DelayedConversionToString memberListToString() {
diff --git a/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java b/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
index 9fe4362..fc53dde 100644
--- a/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
+++ b/src/main/java/freemarker/ext/beans/OverloadedMethodsModel.java
@@ -54,6 +54,7 @@
      * @throws TemplateModelException if the method cannot be chosen
      * unambiguously.
      */
+    @Override
     public Object exec(List arguments)
     throws TemplateModelException {
         MemberAndArguments maa = overloadedMethods.getMemberAndArguments(arguments, wrapper);
@@ -69,11 +70,13 @@
         }
     }
 
+    @Override
     public TemplateModel get(int index) throws TemplateModelException {
         return (TemplateModel) exec(Collections.singletonList(
                 new SimpleNumber(Integer.valueOf(index))));
     }
 
+    @Override
     public int size() throws TemplateModelException {
         throw new TemplateModelException("?size is unsupported for " + getClass().getName());
     }
diff --git a/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java b/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
index fbb2fc0..243a935 100644
--- a/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
+++ b/src/main/java/freemarker/ext/beans/OverloadedNumberUtil.java
@@ -383,6 +383,7 @@
 
         // We have to implement this, so that if a potential matching method expects a Comparable, which is implemented
         // by all the supported numerical types, the "Or" type will be a match. 
+        @Override
         public int compareTo(Object o) {
             Number n = getSourceNumber();
             if (n instanceof Comparable) {
diff --git a/src/main/java/freemarker/ext/beans/ResourceBundleModel.java b/src/main/java/freemarker/ext/beans/ResourceBundleModel.java
index f6ff899..4b2b0fb 100644
--- a/src/main/java/freemarker/ext/beans/ResourceBundleModel.java
+++ b/src/main/java/freemarker/ext/beans/ResourceBundleModel.java
@@ -60,6 +60,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new ResourceBundleModel((ResourceBundle) object, (BeansWrapper) wrapper);
             }
@@ -116,6 +117,7 @@
      * with this key, then applies a MessageFormat.format on the string with the
      * rest of the arguments. The created MessageFormats are cached for later reuse.
      */
+    @Override
     public Object exec(List arguments)
         throws TemplateModelException {
         // Must have at least one argument - the key
diff --git a/src/main/java/freemarker/ext/beans/SequenceAdapter.java b/src/main/java/freemarker/ext/beans/SequenceAdapter.java
index 340a754..48655da 100644
--- a/src/main/java/freemarker/ext/beans/SequenceAdapter.java
+++ b/src/main/java/freemarker/ext/beans/SequenceAdapter.java
@@ -38,6 +38,7 @@
         this.wrapper = wrapper;
     }
     
+    @Override
     public TemplateModel getTemplateModel() {
         return model;
     }
diff --git a/src/main/java/freemarker/ext/beans/SimpleMapModel.java b/src/main/java/freemarker/ext/beans/SimpleMapModel.java
index 587888c..03690f1 100644
--- a/src/main/java/freemarker/ext/beans/SimpleMapModel.java
+++ b/src/main/java/freemarker/ext/beans/SimpleMapModel.java
@@ -50,6 +50,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new SimpleMapModel((Map) object, (BeansWrapper) wrapper);
             }
@@ -62,6 +63,7 @@
         this.map = map;
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         Object val = map.get(key);
         if (val == null) {
@@ -79,6 +81,7 @@
         return wrap(val);
     }
     
+    @Override
     public Object exec(List args) throws TemplateModelException {
         Object key = ((BeansWrapper) getObjectWrapper()).unwrap((TemplateModel) args.get(0));
         Object value = map.get(key);
@@ -88,34 +91,42 @@
         return wrap(value);
     }
 
+    @Override
     public boolean isEmpty() {
         return map.isEmpty();
     }
 
+    @Override
     public int size() {
         return map.size();
     }
 
+    @Override
     public TemplateCollectionModel keys() {
         return new CollectionAndSequence(new SimpleSequence(map.keySet(), getObjectWrapper()));
     }
 
+    @Override
     public TemplateCollectionModel values() {
         return new CollectionAndSequence(new SimpleSequence(map.values(), getObjectWrapper()));
     }
     
+    @Override
     public KeyValuePairIterator keyValuePairIterator() {
         return new MapKeyValuePairIterator(map, getObjectWrapper());
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         return map;
     }
     
+    @Override
     public Object getWrappedObject() {
         return map;
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return ((RichObjectWrapper) getObjectWrapper()).wrapAsAPI(map);
     }
diff --git a/src/main/java/freemarker/ext/beans/SimpleMethodModel.java b/src/main/java/freemarker/ext/beans/SimpleMethodModel.java
index 9b8150b..d38ab06 100644
--- a/src/main/java/freemarker/ext/beans/SimpleMethodModel.java
+++ b/src/main/java/freemarker/ext/beans/SimpleMethodModel.java
@@ -66,6 +66,7 @@
     /**
      * Invokes the method, passing it the arguments from the list.
      */
+    @Override
     public Object exec(List arguments)
         throws TemplateModelException {
         try {
@@ -78,11 +79,13 @@
         }
     }
     
+    @Override
     public TemplateModel get(int index) throws TemplateModelException {
         return (TemplateModel) exec(Collections.singletonList(
                 new SimpleNumber(Integer.valueOf(index))));
     }
 
+    @Override
     public int size() throws TemplateModelException {
         throw new _TemplateModelException(
                 new _ErrorDescriptionBuilder(
@@ -103,6 +106,7 @@
     /**
      * Implementation of experimental interface; don't use it, no backward compatibility guarantee!
      */
+    @Override
     public Object[] explainTypeError(Class[] expectedClasses) {
         final Member member = getMember();
         if (!(member instanceof Method)) {
diff --git a/src/main/java/freemarker/ext/beans/StaticModel.java b/src/main/java/freemarker/ext/beans/StaticModel.java
index 8e772aa..bfbccb9 100644
--- a/src/main/java/freemarker/ext/beans/StaticModel.java
+++ b/src/main/java/freemarker/ext/beans/StaticModel.java
@@ -44,7 +44,7 @@
     private static final Logger LOG = Logger.getLogger("freemarker.beans");
     private final Class<?> clazz;
     private final BeansWrapper wrapper;
-    private final Map<String, Object> map = new HashMap<String, Object>();
+    private final Map<String, Object> map = new HashMap<>();
 
     StaticModel(Class<?> clazz, BeansWrapper wrapper) throws TemplateModelException {
         this.clazz = clazz;
@@ -56,6 +56,7 @@
      * Returns the field or method named by the <tt>key</tt>
      * parameter.
      */
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         Object model = map.get(key);
         // Simple method, overloaded method or final field -- these have cached 
@@ -80,18 +81,22 @@
      * Returns true if there is at least one public static
      * field or method in the underlying class.
      */
+    @Override
     public boolean isEmpty() {
         return map.isEmpty();
     }
 
+    @Override
     public int size() {
         return map.size();
     }
     
+    @Override
     public TemplateCollectionModel keys() throws TemplateModelException {
         return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.keySet());
     }
     
+    @Override
     public TemplateCollectionModel values() throws TemplateModelException {
         return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.values());
     }
diff --git a/src/main/java/freemarker/ext/beans/StringModel.java b/src/main/java/freemarker/ext/beans/StringModel.java
index 37a4923..b53872d 100644
--- a/src/main/java/freemarker/ext/beans/StringModel.java
+++ b/src/main/java/freemarker/ext/beans/StringModel.java
@@ -34,6 +34,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new StringModel(object, (BeansWrapper) wrapper);
             }
diff --git a/src/main/java/freemarker/ext/beans/_BeansAPI.java b/src/main/java/freemarker/ext/beans/_BeansAPI.java
index 8b75893..64d9797 100644
--- a/src/main/java/freemarker/ext/beans/_BeansAPI.java
+++ b/src/main/java/freemarker/ext/beans/_BeansAPI.java
@@ -66,9 +66,9 @@
         
         final ArgumentTypes argTypes = new ArgumentTypes(args, true);
         final List<ReflectionCallableMemberDescriptor> fixedArgMemberDescs
-                = new ArrayList<ReflectionCallableMemberDescriptor>();
+                = new ArrayList<>();
         final List<ReflectionCallableMemberDescriptor> varArgsMemberDescs
-                = new ArrayList<ReflectionCallableMemberDescriptor>();
+                = new ArrayList<>();
         final Constructor<?>[] constrs = pClass.getConstructors();
         for (int i = 0; i < constrs.length; i++) {
             Constructor<?> constr = constrs[i];
@@ -155,7 +155,7 @@
         synchronized (instanceCache) {
             tcclScopedCache = instanceCache.get(tccl);
             if (tcclScopedCache == null) {
-                tcclScopedCache = new HashMap<BWC, WeakReference<BW>>();
+                tcclScopedCache = new HashMap<>();
                 instanceCache.put(tccl, tcclScopedCache);
                 instanceRef = null;
             } else {
@@ -179,7 +179,7 @@
             instanceRef = tcclScopedCache.get(settings);
             BW concurrentInstance = instanceRef != null ? instanceRef.get() : null;
             if (concurrentInstance == null) {
-                tcclScopedCache.put(settings, new WeakReference<BW>(instance, instanceCacheRefQue));
+                tcclScopedCache.put(settings, new WeakReference<>(instance, instanceCacheRefQue));
             } else {
                 instance = concurrentInstance;
             }
diff --git a/src/main/java/freemarker/ext/beans/_MethodUtil.java b/src/main/java/freemarker/ext/beans/_MethodUtil.java
index 9f743bc..1540853 100644
--- a/src/main/java/freemarker/ext/beans/_MethodUtil.java
+++ b/src/main/java/freemarker/ext/beans/_MethodUtil.java
@@ -287,7 +287,7 @@
         return new _TemplateModelException(e,
                 invocationErrorMessageStart(member, isConstructor),
                 " threw an exception",
-                isStatic || isConstructor ? (Object) "" : new Object[] {
+                isStatic || isConstructor ? "" : new Object[] {
                     " when invoked on ", parentObject.getClass(), " object ", new _DelayedJQuote(parentObject) 
                 },
                 "; see cause exception in the Java stack trace.");
diff --git a/src/main/java/freemarker/ext/dom/AttributeNodeModel.java b/src/main/java/freemarker/ext/dom/AttributeNodeModel.java
index 0575cc3..2ae1740 100644
--- a/src/main/java/freemarker/ext/dom/AttributeNodeModel.java
+++ b/src/main/java/freemarker/ext/dom/AttributeNodeModel.java
@@ -30,10 +30,12 @@
         super(att);
     }
     
+    @Override
     public String getAsString() {
         return ((Attr) node).getValue();
     }
     
+    @Override
     public String getNodeName() {
         String result = node.getLocalName();
         if (result == null || result.equals("")) {
@@ -42,6 +44,7 @@
         return result;
     }
     
+    @Override
     public boolean isEmpty() {
         return true;
     }
diff --git a/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java b/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
index 6f6c53a..42d3f32 100644
--- a/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
+++ b/src/main/java/freemarker/ext/dom/CharacterDataNodeModel.java
@@ -30,14 +30,17 @@
         super(text);
     }
     
+    @Override
     public String getAsString() {
         return ((org.w3c.dom.CharacterData) node).getData();
     }
     
+    @Override
     public String getNodeName() {
         return (node instanceof Comment) ? "@comment" : "@text";
     }
     
+    @Override
     public boolean isEmpty() {
         return true;
     }
diff --git a/src/main/java/freemarker/ext/dom/DocumentModel.java b/src/main/java/freemarker/ext/dom/DocumentModel.java
index 63783dd..2bf75b8 100644
--- a/src/main/java/freemarker/ext/dom/DocumentModel.java
+++ b/src/main/java/freemarker/ext/dom/DocumentModel.java
@@ -40,6 +40,7 @@
         super(doc);
     }
     
+    @Override
     public String getNodeName() {
         return "@document";
     }
@@ -69,6 +70,7 @@
         return rootElement;
     }
     
+    @Override
     public boolean isEmpty() {
         return false;
     }
diff --git a/src/main/java/freemarker/ext/dom/DocumentTypeModel.java b/src/main/java/freemarker/ext/dom/DocumentTypeModel.java
index fe65b60..7ce0053 100644
--- a/src/main/java/freemarker/ext/dom/DocumentTypeModel.java
+++ b/src/main/java/freemarker/ext/dom/DocumentTypeModel.java
@@ -45,10 +45,12 @@
         throw new TemplateModelException("accessing properties of a DTD is not currently supported");
     }
     
+    @Override
     public String getNodeName() {
-        return "@document_type$" + ((DocumentType) node).getNodeName();
+        return "@document_type$" + node.getNodeName();
     }
     
+    @Override
     public boolean isEmpty() {
         return true;
     }
diff --git a/src/main/java/freemarker/ext/dom/ElementModel.java b/src/main/java/freemarker/ext/dom/ElementModel.java
index 3f140c1..0975352 100644
--- a/src/main/java/freemarker/ext/dom/ElementModel.java
+++ b/src/main/java/freemarker/ext/dom/ElementModel.java
@@ -40,6 +40,7 @@
         super(element);
     }
     
+    @Override
     public boolean isEmpty() {
         return false;
     }
@@ -127,6 +128,7 @@
         }
     }
 
+    @Override
     public String getAsString() throws TemplateModelException {
         NodeList nl = node.getChildNodes();
         String result = "";
@@ -146,6 +148,7 @@
         return result;
     }
     
+    @Override
     public String getNodeName() {
         String result = node.getLocalName();
         if (result == null || result.equals("")) {
diff --git a/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java b/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
index eda4b87..77b35ab 100644
--- a/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
+++ b/src/main/java/freemarker/ext/dom/JaxenXPathSupport.java
@@ -76,6 +76,7 @@
         // [2.4] Can't we just use Collections.emptyList()? 
     private final static ArrayList EMPTY_ARRAYLIST = new ArrayList();
 
+    @Override
     public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException {
         try {
             BaseXPath xpath;
@@ -111,6 +112,7 @@
 
     static private final NamespaceContext customNamespaceContext = new NamespaceContext() {
         
+        @Override
         public String translateNamespacePrefixToUri(String prefix) {
             if (prefix.equals(Template.DEFAULT_NAMESPACE_PREFIX)) {
                 return Environment.getCurrentEnvironment().getDefaultNS();
@@ -120,6 +122,7 @@
     };
 
     private static final VariableContext FM_VARIABLE_CONTEXT = new VariableContext() {
+        @Override
         public Object getVariableValue(String namespaceURI, String prefix, String localName)
         throws UnresolvableException {
             try {
@@ -222,6 +225,7 @@
     private static class FmEntityResolver implements EntityResolver {
         private int callCount = 0;
         
+        @Override
         public InputSource resolveEntity(String publicId, String systemId)
         throws SAXException, IOException {
             ++callCount;
diff --git a/src/main/java/freemarker/ext/dom/NodeListModel.java b/src/main/java/freemarker/ext/dom/NodeListModel.java
index 6da6566..700f43b 100644
--- a/src/main/java/freemarker/ext/dom/NodeListModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeListModel.java
@@ -58,6 +58,7 @@
     XPathSupport xpathSupport;
     
     private static final ObjectWrapper NODE_WRAPPER = new ObjectWrapper() {
+        @Override
         public TemplateModel wrap(Object obj) {
             if (obj instanceof NodeModel) {
                 return (NodeModel) obj;
@@ -114,10 +115,12 @@
         return result;
     }
     
+    @Override
     public boolean isEmpty() {
         return size() == 0;
     }
     
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         int size = size();
         if (size == 1) {
@@ -156,7 +159,7 @@
             for (int i = 0; i < size; i++) {
                 NodeModel nm = (NodeModel) get(i);
                 if (nm instanceof ElementModel) {
-                    TemplateSequenceModel tsm = (TemplateSequenceModel) ((ElementModel) nm).get(key);
+                    TemplateSequenceModel tsm = (TemplateSequenceModel) nm.get(key);
                     if (tsm != null) {
                         int tsmSize = tsm.size();
                         for (int j = 0; j < tsmSize; j++) {
@@ -200,6 +203,7 @@
         return xpathSupport;
     }
 
+    @Override
     public Object[] explainTypeError(Class[] expectedClasses) {
         for (int i = 0; i < expectedClasses.length; i++) {
             Class expectedClass = expectedClasses[i];
diff --git a/src/main/java/freemarker/ext/dom/NodeModel.java b/src/main/java/freemarker/ext/dom/NodeModel.java
index 411e0bd..d2bb2b4 100644
--- a/src/main/java/freemarker/ext/dom/NodeModel.java
+++ b/src/main/java/freemarker/ext/dom/NodeModel.java
@@ -297,6 +297,7 @@
         return node;
     }
     
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         if (key.startsWith("@@")) {
             if (key.equals(AtAtKey.TEXT.getKey())) {
@@ -343,6 +344,7 @@
         }
     }
     
+    @Override
     public TemplateNodeModel getParentNode() {
         if (parent == null) {
             Node parentNode = node.getParentNode();
@@ -356,14 +358,17 @@
         return parent;
     }
 
+    @Override
     public TemplateNodeModelEx getPreviousSibling() throws TemplateModelException {
         return wrap(node.getPreviousSibling());
     }
 
+    @Override
     public TemplateNodeModelEx getNextSibling() throws TemplateModelException {
         return wrap(node.getNextSibling());
     }
 
+    @Override
     public TemplateSequenceModel getChildNodes() {
         if (children == null) {
             children = new NodeListModel(node.getChildNodes(), this);
@@ -371,6 +376,7 @@
         return children;
     }
     
+    @Override
     public final String getNodeType() throws TemplateModelException {
         short nodeType = node.getNodeType();
         switch (nodeType) {
@@ -406,14 +412,17 @@
     /**
      * Always returns 1.
      */
+    @Override
     public final int size() {
         return 1;
     }
     
+    @Override
     public final TemplateModel get(int i) {
         return i == 0 ? this : null;
     }
     
+    @Override
     public String getNodeNamespace() {
         int nodeType = node.getNodeType();
         if (nodeType != Node.ATTRIBUTE_NODE && nodeType != Node.ELEMENT_NODE) { 
@@ -643,9 +652,7 @@
                 useJaxenXPathSupport();
             } catch (ClassNotFoundException e) {
                 // Expected
-            } catch (Exception e) {
-                LOG.debug("Failed to use Jaxen XPath support.", e);
-            } catch (IllegalAccessError e) {
+            } catch (Exception | IllegalAccessError e) {
                 LOG.debug("Failed to use Jaxen XPath support.", e);
             }
         }
@@ -758,14 +765,17 @@
         return getNodeName();
     }
     
+    @Override
     public Object getAdaptedObject(Class hint) {
         return node;
     }
     
+    @Override
     public Object getWrappedObject() {
         return node;
     }
     
+    @Override
     public Object[] explainTypeError(Class[] expectedClasses) {
         for (int i = 0; i < expectedClasses.length; i++) {
             Class expectedClass = expectedClasses[i];
diff --git a/src/main/java/freemarker/ext/dom/NodeOutputter.java b/src/main/java/freemarker/ext/dom/NodeOutputter.java
index f0dd1e0..9a317d8 100644
--- a/src/main/java/freemarker/ext/dom/NodeOutputter.java
+++ b/src/main/java/freemarker/ext/dom/NodeOutputter.java
@@ -42,7 +42,7 @@
     private String defaultNS;
     private boolean hasDefaultNS;
     private boolean explicitDefaultNSPrefix;
-    private LinkedHashMap<String, String> namespacesToPrefixLookup = new LinkedHashMap<String, String>();
+    private LinkedHashMap<String, String> namespacesToPrefixLookup = new LinkedHashMap<>();
     private String namespaceDecl;
     int nextGeneratedPrefixNumber = 1;
     
diff --git a/src/main/java/freemarker/ext/dom/PINodeModel.java b/src/main/java/freemarker/ext/dom/PINodeModel.java
index 1e7e8a3..b5cfd3a 100644
--- a/src/main/java/freemarker/ext/dom/PINodeModel.java
+++ b/src/main/java/freemarker/ext/dom/PINodeModel.java
@@ -29,14 +29,17 @@
         super(pi);
     }
     
+    @Override
     public String getAsString() {
         return ((ProcessingInstruction) node).getData();
     }
     
+    @Override
     public String getNodeName() {
         return "@pi$" + ((ProcessingInstruction) node).getTarget();
     }
     
+    @Override
     public boolean isEmpty() {
         return true;
     }
diff --git a/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java b/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
index e184ac9..1198fbb 100644
--- a/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
+++ b/src/main/java/freemarker/ext/dom/SunInternalXalanXPathSupport.java
@@ -54,6 +54,7 @@
 
     private XPathContext xpathContext = new XPathContext();
         
+    @Override
     synchronized public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException {
         if (!(context instanceof Node)) {
             if (context == null || isNodeList(context)) {
@@ -110,10 +111,12 @@
     
     private static final PrefixResolver CUSTOM_PREFIX_RESOLVER = new PrefixResolver() {
         
+        @Override
         public String getNamespaceForPrefix(String prefix, Node node) {
             return getNamespaceForPrefix(prefix);
         }
         
+        @Override
         public String getNamespaceForPrefix(String prefix) {
             if (prefix.equals(Template.DEFAULT_NAMESPACE_PREFIX)) {
                 return Environment.getCurrentEnvironment().getDefaultNS();
@@ -121,10 +124,12 @@
             return Environment.getCurrentEnvironment().getNamespaceForPrefix(prefix);
         }
         
+        @Override
         public String getBaseIdentifier() {
             return null;
         }
         
+        @Override
         public boolean handlesNullPrefixes() {
             return false;
         }
diff --git a/src/main/java/freemarker/ext/dom/XalanXPathSupport.java b/src/main/java/freemarker/ext/dom/XalanXPathSupport.java
index 59ec81c..aa3ec7d 100644
--- a/src/main/java/freemarker/ext/dom/XalanXPathSupport.java
+++ b/src/main/java/freemarker/ext/dom/XalanXPathSupport.java
@@ -50,6 +50,7 @@
     
     private XPathContext xpathContext = new XPathContext();
         
+    @Override
     synchronized public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException {
         if (!(context instanceof Node)) {
             if (context == null || isNodeList(context)) {
@@ -105,10 +106,12 @@
     
     private static final PrefixResolver CUSTOM_PREFIX_RESOLVER = new PrefixResolver() {
         
+        @Override
         public String getNamespaceForPrefix(String prefix, Node node) {
             return getNamespaceForPrefix(prefix);
         }
         
+        @Override
         public String getNamespaceForPrefix(String prefix) {
             if (prefix.equals(Template.DEFAULT_NAMESPACE_PREFIX)) {
                 return Environment.getCurrentEnvironment().getDefaultNS();
@@ -116,10 +119,12 @@
             return Environment.getCurrentEnvironment().getNamespaceForPrefix(prefix);
         }
         
+        @Override
         public String getBaseIdentifier() {
             return null;
         }
         
+        @Override
         public boolean handlesNullPrefixes() {
             return false;
         }
diff --git a/src/main/java/freemarker/ext/jdom/NodeListModel.java b/src/main/java/freemarker/ext/jdom/NodeListModel.java
index ef44832..7e963f7 100644
--- a/src/main/java/freemarker/ext/jdom/NodeListModel.java
+++ b/src/main/java/freemarker/ext/jdom/NodeListModel.java
@@ -182,6 +182,7 @@
     /**
      * Returns true if this model contains no nodes.
      */
+    @Override
     public boolean isEmpty() {
         return nodes.isEmpty();
     }
@@ -193,6 +194,7 @@
      * simplifies creating XML-transformation templates, as to output a node contained
      * in variable x as XML fragment, you simply write ${x} in the template.
      */
+    @Override
     public String getAsString()
     throws TemplateModelException {
         if (isEmpty())
@@ -347,6 +349,7 @@
      * @param key a key that identifies a required set of nodes
      * @return a new NodeListModel that represents the requested set of nodes.
      */
+    @Override
     public TemplateModel get(String key)
     throws TemplateModelException {
         if (isEmpty())
@@ -483,15 +486,18 @@
         return new SimpleScalar(buf.toString());
     }
 
+    @Override
     public TemplateModelIterator iterator() {
         return new TemplateModelIterator()
         {
             private final Iterator it = nodes.iterator();
 
+            @Override
             public TemplateModel next() {
                 return it.hasNext() ? new NodeListModel(it.next(), namespaces) : null;
             }
 
+            @Override
             public boolean hasNext() {
                 return it.hasNext();
             }
@@ -501,6 +507,7 @@
     /**
      * Retrieves the i-th element of the node list.
      */
+    @Override
     public TemplateModel get(int i)
     throws TemplateModelException {
         try {
@@ -510,6 +517,7 @@
         }
     }
     
+    @Override
     public int size() {
         return nodes.size();
     }
@@ -531,6 +539,7 @@
      * @return a NodeListModel representing the nodes that are the result of application
      * of the XPath to the current node list.
      */
+    @Override
     public Object exec(List arguments)
     throws TemplateModelException {
         if (arguments == null || arguments.size() != 1)
@@ -594,6 +603,7 @@
     }
 
     private static final class AllChildrenOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element)
                 return((Element) node).getChildren();
@@ -612,6 +622,7 @@
     }
 
     private static final class NamedChildrenOp implements NamedNodeOperator {
+        @Override
         public List operate(Object node, String localName, Namespace namespace) {
             if (node instanceof Element) {
                 return((Element) node).getChildren(localName, namespace);
@@ -635,6 +646,7 @@
     }
 
     private static final class AllAttributesOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
  // With 2.1 semantics it  makes more sense to just return a null and let the core 
  // throw an InvalidReferenceException and the template writer can use ?exists etcetera. (JR)
@@ -650,6 +662,7 @@
     }
 
     private static final class NamedAttributeOp implements NamedNodeOperator {
+        @Override
         public List operate(Object node, String localName, Namespace namespace) {
             Attribute attr = null;
             if (node instanceof Element) {
@@ -686,6 +699,7 @@
     }
 
     private static final class NameOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element)
                 return Collections.singletonList(((Element) node).getName());
@@ -706,6 +720,7 @@
     }
 
     private static final class QNameOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element)
                 return Collections.singletonList(((Element) node).getQualifiedName());
@@ -719,6 +734,7 @@
     }
 
     private static final class NamespaceUriOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element)
                 return Collections.singletonList(((Element) node).getNamespace().getURI());
@@ -732,6 +748,7 @@
     }
 
     private static final class NamespacePrefixOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element)
                 return Collections.singletonList(((Element) node).getNamespace().getPrefix());
@@ -745,6 +762,7 @@
     }
 
     private static final class CanonicalNameOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element) {
                 Element element = (Element) node;
@@ -782,6 +800,7 @@
     }
 
     private static final class ParentOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             Element parent = getParent(node);
             return parent == null ? Collections.EMPTY_LIST : Collections.singletonList(parent);
@@ -789,6 +808,7 @@
     }
 
     private static final class AncestorOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             Element parent = getParent(node);
             if (parent == null) return Collections.EMPTY_LIST;
@@ -802,6 +822,7 @@
     }
 
     private static final class AncestorOrSelfOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             Element parent = getParent(node);
             if (parent == null) return Collections.singletonList(node);
@@ -816,6 +837,7 @@
     }
 
     private static class DescendantOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             LinkedList list = new LinkedList();
             if (node instanceof Element) {
@@ -854,6 +876,7 @@
     }
 
     private static final class DocumentOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             Document doc = null;
             if (node instanceof Element)
@@ -883,6 +906,7 @@
     }
 
     private static final class DocTypeOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Document) {
                 DocType doctype = ((Document) node).getDocType();
@@ -896,6 +920,7 @@
     }
 
     private static final class ContentOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element)
                 return((Element) node).getContent();
@@ -909,6 +934,7 @@
     }
 
     private static final class TextOp implements NodeOperator {
+        @Override
         public List operate(Object node) {
             if (node instanceof Element)
                 return Collections.singletonList(((Element) node).getTextTrim());
@@ -1043,6 +1069,7 @@
             return false;
         }
 
+        @Override
         public Object exec(List arguments)
         throws TemplateModelException {
             if (arguments.size() != 2)
@@ -1059,6 +1086,7 @@
             return false;
         }
 
+        @Override
         public Object exec(List arguments) {
             Set names = new HashSet(arguments);
             List list = new LinkedList(nodes);
@@ -1089,6 +1117,7 @@
             return false;
         }
 
+        @Override
         public Object exec(List arguments)
         throws TemplateModelException {
             if (arguments == null || arguments.size() == 0)
@@ -1186,6 +1215,7 @@
                 this.namespaces = namespaces;
             }
             
+            @Override
             public String translateNamespacePrefixToUri(String prefix) {
                 // Empty prefix always maps to empty URL in XPath
                 if (prefix.length() == 0) {
diff --git a/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java b/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
index 8cf493e..0863ba4 100644
--- a/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
+++ b/src/main/java/freemarker/ext/jsp/CustomTagAndELFunctionCombiner.java
@@ -104,23 +104,28 @@
             this.simpleMethodModel = simpleMethodModel;
         }
 
+        @Override
         public Object exec(List arguments) throws TemplateModelException {
             return simpleMethodModel.exec(arguments);
         }
 
+        @Override
         public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
                 throws TemplateException, IOException {
             templateDirectiveModel.execute(env, params, loopVars, body);
         }
 
+        @Override
         public Object[] explainTypeError(Class[] expectedClasses) {
             return simpleMethodModel.explainTypeError(expectedClasses);
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return simpleMethodModel.get(index);
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return simpleMethodModel.size();
         }
@@ -139,10 +144,12 @@
             this.templateMethodModelEx = templateMethodModelEx;
         }
 
+        @Override
         public Object exec(List arguments) throws TemplateModelException {
             return templateMethodModelEx.exec(arguments);
         }
 
+        @Override
         public void execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBody body)
                 throws TemplateException, IOException {
             templateDirectiveModel.execute(env, params, loopVars, body);
@@ -162,10 +169,12 @@
             this.templateMethodModelEx = templateMethodModelEx;
         }
 
+        @Override
         public Object exec(List arguments) throws TemplateModelException {
             return templateMethodModelEx.exec(arguments);
         }
 
+        @Override
         public Writer getWriter(Writer out, Map args) throws TemplateModelException, IOException {
             return templateTransformModel.getWriter(out, args);
         }
@@ -185,22 +194,27 @@
             this.simpleMethodModel = simpleMethodModel;
         }
 
+        @Override
         public Object exec(List arguments) throws TemplateModelException {
             return simpleMethodModel.exec(arguments);
         }
 
+        @Override
         public Object[] explainTypeError(Class[] expectedClasses) {
             return simpleMethodModel.explainTypeError(expectedClasses);
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return simpleMethodModel.get(index);
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return simpleMethodModel.size();
         }
 
+        @Override
         public Writer getWriter(Writer out, Map args) throws TemplateModelException, IOException {
             return templateTransformModel.getWriter(out, args);
         }
diff --git a/src/main/java/freemarker/ext/jsp/EventForwarding.java b/src/main/java/freemarker/ext/jsp/EventForwarding.java
index 770ef5e..ce2dad6 100644
--- a/src/main/java/freemarker/ext/jsp/EventForwarding.java
+++ b/src/main/java/freemarker/ext/jsp/EventForwarding.java
@@ -97,6 +97,7 @@
         }
     }
     
+    @Override
     public void attributeAdded(ServletContextAttributeEvent arg0) {
         synchronized (servletContextAttributeListeners) {
             int s = servletContextAttributeListeners.size();
@@ -106,6 +107,7 @@
         }
     }
 
+    @Override
     public void attributeRemoved(ServletContextAttributeEvent arg0) {
         synchronized (servletContextAttributeListeners) {
             int s = servletContextAttributeListeners.size();
@@ -115,6 +117,7 @@
         }
     }
 
+    @Override
     public void attributeReplaced(ServletContextAttributeEvent arg0) {
         synchronized (servletContextAttributeListeners) {
             int s = servletContextAttributeListeners.size();
@@ -124,6 +127,7 @@
         }
     }
 
+    @Override
     public void contextInitialized(ServletContextEvent arg0) {
         arg0.getServletContext().setAttribute(ATTR_NAME, this);
         
@@ -135,6 +139,7 @@
         }
     }
 
+    @Override
     public void contextDestroyed(ServletContextEvent arg0) {
         synchronized (servletContextListeners) {
             int s = servletContextListeners.size();
@@ -144,6 +149,7 @@
         }
     }
 
+    @Override
     public void sessionCreated(HttpSessionEvent arg0) {
         synchronized (httpSessionListeners) {
             int s = httpSessionListeners.size();
@@ -153,6 +159,7 @@
         }
     }
 
+    @Override
     public void sessionDestroyed(HttpSessionEvent arg0) {
         synchronized (httpSessionListeners) {
             int s = httpSessionListeners.size();
@@ -162,6 +169,7 @@
         }
     }
 
+    @Override
     public void attributeAdded(HttpSessionBindingEvent arg0) {
         synchronized (httpSessionAttributeListeners) {
             int s = httpSessionAttributeListeners.size();
@@ -171,6 +179,7 @@
         }
     }
 
+    @Override
     public void attributeRemoved(HttpSessionBindingEvent arg0) {
         synchronized (httpSessionAttributeListeners) {
             int s = httpSessionAttributeListeners.size();
@@ -180,6 +189,7 @@
         }
     }
 
+    @Override
     public void attributeReplaced(HttpSessionBindingEvent arg0) {
         synchronized (httpSessionAttributeListeners) {
             int s = httpSessionAttributeListeners.size();
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java b/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
index 4160f0d..f83dae1 100644
--- a/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
+++ b/src/main/java/freemarker/ext/jsp/FreeMarkerJspApplicationContext.java
@@ -63,6 +63,7 @@
         elResolver.add(new ScopedAttributeELResolver());
     }
     
+    @Override
     public void addELContextListener(ELContextListener listener) {
         synchronized (listeners) {
             listeners.addLast(listener);
@@ -99,10 +100,12 @@
         return null;
     }
 
+    @Override
     public void addELResolver(ELResolver resolver) {
         additionalResolvers.add(resolver);
     }
 
+    @Override
     public ExpressionFactory getExpressionFactory() {
         return expressionFactoryImpl;
     }
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java b/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
index f4205e4..2eed561 100644
--- a/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
+++ b/src/main/java/freemarker/ext/jsp/FreeMarkerJspFactory2.java
@@ -23,6 +23,7 @@
 /**
  */
 class FreeMarkerJspFactory2 extends FreeMarkerJspFactory {
+    @Override
     protected String getSpecificationVersion() {
         return "2.0";
     }
diff --git a/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java b/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
index 0ff0a1d..724ba83 100644
--- a/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
+++ b/src/main/java/freemarker/ext/jsp/FreeMarkerPageContext.java
@@ -473,6 +473,7 @@
             it = hashEx.keys().iterator();
         }
         
+        @Override
         public boolean hasMoreElements() {
             try {
                 return it.hasNext();
@@ -481,6 +482,7 @@
             }
         }
         
+        @Override
         public Object nextElement() {
             try {
                 return ((TemplateScalarModel) it.next()).getAsString();
diff --git a/src/main/java/freemarker/ext/jsp/FreemarkerTag.java b/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
index da54f18..6868cfd 100644
--- a/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
+++ b/src/main/java/freemarker/ext/jsp/FreemarkerTag.java
@@ -61,40 +61,49 @@
         this.name = name == null ? "" : name;
     }
     
+    @Override
     public Tag getParent() {
         return parent;
     }
 
+    @Override
     public void setParent(Tag parent) {
         this.parent = parent;
     }
 
+    @Override
     public int doStartTag() {
         return EVAL_BODY_BUFFERED;
     }
 
+    @Override
     public void setBodyContent(BodyContent bodyContent) {
         this.bodyContent = bodyContent;
     }
 
+    @Override
     public void setPageContext(PageContext pageContext) {
         this.pageContext = pageContext;
         root = null;
     }
 
+    @Override
     public void doInitBody() {
     }
 
+    @Override
     public int doAfterBody() {
         return SKIP_BODY;
     }
 
+    @Override
     public void release() {
         root = null;
         template = null;
         name = "";
     }
 
+    @Override
     public int doEndTag()
         throws JspException {
         if (bodyContent == null)
@@ -117,9 +126,7 @@
         } catch (Exception e) {
             try {
                 pageContext.handlePageException(e);
-            } catch (ServletException e2) {
-                throw new JspException(e2.getMessage());
-            } catch (IOException e2) {
+            } catch (ServletException | IOException e2) {
                 throw new JspException(e2.getMessage());
             }
         } finally {
diff --git a/src/main/java/freemarker/ext/jsp/JspContextModel.java b/src/main/java/freemarker/ext/jsp/JspContextModel.java
index bd824f0..0eb10da 100644
--- a/src/main/java/freemarker/ext/jsp/JspContextModel.java
+++ b/src/main/java/freemarker/ext/jsp/JspContextModel.java
@@ -47,11 +47,13 @@
         this.scope = scope;
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         Object bean = scope == ANY_SCOPE ? pageContext.findAttribute(key) : pageContext.getAttribute(key, scope);
         return BeansWrapper.getDefaultInstance().wrap(bean);
     }
 
+    @Override
     public boolean isEmpty() {
         return false;
     }
diff --git a/src/main/java/freemarker/ext/jsp/JspTagModelBase.java b/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
index 032cead..2c4d57b 100644
--- a/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
+++ b/src/main/java/freemarker/ext/jsp/JspTagModelBase.java
@@ -115,7 +115,7 @@
                                 " (declared type: ", new _DelayedShortClassName(setterType)
                                 + ", actual value's type: ",
                                 (argArray[0] != null
-                                        ? (Object) new _DelayedShortClassName(argArray[0].getClass()) : "Null"),
+                                        ? new _DelayedShortClassName(argArray[0].getClass()) : "Null"),
                                 "). See cause exception for the more specific cause...");
                         if (e instanceof IllegalArgumentException && !(setterType.isAssignableFrom(String.class))
                                 && argArray[0] != null && argArray[0] instanceof String) {
diff --git a/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java b/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
index e02e4c9..6101b06 100644
--- a/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
+++ b/src/main/java/freemarker/ext/jsp/SimpleTagDirectiveModel.java
@@ -52,7 +52,8 @@
         }
     }
 
-    public void execute(Environment env, Map args, TemplateModel[] outArgs, 
+    @Override
+    public void execute(Environment env, Map args, TemplateModel[] outArgs,
             final TemplateDirectiveBody body) 
     throws TemplateException, IOException {
         try {
@@ -107,6 +108,7 @@
             super("Nested content has thrown template exception", cause);
         }
         
+        @Override
         public TemplateException getCause() {
             return (TemplateException) super.getCause();
         }
diff --git a/src/main/java/freemarker/ext/jsp/TagTransformModel.java b/src/main/java/freemarker/ext/jsp/TagTransformModel.java
index 55b0272..a4c17c7 100644
--- a/src/main/java/freemarker/ext/jsp/TagTransformModel.java
+++ b/src/main/java/freemarker/ext/jsp/TagTransformModel.java
@@ -59,6 +59,7 @@
         isTryCatchFinally = TryCatchFinally.class.isAssignableFrom(tagClass);
     }
     
+    @Override
     public Writer getWriter(Writer out, Map args) throws TemplateModelException {
         try {
             Tag tag = (Tag) getTagInstance();
@@ -314,6 +315,7 @@
             return pageContext;
         }
         
+        @Override
         public int onStart()
         throws TemplateModelException {
             try {
@@ -352,6 +354,7 @@
             }
         }
         
+        @Override
         public int afterBody()
         throws TemplateModelException {
             try {
@@ -384,6 +387,7 @@
             }
         }
         
+        @Override
         public void onError(Throwable t) throws Throwable {
             if (isTryCatchFinally) {
                 ((TryCatchFinally) tag).doCatch(t);
diff --git a/src/main/java/freemarker/ext/jsp/TaglibFactory.java b/src/main/java/freemarker/ext/jsp/TaglibFactory.java
index 4eaa4bf..0dfa9b6 100644
--- a/src/main/java/freemarker/ext/jsp/TaglibFactory.java
+++ b/src/main/java/freemarker/ext/jsp/TaglibFactory.java
@@ -175,6 +175,7 @@
      *         custom tag or EL function from the library, implemented as a {@link TemplateTransformModel} or
      *         {@link TemplateMethodModelEx}, respectively.
      */
+    @Override
     public TemplateModel get(final String taglibUri) throws TemplateModelException {
         synchronized (lock) {
             {
@@ -238,9 +239,9 @@
                     }
 
                     tldLocation = isJarPath(normalizedTaglibUri)
-                                ? (TldLocation) new ServletContextJarEntryTldLocation(
+                                ? new ServletContextJarEntryTldLocation(
                                         normalizedTaglibUri, DEFAULT_TLD_RESOURCE_PATH)
-                                : (TldLocation) new ServletContextTldLocation(normalizedTaglibUri);
+                                : new ServletContextTldLocation(normalizedTaglibUri);
                 }
             } catch (Exception e) {
                 String failedTLDsList = failedTldListAlreadyIncluded ? null : getFailedTLDsList();
@@ -287,6 +288,7 @@
     /**
      * Returns false.
      */
+    @Override
     public boolean isEmpty() {
         return false;
     }
@@ -624,20 +626,17 @@
                 throw new IOException("ServletContext resource not found: " + jarResourcePath);
             }
             try {
-                ZipInputStream zipIn = new ZipInputStream(in);
-                try {
+                try (ZipInputStream zipIn = new ZipInputStream(in)) {
                     while (true) {
                         ZipEntry curEntry = zipIn.getNextEntry();
                         if (curEntry == null) break;
-        
+
                         String curEntryPath = normalizeJarEntryPath(curEntry.getName(), false);
                         if (curEntryPath.startsWith(metaInfEntryPath) && curEntryPath.endsWith(".tld")) {
                             addTldLocationFromTld(zipIn,
-                                    new ServletContextJarEntryTldLocation(jarResourcePath, curEntryPath)); 
+                                    new ServletContextJarEntryTldLocation(jarResourcePath, curEntryPath));
                         }
                     }
-                } finally {
-                    zipIn.close();
                 }
             } finally {
                 in.close();
@@ -706,15 +705,14 @@
                 LOG.debug("Scanning for " + META_INF_ABS_PATH + "**/*.tld-s in stream mode (slow): "
                         + rawJarContentUrlEF);
             }
-        
-            final InputStream in = new URL(rawJarContentUrlEF).openStream();
-            try {
+
+            try (InputStream in = new URL(rawJarContentUrlEF).openStream()) {
                 ZipInputStream zipIn = new ZipInputStream(in);
                 try {
                     while (true) {
                         ZipEntry curEntry = zipIn.getNextEntry();
                         if (curEntry == null) break;
-        
+
                         String curEntryPath = normalizeJarEntryPath(curEntry.getName(), false);
                         if (curEntryPath.startsWith(baseEntryPath) && curEntryPath.endsWith(".tld")) {
                             final String curEntryBaseRelativePath = curEntryPath.substring(baseEntryPath.length());
@@ -726,17 +724,15 @@
                     zipIn.close();
                 }
             } catch (ZipException e) {
-                // ZipException messages miss the zip URL 
+                // ZipException messages miss the zip URL
                 IOException ioe = new IOException("Error reading ZIP (see cause excepetion) from: "
-                            + rawJarContentUrlEF);
+                        + rawJarContentUrlEF);
                 try {
                     ioe.initCause(e);
                 } catch (Exception e2) {
                     throw e;
                 }
                 throw ioe;
-            } finally {
-                in.close();
             }
         }
     }
@@ -748,6 +744,7 @@
             }
             File[] tldFiles = dir.listFiles(new FilenameFilter() {
     
+                @Override
                 public boolean accept(File urlAsFile, String name) {
                     return isTldFileNameIgnoreCase(name);
                 }
@@ -769,11 +766,8 @@
      * Adds the TLD location mapping from the TLD itself.
      */
     private void addTldLocationFromTld(TldLocation tldLocation) throws IOException, SAXException {
-        InputStream in = tldLocation.getInputStream();
-        try {
+        try (InputStream in = tldLocation.getInputStream()) {
             addTldLocationFromTld(in, tldLocation);
-        } finally {
-            in.close();
         }
     }
 
@@ -1210,6 +1204,7 @@
             this.fileResourcePath = fileResourcePath;
         }
     
+        @Override
         public InputStream getInputStream() throws IOException {
             final InputStream in = servletContext.getResourceAsStream(fileResourcePath);
             if (in == null) {
@@ -1218,6 +1213,7 @@
             return in;
         }
     
+        @Override
         public String getXmlSystemId() throws IOException {
             final URL url = servletContext.getResource(fileResourcePath);
             return url != null ? url.toExternalForm() : null;
@@ -1254,6 +1250,7 @@
             return "classpath:" + resourcePath;
         }
     
+        @Override
         public InputStream getInputStream() throws IOException {
             ClassLoader tccl = tryGetThreadContextClassLoader();
             if (tccl != null) {
@@ -1266,6 +1263,7 @@
             return ClassUtil.getReasourceAsStream(getClass(), resourcePath, false);
         }
 
+        @Override
         public String getXmlSystemId() throws IOException {
             ClassLoader tccl = tryGetThreadContextClassLoader();
             if (tccl != null) {
@@ -1303,6 +1301,7 @@
             this.entryPath = entryPath != null ? normalizeJarEntryPath(entryPath, false) : null;
         }
 
+        @Override
         public InputStream getInputStream() throws IOException {
             if (entryUrl != null) {
                 try {
@@ -1377,6 +1376,7 @@
             }
         }
     
+        @Override
         public String getXmlSystemId() {
             return entryUrl != null ? entryUrl.toExternalForm() : null;
         }
@@ -1412,6 +1412,7 @@
             super(
                     tryCreateServletContextJarEntryUrl(servletContext, servletContextJarFilePath, entryPath),
                     new InputStreamFactory() {
+                        @Override
                         public InputStream getInputStream() {
                             return servletContext.getResourceAsStream(servletContextJarFilePath);
                         }
@@ -1434,10 +1435,12 @@
             this.file = file;
         }
 
+        @Override
         public InputStream getInputStream() throws IOException {
             return new FileInputStream(file);
         }
 
+        @Override
         public String getXmlSystemId() throws IOException {
             return file.toURI().toURL().toExternalForm();
         }
@@ -1456,10 +1459,12 @@
             tagsAndFunctions = parseToTagsAndFunctions(ctx, tldPath, wrapper);
         }
 
+        @Override
         public TemplateModel get(String key) {
             return (TemplateModel) tagsAndFunctions.get(key);
         }
 
+        @Override
         public boolean isEmpty() {
             return tagsAndFunctions.isEmpty();
         }
@@ -1467,12 +1472,9 @@
         private static final Map parseToTagsAndFunctions(
                 ServletContext ctx, TldLocation tldLocation, ObjectWrapper objectWrapper) throws IOException, SAXException {
             final TldParserForTaglibBuilding tldParser = new TldParserForTaglibBuilding(objectWrapper);
-            
-            InputStream in = tldLocation.getInputStream();
-            try {
+
+            try (InputStream in = tldLocation.getInputStream()) {
                 parseXml(in, tldLocation.getXmlSystemId(), tldParser);
-            } finally {
-                in.close();
             }
             
             EventForwarding eventForwarding = EventForwarding.getInstance(ctx);
@@ -1547,9 +1549,9 @@
             } else if (E_TAGLIB.equals(qName)) {
                 addTldLocation(
                         isJarPath(taglibLocationCData)
-                                ? (TldLocation) new ServletContextJarEntryTldLocation(
+                                ? new ServletContextJarEntryTldLocation(
                                         taglibLocationCData, DEFAULT_TLD_RESOURCE_PATH)
-                                : (TldLocation) new ServletContextTldLocation(taglibLocationCData),
+                                : new ServletContextTldLocation(taglibLocationCData),
                         taglibUriCData);
             }
         }
@@ -1610,7 +1612,7 @@
 
         private final BeansWrapper beansWrapper;
 
-        private final Map<String, TemplateModel> tagsAndFunctions = new HashMap<String, TemplateModel>();
+        private final Map<String, TemplateModel> tagsAndFunctions = new HashMap<>();
         private final List listeners = new ArrayList();
 
         private Locator locator;
@@ -1823,9 +1825,7 @@
                 throws TldParsingSAXException {
             try {
                 return ClassUtil.forName(className);
-            } catch (LinkageError e) {
-                throw newTLDEntryClassLoadingException(e, className, entryType, entryName);
-            } catch (ClassNotFoundException e) {
+            } catch (LinkageError | ClassNotFoundException e) {
                 throw newTLDEntryClassLoadingException(e, className, entryType, entryName);
             }
         }
@@ -1858,6 +1858,7 @@
      */
     private static final class EmptyContentEntityResolver implements EntityResolver {
         
+        @Override
         public InputSource resolveEntity(String publicId, String systemId) {
             InputSource is = new InputSource(new ByteArrayInputStream(new byte[0]));
             is.setPublicId(publicId);
@@ -1975,6 +1976,7 @@
             return "URLWithExternalForm(" + externalForm + ")";
         }
 
+        @Override
         public int compareTo(Object that) {
             return this.getExternalForm().compareTo(((URLWithExternalForm) that).getExternalForm());
         }
diff --git a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java b/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
index b7df303..d2fa19d 100644
--- a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
+++ b/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext2.java
@@ -57,6 +57,7 @@
      * to work you <b>must</b> have the Apache Commons-EL package in the classpath. If
      * Commons-EL is not available, this method will throw an UnsupportedOperationException. 
      */
+    @Override
     public ExpressionEvaluator getExpressionEvaluator() {
         try {
             Class type = Thread.currentThread().getContextClassLoader().loadClass
@@ -74,10 +75,12 @@
      * the page scope, request scope, session scope and application scope for an
      * attribute with a matching name.
      */
+    @Override
     public VariableResolver getVariableResolver() {
         final PageContext ctx = this;
 
         return new VariableResolver() {
+            @Override
             public Object resolveVariable(String name) throws ELException {
                 return ctx.findAttribute(name);
             }
@@ -87,6 +90,7 @@
     /**
      * Includes the specified path. The flush argument is ignored!
      */
+    @Override
     public void include(String path, boolean flush) throws IOException, ServletException {
         super.include(path);
     }
diff --git a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java b/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
index 998a5b0..d99e22c 100644
--- a/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
+++ b/src/main/java/freemarker/ext/jsp/_FreeMarkerPageContext21.java
@@ -67,6 +67,7 @@
         try {
             Class type = ((ClassLoader) AccessController.doPrivileged(
                     new PrivilegedAction() {
+                        @Override
                         public Object run() {
                             return Thread.currentThread().getContextClassLoader();
                         }
@@ -90,6 +91,7 @@
         final PageContext ctx = this;
 
         return new VariableResolver() {
+            @Override
             public Object resolveVariable(String name) throws ELException {
                 return ctx.findAttribute(name);
             }
diff --git a/src/main/java/freemarker/ext/jython/JythonHashModel.java b/src/main/java/freemarker/ext/jython/JythonHashModel.java
index 1a3e8df..cf06a9a 100644
--- a/src/main/java/freemarker/ext/jython/JythonHashModel.java
+++ b/src/main/java/freemarker/ext/jython/JythonHashModel.java
@@ -53,6 +53,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new JythonHashModel((PyObject) object, (JythonWrapper) wrapper);
             }
@@ -65,6 +66,7 @@
     /**
      * Returns {@link PyObject#__len__()}.
      */
+    @Override
     public int size() throws TemplateModelException {
         try {
             return object.__len__();
@@ -77,6 +79,7 @@
      * Returns either <code>object.__findattr__("keys").__call__()</code>
      * or <code>object.__findattr__("keySet").__call__()</code>.
      */
+    @Override
     public TemplateCollectionModel keys() throws TemplateModelException {
         try {
             PyObject method = object.__findattr__(KEYS);
@@ -97,6 +100,7 @@
     /**
      * Returns <code>object.__findattr__("values").__call__()</code>.
      */
+    @Override
     public TemplateCollectionModel values() throws TemplateModelException {
         try {
             PyObject method = object.__findattr__(VALUES);
diff --git a/src/main/java/freemarker/ext/jython/JythonModel.java b/src/main/java/freemarker/ext/jython/JythonModel.java
index 0438e2a..1ba588c 100644
--- a/src/main/java/freemarker/ext/jython/JythonModel.java
+++ b/src/main/java/freemarker/ext/jython/JythonModel.java
@@ -49,6 +49,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new JythonModel((PyObject) object, (JythonWrapper) wrapper);
             }
@@ -62,6 +63,7 @@
     /**
      * Returns the value of {@link PyObject#__nonzero__()}.
      */
+    @Override
     public boolean getAsBoolean() throws TemplateModelException {
         try {
             return object.__nonzero__();
@@ -73,6 +75,7 @@
     /**
      * Returns the value of {@link Object#toString()}.
      */
+    @Override
     public String getAsString() throws TemplateModelException {
         try {
             return object.toString();
@@ -88,6 +91,7 @@
      * with <code>false</code>, the order of calls is reversed (that is, item
      * lookup takes precedence over attribute lookup).
      */
+    @Override
     public TemplateModel get(String key)
     throws TemplateModelException {
         if (key != null) {
@@ -118,6 +122,7 @@
     /**
      * Returns {@link PyObject#__len__()}<code> == 0</code>.
      */
+    @Override
     public boolean isEmpty() throws TemplateModelException {
         try {
             return object.__len__() == 0;
@@ -129,6 +134,7 @@
     /**
      * @see freemarker.template.TemplateMethodModel#exec(List)
      */
+    @Override
     public Object exec(List arguments) throws TemplateModelException {
         int size = arguments.size();
         try {
@@ -159,6 +165,7 @@
         }
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         if (object == null) {
             return null;
@@ -170,6 +177,7 @@
         return view;
     }
     
+    @Override
     public Object getWrappedObject() {
         return object == null ? null : object.__tojava__(Object.class);
     }
diff --git a/src/main/java/freemarker/ext/jython/JythonNumberModel.java b/src/main/java/freemarker/ext/jython/JythonNumberModel.java
index a784b62..8d5a56e 100644
--- a/src/main/java/freemarker/ext/jython/JythonNumberModel.java
+++ b/src/main/java/freemarker/ext/jython/JythonNumberModel.java
@@ -41,6 +41,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new JythonNumberModel((PyObject) object, (JythonWrapper) wrapper);
             }
@@ -55,6 +56,7 @@
      * {@link java.lang.Number}.class as argument. If that fails, returns 
      * {@link PyObject#__float__()}.
      */
+    @Override
     public Number getAsNumber() throws TemplateModelException {
         try {
             Object value = object.__tojava__(java.lang.Number.class);
diff --git a/src/main/java/freemarker/ext/jython/JythonSequenceModel.java b/src/main/java/freemarker/ext/jython/JythonSequenceModel.java
index e92ed62..f5e37e2 100644
--- a/src/main/java/freemarker/ext/jython/JythonSequenceModel.java
+++ b/src/main/java/freemarker/ext/jython/JythonSequenceModel.java
@@ -42,6 +42,7 @@
     static final ModelFactory FACTORY =
         new ModelFactory()
         {
+            @Override
             public TemplateModel create(Object object, ObjectWrapper wrapper) {
                 return new JythonSequenceModel((PyObject) object, (JythonWrapper) wrapper);
             }
@@ -54,6 +55,7 @@
     /**
      * Returns {@link PyObject#__finditem__(int)}.
      */
+    @Override
     public TemplateModel get(int index) throws TemplateModelException {
         try {
             return wrapper.wrap(object.__finditem__(index));
@@ -65,6 +67,7 @@
     /**
      * Returns {@link PyObject#__len__()}.
      */
+    @Override
     public int size() throws TemplateModelException {
         try {
             return object.__len__();
@@ -73,15 +76,18 @@
         }
     }
 
+    @Override
     public TemplateModelIterator iterator() {
         return new TemplateModelIterator()
         {
             int i = 0;
             
+            @Override
             public boolean hasNext() throws TemplateModelException {
                 return i < size();
             }
 
+            @Override
             public TemplateModel next() throws TemplateModelException {
                 return get(i++);
             }
diff --git a/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java b/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
index 9b6c29d..ce14cb4 100644
--- a/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
+++ b/src/main/java/freemarker/ext/jython/JythonVersionAdapterHolder.java
@@ -58,11 +58,7 @@
                         "freemarker.ext.jython._Jython20And21VersionAdapter")
                     .newInstance();
             }
-        } catch (ClassNotFoundException e) {
-            throw adapterCreationException(e);
-        } catch (IllegalAccessException e) {
-            throw adapterCreationException(e);
-        } catch (InstantiationException e) {
+        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
             throw adapterCreationException(e);
         }
     }
diff --git a/src/main/java/freemarker/ext/jython/JythonWrapper.java b/src/main/java/freemarker/ext/jython/JythonWrapper.java
index c10d122..6ca7229 100644
--- a/src/main/java/freemarker/ext/jython/JythonWrapper.java
+++ b/src/main/java/freemarker/ext/jython/JythonWrapper.java
@@ -106,6 +106,7 @@
      * #unwrap(TemplateModel)}, the template model that was passed to
      * <code>unwrap</code> is returned.
      */
+    @Override
     public TemplateModel wrap(Object obj) {
         if (obj == null) {
             return null;
@@ -176,6 +177,7 @@
             this.model = model;
         }
         
+        @Override
         public TemplateModel getTemplateModel() {
             return model;
         }
@@ -221,11 +223,10 @@
                     for (int i = 0; i < args.length; ++i) {
                         list.add(
                             isEx 
-                            ? (Object) wrap(args[i]) 
-                            : (Object) (
-                                args[i] == null 
-                                ? null 
-                                : args[i].toString()));
+                            ? wrap(args[i])
+                            : args[i] == null
+                            ? null
+                            : args[i].toString());
                     }
                     return unwrap((TemplateModel) ((TemplateMethodModelEx) model).exec(list));
                 } catch (TemplateModelException e) {
diff --git a/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java b/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
index ddda4f0..fe16dc0 100644
--- a/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
+++ b/src/main/java/freemarker/ext/jython/_Jython20And21VersionAdapter.java
@@ -30,14 +30,17 @@
  */
 public class _Jython20And21VersionAdapter extends JythonVersionAdapter {
 
+    @Override
     public boolean isPyInstance(Object obj) {
         return obj instanceof PyJavaInstance;
     }
 
+    @Override
     public Object pyInstanceToJava(Object pyInstance) {
         return ((PyJavaInstance) pyInstance).__tojava__(java.lang.Object.class);
     }
 
+    @Override
     public String getPythonClassName(PyObject pyObject) {
         return pyObject.__class__.__name__;
     }
diff --git a/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java b/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
index 26277da..62f2e78 100644
--- a/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
+++ b/src/main/java/freemarker/ext/jython/_Jython22VersionAdapter.java
@@ -30,14 +30,17 @@
  */
 public class _Jython22VersionAdapter extends JythonVersionAdapter {
 
+    @Override
     public boolean isPyInstance(Object obj) {
         return obj instanceof PyJavaInstance;
     }
 
+    @Override
     public Object pyInstanceToJava(Object pyInstance) {
         return ((PyJavaInstance) pyInstance).__tojava__(java.lang.Object.class);
     }
 
+    @Override
     public String getPythonClassName(PyObject pyObject) {
         return pyObject.getType().getFullName();
     }
diff --git a/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java b/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
index 9827d1b..405059d 100644
--- a/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
+++ b/src/main/java/freemarker/ext/rhino/RhinoFunctionModel.java
@@ -44,6 +44,7 @@
         this.fnThis = fnThis;
     }
     
+    @Override
     public Object exec(List arguments) throws TemplateModelException {
         Context cx = Context.getCurrentContext();
         Object[] args = arguments.toArray();
diff --git a/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java b/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
index 76761d6..1efacbc 100644
--- a/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
+++ b/src/main/java/freemarker/ext/rhino/RhinoScriptableModel.java
@@ -45,6 +45,7 @@
 TemplateSequenceModel, AdapterTemplateModel, TemplateScalarModel, 
 TemplateBooleanModel, TemplateNumberModel {
     static final ModelFactory FACTORY = new ModelFactory() {
+        @Override
         public TemplateModel create(Object object, ObjectWrapper wrapper) {
             return new RhinoScriptableModel((Scriptable) object, 
                     (BeansWrapper) wrapper);
@@ -59,6 +60,7 @@
         this.wrapper = wrapper;
     }
     
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         Object retval = ScriptableObject.getProperty(scriptable, key);
         if (retval instanceof Function) {
@@ -68,6 +70,7 @@
         }
     }
     
+    @Override
     public TemplateModel get(int index) throws TemplateModelException {
         Object retval = ScriptableObject.getProperty(scriptable, index);
         if (retval instanceof Function) {
@@ -77,18 +80,22 @@
         }
     }
     
+    @Override
     public boolean isEmpty() {
         return scriptable.getIds().length == 0;
     }
     
+    @Override
     public TemplateCollectionModel keys() throws TemplateModelException {
         return (TemplateCollectionModel) wrapper.wrap(scriptable.getIds());
     }
     
+    @Override
     public int size() {
         return scriptable.getIds().length;
     }
     
+    @Override
     public TemplateCollectionModel values() throws TemplateModelException {
         Object[] ids = scriptable.getIds();
         Object[] values = new Object[ids.length];
@@ -105,14 +112,17 @@
         return (TemplateCollectionModel) wrapper.wrap(values);
     }
     
+    @Override
     public boolean getAsBoolean() {
         return Context.toBoolean(scriptable);
     }
     
+    @Override
     public Number getAsNumber() {
         return Double.valueOf(Context.toNumber(scriptable));
     }
     
+    @Override
     public String getAsString() {
         return Context.toString(scriptable);
     }
@@ -125,6 +135,7 @@
         return wrapper;
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         // FIXME: This does LS3 conversion, which is not very useful for us. Like it won't convert to List, Map, etc.  
         try {
diff --git a/src/main/java/freemarker/ext/rhino/RhinoWrapper.java b/src/main/java/freemarker/ext/rhino/RhinoWrapper.java
index b5dd3c5..359750b 100644
--- a/src/main/java/freemarker/ext/rhino/RhinoWrapper.java
+++ b/src/main/java/freemarker/ext/rhino/RhinoWrapper.java
@@ -43,6 +43,7 @@
     static {
         try {
             UNDEFINED_INSTANCE = AccessController.doPrivileged(new PrivilegedExceptionAction() {
+                @Override
                 public Object run() throws Exception {
                     return Undefined.class.getField("instance").get(null);
                 }
diff --git a/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java b/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
index dbfd69a..6ceeeb9 100644
--- a/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
+++ b/src/main/java/freemarker/ext/servlet/FreemarkerServlet.java
@@ -1061,9 +1061,7 @@
                     ATTR_REQUEST_PARAMETERS_MODEL);
             params.putUnlistedModel(KEY_REQUEST_PARAMETERS, requestParametersModel);
             return params;
-        } catch (ServletException e) {
-            throw new TemplateModelException(e);
-        } catch (IOException e) {
+        } catch (ServletException | IOException e) {
             throw new TemplateModelException(e);
         }
     }
@@ -1635,6 +1633,7 @@
             this.initParamValue = initParamValue;
         }
 
+        @Override
         public String getInitParamValue() {
             return initParamValue;
         }
@@ -1652,6 +1651,7 @@
             this.initParamValue = initParamValue;
         }
 
+        @Override
         public String getInitParamValue() {
             return initParamValue;
         }
@@ -1667,6 +1667,7 @@
             this.initParamValue = initParamValue;
         }
 
+        @Override
         public String getInitParamValue() {
             return initParamValue;
         }
diff --git a/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java b/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
index 2c0d574..0b60283 100644
--- a/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
+++ b/src/main/java/freemarker/ext/servlet/HttpRequestHashModel.java
@@ -59,14 +59,17 @@
         this.wrapper = wrapper;
     }
     
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         return wrapper.wrap(request.getAttribute(key));
     }
 
+    @Override
     public boolean isEmpty() {
         return !request.getAttributeNames().hasMoreElements();
     }
     
+    @Override
     public int size() {
         int result = 0;
         for (Enumeration enumeration = request.getAttributeNames(); enumeration.hasMoreElements(); ) {
@@ -76,6 +79,7 @@
         return result;
     }
     
+    @Override
     public TemplateCollectionModel keys() {
         ArrayList keys = new ArrayList();
         for (Enumeration enumeration = request.getAttributeNames(); enumeration.hasMoreElements(); ) {
@@ -84,6 +88,7 @@
         return new SimpleCollection(keys.iterator());
     }
     
+    @Override
     public TemplateCollectionModel values() {
         ArrayList values = new ArrayList();
         for (Enumeration enumeration = request.getAttributeNames(); enumeration.hasMoreElements(); ) {
diff --git a/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java b/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
index 4129aa6..f1d8f41 100644
--- a/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
+++ b/src/main/java/freemarker/ext/servlet/HttpRequestParametersHashModel.java
@@ -46,33 +46,41 @@
         this.request = request;
     }
 
+    @Override
     public TemplateModel get(String key) {
         String value = request.getParameter(key);
         return value == null ? null : new SimpleScalar(value);
     }
 
+    @Override
     public boolean isEmpty() {
         return !request.getParameterNames().hasMoreElements();
     }
     
+    @Override
     public int size() {
         return getKeys().size();
     }
     
+    @Override
     public TemplateCollectionModel keys() {
         return new SimpleCollection(getKeys().iterator());
     }
     
+    @Override
     public TemplateCollectionModel values() {
         final Iterator iter = getKeys().iterator();
         return new SimpleCollection(
             new Iterator() {
+                @Override
                 public boolean hasNext() {
                     return iter.hasNext();
                 }
+                @Override
                 public Object next() {
                     return request.getParameter((String) iter.next()); 
                 }
+                @Override
                 public void remove() {
                     throw new UnsupportedOperationException();
                 }
diff --git a/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java b/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
index 0434537..c3bf0fc 100644
--- a/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
+++ b/src/main/java/freemarker/ext/servlet/HttpSessionHashModel.java
@@ -77,6 +77,7 @@
         this.response = response;
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         checkSessionExistence();
         return wrapper.wrap(session != null ? session.getAttribute(key) : null);
@@ -103,6 +104,7 @@
             (session == null && request == null);
     }
     
+    @Override
     public boolean isEmpty()
     throws TemplateModelException {
         checkSessionExistence();
diff --git a/src/main/java/freemarker/ext/servlet/IncludePage.java b/src/main/java/freemarker/ext/servlet/IncludePage.java
index 774b71a..2f2b5be 100644
--- a/src/main/java/freemarker/ext/servlet/IncludePage.java
+++ b/src/main/java/freemarker/ext/servlet/IncludePage.java
@@ -68,7 +68,8 @@
         this.response = response;
     }
     
-    public void execute(final Environment env, Map params, 
+    @Override
+    public void execute(final Environment env, Map params,
             TemplateModel[] loopVars, TemplateDirectiveBody body)
     throws TemplateException, IOException {
         // Determine the path
@@ -226,7 +227,7 @@
         @Override
         public String[] getParameterValues(String name) {
             String[] value = ((String[]) paramsMap.get(name));
-            return value != null ? (String[]) value.clone() : null;
+            return value != null ? value.clone() : null;
         }
 
         @Override
diff --git a/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java b/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
index e917ccf..88c7253 100644
--- a/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
+++ b/src/main/java/freemarker/ext/servlet/ServletContextHashModel.java
@@ -54,10 +54,12 @@
         this.wrapper = wrapper;
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         return wrapper.wrap(servletctx.getAttribute(key));
     }
 
+    @Override
     public boolean isEmpty() {
         return !servletctx.getAttributeNames().hasMoreElements();
     }
diff --git a/src/main/java/freemarker/ext/util/IdentityHashMap.java b/src/main/java/freemarker/ext/util/IdentityHashMap.java
index 68b14ba..038d5ad 100644
--- a/src/main/java/freemarker/ext/util/IdentityHashMap.java
+++ b/src/main/java/freemarker/ext/util/IdentityHashMap.java
@@ -626,14 +626,17 @@
 
         // Map.Entry Ops
 
+        @Override
         public Object getKey() {
             return key;
         }
 
+        @Override
         public Object getValue() {
             return value;
         }
 
+        @Override
         public Object setValue(Object value) {
             Object oldValue = this.value;
             this.value = value;
@@ -677,14 +680,17 @@
 
         }
 
+        @Override
         public boolean hasNext() {
             return false;
         }
 
+        @Override
         public Object next() {
             throw new NoSuchElementException();
         }
 
+        @Override
         public void remove() {
             throw new IllegalStateException();
         }
@@ -709,6 +715,7 @@
             this.type = type;
         }
 
+        @Override
         public boolean hasNext() {
             Entry e = entry;
             int i = index;
@@ -721,6 +728,7 @@
             return e != null;
         }
 
+        @Override
         public Object next() {
             if (modCount != expectedModCount)
                 throw new ConcurrentModificationException();
@@ -743,6 +751,7 @@
             throw new NoSuchElementException();
         }
 
+        @Override
         public void remove() {
             if (lastReturned == null)
                 throw new IllegalStateException();
diff --git a/src/main/java/freemarker/ext/util/ModelCache.java b/src/main/java/freemarker/ext/util/ModelCache.java
index 8d6686c..6180f70 100644
--- a/src/main/java/freemarker/ext/util/ModelCache.java
+++ b/src/main/java/freemarker/ext/util/ModelCache.java
@@ -47,8 +47,8 @@
     public synchronized void setUseCache(boolean useCache) {
         this.useCache = useCache;
         if (useCache) {
-            modelCache = new IdentityHashMap<Object, ModelReference>();
-            refQueue = new ReferenceQueue<TemplateModel>();
+            modelCache = new IdentityHashMap<>();
+            refQueue = new ReferenceQueue<>();
         } else {
             modelCache = null;
             refQueue = null;
@@ -136,7 +136,7 @@
         }
 
         TemplateModel getModel() {
-            return (TemplateModel) this.get();
+            return this.get();
         }
     }
 
diff --git a/src/main/java/freemarker/ext/xml/Namespaces.java b/src/main/java/freemarker/ext/xml/Namespaces.java
index 730b79a..5a09b9a 100644
--- a/src/main/java/freemarker/ext/xml/Namespaces.java
+++ b/src/main/java/freemarker/ext/xml/Namespaces.java
@@ -59,6 +59,7 @@
         }   
     }
     
+    @Override
     public Object exec(List arguments) throws TemplateModelException {
         if (arguments.size() != 2) {
             throw new TemplateModelException("_registerNamespace(prefix, uri) requires two arguments");
diff --git a/src/main/java/freemarker/ext/xml/Navigator.java b/src/main/java/freemarker/ext/xml/Navigator.java
index 1065868..fc1ca2b 100644
--- a/src/main/java/freemarker/ext/xml/Navigator.java
+++ b/src/main/java/freemarker/ext/xml/Navigator.java
@@ -153,18 +153,21 @@
     }
 
     private class ChildrenOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             getChildren(node, localName, namespaceUri, result);
         }
     }
 
     private class AttributesOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             getAttributes(node, localName, namespaceUri, result);
         }
     }
 
     private class DescendantOrSelfOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             result.add(node);
             getDescendants(node, result);
@@ -172,12 +175,14 @@
     }
 
     private class DescendantOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             getDescendants(node, result);
         }
     }
 
     private class AncestorOrSelfOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             result.add(node);
             getAncestors(node, result);
@@ -185,12 +190,14 @@
     }
 
     private class AncestorOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             getAncestors(node, result);
         }
     }
 
     private class ParentOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             Object parent = getParent(node);
             if (parent != null) {
@@ -200,6 +207,7 @@
     }
 
     private class DocumentOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             Object document = getDocument(node);
             if (document != null) {
@@ -209,6 +217,7 @@
     }
 
     private class DocumentTypeOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             Object documentType = getDocumentType(node);
             if (documentType != null) {
@@ -218,12 +227,14 @@
     }
 
     private class ContentOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             getContent(node, result);
         }
     }
 
     private class TextOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             String text = getText(node);
             if (text != null) {
@@ -233,6 +244,7 @@
     }
 
     private class LocalNameOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             String text = getLocalName(node);
             if (text != null) {
@@ -242,6 +254,7 @@
     }
 
     private class QualifiedNameOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             String qname = getQualifiedName(node);
             if (qname != null) {
@@ -251,6 +264,7 @@
     }
 
     private class NamespacePrefixOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             String text = getNamespacePrefix(node);
             if (text != null) {
@@ -260,6 +274,7 @@
     }
 
     private class NamespaceUriOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             String text = getNamespaceUri(node);
             if (text != null) {
@@ -269,6 +284,7 @@
     }
 
     private class TypeOp implements NodeOperator {
+        @Override
         public void process(Object node, String localName, String namespaceUri, List result) {
             result.add(getType(node));
         }
diff --git a/src/main/java/freemarker/ext/xml/NodeListModel.java b/src/main/java/freemarker/ext/xml/NodeListModel.java
index af4e055..2f96767 100644
--- a/src/main/java/freemarker/ext/xml/NodeListModel.java
+++ b/src/main/java/freemarker/ext/xml/NodeListModel.java
@@ -148,6 +148,7 @@
      * Returns the number of nodes in this model's nodelist.
      * @see freemarker.template.TemplateSequenceModel#size()
      */
+    @Override
     public int size() {
         return nodes.size();
     }
@@ -160,6 +161,7 @@
      * expression to this model's nodelist.
      * @see freemarker.template.TemplateMethodModel#exec(List)
      */
+    @Override
     public Object exec(List arguments) throws TemplateModelException {
         if (arguments.size() != 1) {
             throw new TemplateModelException(
@@ -179,6 +181,7 @@
      * XML"). 
      * @see freemarker.template.TemplateScalarModel#getAsString()
      */
+    @Override
     public String getAsString() throws TemplateModelException {
         StringWriter sw = new StringWriter(size() * 128);
         for (Iterator iter = nodes.iterator(); iter.hasNext(); ) {
@@ -198,6 +201,7 @@
      * @param index the ordinal number of the selected node 
      * @see freemarker.template.TemplateSequenceModel#get(int)
      */
+    @Override
     public TemplateModel get(int index) {
         return deriveModel(Collections.singletonList(nodes.get(index)));
     }
@@ -380,6 +384,7 @@
      * the operator to this model's nodes.
      * @see freemarker.template.TemplateHashModel#get(String)
      */
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         // Try a built-in navigator operator
         NodeOperator op = navigator.getOperator(key);
@@ -434,6 +439,7 @@
      * Returns true if this NodeListModel contains no nodes. 
      * @see freemarker.template.TemplateHashModel#isEmpty()
      */
+    @Override
     public boolean isEmpty() {
         return nodes.isEmpty();
     }
@@ -454,6 +460,7 @@
     private class FilterByType
     implements
         TemplateMethodModel {
+        @Override
         public Object exec(List arguments) {
             List filteredNodes = new ArrayList();
             for (Iterator iter = arguments.iterator(); iter.hasNext(); ) {
@@ -503,21 +510,26 @@
         }
     }
 
+    @Override
     public TemplateSequenceModel getChildNodes() throws TemplateModelException {
         return (TemplateSequenceModel) get("_content");
     }
 
+    @Override
     public String getNodeName() throws TemplateModelException {
         return getUniqueText((NodeListModel) get("_name"), "name");
     }
 
+    @Override
     public String getNodeNamespace() throws TemplateModelException {
         return getUniqueText((NodeListModel) get("_nsuri"), "namespace");
     }
 
+    @Override
     public String getNodeType() throws TemplateModelException {
         return getUniqueText((NodeListModel) get("_type"), "type");
     }
+    @Override
     public TemplateNodeModel getParentNode() throws TemplateModelException {
         return (TemplateNodeModel) get("_parent"); 
     }
diff --git a/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java b/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
index 23b631d..28bc2fc 100644
--- a/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
+++ b/src/main/java/freemarker/ext/xml/_Dom4jNavigator.java
@@ -232,6 +232,7 @@
             super(path);
         }
 
+        @Override
         public List selectNodes(Object object, NamespaceContext namespaces)
         throws TemplateModelException {
             Context context = getContext(object);
diff --git a/src/main/java/freemarker/ext/xml/_DomNavigator.java b/src/main/java/freemarker/ext/xml/_DomNavigator.java
index a8fa538..e41053a 100644
--- a/src/main/java/freemarker/ext/xml/_DomNavigator.java
+++ b/src/main/java/freemarker/ext/xml/_DomNavigator.java
@@ -317,6 +317,7 @@
             super(path);
         }
 
+        @Override
         public List selectNodes(Object object, NamespaceContext namespaces)
         throws TemplateModelException {
             Context context = getContext(object);
diff --git a/src/main/java/freemarker/ext/xml/_JdomNavigator.java b/src/main/java/freemarker/ext/xml/_JdomNavigator.java
index 6ff4440..edbc0a1 100644
--- a/src/main/java/freemarker/ext/xml/_JdomNavigator.java
+++ b/src/main/java/freemarker/ext/xml/_JdomNavigator.java
@@ -332,6 +332,7 @@
             super(path);
         }
 
+        @Override
         public List selectNodes(Object object, NamespaceContext namespaces)
         throws TemplateModelException {
             Context context = getContext(object);
diff --git a/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java b/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
index de64490..28c88d9 100644
--- a/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
+++ b/src/main/java/freemarker/log/CommonsLoggingLoggerFactory.java
@@ -26,6 +26,7 @@
 @Deprecated
 public class CommonsLoggingLoggerFactory implements LoggerFactory {
 
+    @Override
     public Logger getLogger(String category) {
             return new CommonsLoggingLogger(
                             org.apache.commons.logging.LogFactory.getLog(category));
diff --git a/src/main/java/freemarker/log/Logger.java b/src/main/java/freemarker/log/Logger.java
index c60310e..be7f965 100644
--- a/src/main/java/freemarker/log/Logger.java
+++ b/src/main/java/freemarker/log/Logger.java
@@ -551,6 +551,7 @@
         try {
             return (String) AccessController.doPrivileged(
                     new PrivilegedAction() {
+                        @Override
                         public Object run() {
                             return System.getProperty(key, null);
                         }
diff --git a/src/main/java/freemarker/log/SLF4JLoggerFactory.java b/src/main/java/freemarker/log/SLF4JLoggerFactory.java
index f98a1b5..f18b054 100644
--- a/src/main/java/freemarker/log/SLF4JLoggerFactory.java
+++ b/src/main/java/freemarker/log/SLF4JLoggerFactory.java
@@ -28,6 +28,7 @@
 @Deprecated
 public class SLF4JLoggerFactory implements LoggerFactory {
 
+    @Override
     public Logger getLogger(String category) {
             org.slf4j.Logger slf4jLogger = org.slf4j.LoggerFactory.getLogger(category);
             if (slf4jLogger instanceof LocationAwareLogger) {
diff --git a/src/main/java/freemarker/log/_AvalonLoggerFactory.java b/src/main/java/freemarker/log/_AvalonLoggerFactory.java
index 9b5e50c..8058a73 100644
--- a/src/main/java/freemarker/log/_AvalonLoggerFactory.java
+++ b/src/main/java/freemarker/log/_AvalonLoggerFactory.java
@@ -26,6 +26,7 @@
  * compliance issues. FreeMarker developers only: treat this class as package-visible.
  */
 public class _AvalonLoggerFactory implements LoggerFactory {
+    @Override
     public Logger getLogger(String category) {
         return new AvalonLogger(Hierarchy.getDefaultHierarchy().getLoggerFor(category));
     }
diff --git a/src/main/java/freemarker/log/_JULLoggerFactory.java b/src/main/java/freemarker/log/_JULLoggerFactory.java
index 475db7f..e596879 100644
--- a/src/main/java/freemarker/log/_JULLoggerFactory.java
+++ b/src/main/java/freemarker/log/_JULLoggerFactory.java
@@ -26,6 +26,7 @@
  * compliance issues. FreeMarker developers only: treat this class as package-visible.
  */
 public class _JULLoggerFactory implements LoggerFactory {
+    @Override
     public Logger getLogger(String category) {
         return new JULLogger(java.util.logging.Logger.getLogger(category));
     }
diff --git a/src/main/java/freemarker/log/_Log4jLoggerFactory.java b/src/main/java/freemarker/log/_Log4jLoggerFactory.java
index 9547bbd..2391a2e 100644
--- a/src/main/java/freemarker/log/_Log4jLoggerFactory.java
+++ b/src/main/java/freemarker/log/_Log4jLoggerFactory.java
@@ -26,6 +26,7 @@
  * compliance issues. FreeMarker developers only: treat this class as package-visible.
  */
 public class _Log4jLoggerFactory implements LoggerFactory {
+    @Override
     public Logger getLogger(String category) {
         return new Log4jLogger(org.apache.log4j.Logger.getLogger(category));
     }
diff --git a/src/main/java/freemarker/log/_NullLoggerFactory.java b/src/main/java/freemarker/log/_NullLoggerFactory.java
index 85cff74..d34d7c3 100644
--- a/src/main/java/freemarker/log/_NullLoggerFactory.java
+++ b/src/main/java/freemarker/log/_NullLoggerFactory.java
@@ -27,6 +27,7 @@
     _NullLoggerFactory() {
     }
     
+    @Override
     public Logger getLogger(String category) {
         return INSTANCE;
     }
diff --git a/src/main/java/freemarker/template/Configuration.java b/src/main/java/freemarker/template/Configuration.java
index 3f0031d..db736df 100644
--- a/src/main/java/freemarker/template/Configuration.java
+++ b/src/main/java/freemarker/template/Configuration.java
@@ -373,7 +373,7 @@
     
     private static final Map<String, OutputFormat> STANDARD_OUTPUT_FORMATS;
     static {
-        STANDARD_OUTPUT_FORMATS = new HashMap<String, OutputFormat>();
+        STANDARD_OUTPUT_FORMATS = new HashMap<>();
         STANDARD_OUTPUT_FORMATS.put(UndefinedOutputFormat.INSTANCE.getName(), UndefinedOutputFormat.INSTANCE);
         STANDARD_OUTPUT_FORMATS.put(HTMLOutputFormat.INSTANCE.getName(), HTMLOutputFormat.INSTANCE);
         STANDARD_OUTPUT_FORMATS.put(XHTMLOutputFormat.INSTANCE.getName(), XHTMLOutputFormat.INSTANCE);
@@ -1919,6 +1919,7 @@
     /**
      * The getter pair of {@link #setStrictSyntaxMode}.
      */
+    @Override
     public boolean getStrictSyntaxMode() {
         return strictSyntax;
     }
@@ -2002,6 +2003,7 @@
      * @return Never {@code null}. 
      * @since 2.3.20
      */
+    @Override
     public Version getIncompatibleImprovements() {
         return incompatibleImprovements;
     }
@@ -2045,6 +2047,7 @@
      *
      * @see #setWhitespaceStripping
      */
+    @Override
     public boolean getWhitespaceStripping() {
         return whitespaceStripping;
     }
@@ -2113,6 +2116,7 @@
      * 
      * @since 2.3.24
      */
+    @Override
     public int getAutoEscapingPolicy() {
         return autoEscapingPolicy;
     }
@@ -2161,6 +2165,7 @@
      * 
      * @since 2.3.24
      */
+    @Override
     public OutputFormat getOutputFormat() {
         return outputFormat;
     }
@@ -2236,7 +2241,7 @@
                 sb.append(StringUtil.jQuote(name));
                 sb.append(". The output formats registered in the Configuration are: ");
                 
-                Set<String> registeredNames = new TreeSet<String>();
+                Set<String> registeredNames = new TreeSet<>();
                 registeredNames.addAll(STANDARD_OUTPUT_FORMATS.keySet());
                 registeredNames.addAll(registeredCustomOutputFormats.keySet());
                 
@@ -2296,7 +2301,7 @@
      */
     public void setRegisteredCustomOutputFormats(Collection<? extends OutputFormat> registeredCustomOutputFormats) {
         NullArgumentException.check(registeredCustomOutputFormats);
-        Map<String, OutputFormat> m = new LinkedHashMap<String, OutputFormat>(
+        Map<String, OutputFormat> m = new LinkedHashMap<>(
                 registeredCustomOutputFormats.size() * 4 / 3, 1f);
         for (OutputFormat outputFormat : registeredCustomOutputFormats) {
             String name = outputFormat.getName();
@@ -2413,6 +2418,7 @@
      * 
      * @since 2.3.24
      */
+    @Override
     public boolean getRecognizeStandardFileExtensions() {
         return recognizeStandardFileExtensions == null
                 ? incompatibleImprovements.intValue() >= _TemplateAPI.VERSION_INT_2_3_24
@@ -2456,6 +2462,7 @@
     /**
      * The getter pair of {@link #setTagSyntax(int)}.
      */
+    @Override
     public int getTagSyntax() {
         return tagSyntax;
     }
@@ -2484,6 +2491,7 @@
      * 
      * @since 2.3.28
      */
+    @Override
     public int getInterpolationSyntax() {
         return interpolationSyntax;
     }
@@ -2549,6 +2557,7 @@
      * 
      * @since 2.3.23
      */
+    @Override
     public int getNamingConvention() {
         return namingConvention;
     }
@@ -2583,6 +2592,7 @@
      * 
      * @since 2.3.25
      */
+    @Override
     public int getTabSize() {
         return tabSize;
     }
@@ -3476,9 +3486,9 @@
      */
     @Override
     public Set<String> getSettingNames(boolean camelCase) {
-        return new _UnmodifiableCompositeSet<String>(
+        return new _UnmodifiableCompositeSet<>(
                 super.getSettingNames(camelCase),
-                new _SortedArraySet<String>(camelCase ? SETTING_NAMES_CAMEL_CASE : SETTING_NAMES_SNAKE_CASE)); 
+                new _SortedArraySet<>(camelCase ? SETTING_NAMES_CAMEL_CASE : SETTING_NAMES_SNAKE_CASE));
     }
     
     @Override
diff --git a/src/main/java/freemarker/template/DefaultArrayAdapter.java b/src/main/java/freemarker/template/DefaultArrayAdapter.java
index 645e7ea..6fa7ac0 100644
--- a/src/main/java/freemarker/template/DefaultArrayAdapter.java
+++ b/src/main/java/freemarker/template/DefaultArrayAdapter.java
@@ -97,6 +97,7 @@
         super(wrapper);
     }
 
+    @Override
     public final Object getAdaptedObject(Class hint) {
         return getWrappedObject();
     }
@@ -110,14 +111,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(array[index]) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -133,14 +137,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Byte.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -156,14 +163,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Short.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -179,14 +189,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Integer.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -202,14 +215,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Long.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -225,14 +241,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Float.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -248,14 +267,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Double.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -271,14 +293,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Character.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -294,14 +319,17 @@
             this.array = array;
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < array.length ? wrap(Boolean.valueOf(array[index])) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return array.length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
@@ -322,14 +350,17 @@
             length = Array.getLength(array);
         }
 
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return index >= 0 && index < length ? wrap(Array.get(array, index)) : null;
         }
 
+        @Override
         public int size() throws TemplateModelException {
             return length;
         }
 
+        @Override
         public Object getWrappedObject() {
             return array;
         }
diff --git a/src/main/java/freemarker/template/DefaultEnumerationAdapter.java b/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
index 6a26fc1..fdd0bea 100644
--- a/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
+++ b/src/main/java/freemarker/template/DefaultEnumerationAdapter.java
@@ -56,18 +56,22 @@
         this.enumeration = enumeration;
     }
 
+    @Override
     public Object getWrappedObject() {
         return enumeration;
     }
 
+    @Override
     public Object getAdaptedObject(Class<?> hint) {
         return getWrappedObject();
     }
 
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         return new SimpleTemplateModelIterator();
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(enumeration);
     }
@@ -79,6 +83,7 @@
 
         private boolean enumerationOwnedByMe;
 
+        @Override
         public TemplateModel next() throws TemplateModelException {
             if (!enumerationOwnedByMe) {
                 checkNotOwner();
@@ -94,6 +99,7 @@
             return value instanceof TemplateModel ? (TemplateModel) value : wrap(value);
         }
 
+        @Override
         public boolean hasNext() throws TemplateModelException {
             // Calling hasNext may looks safe, but I have met sync. problems.
             if (!enumerationOwnedByMe) {
diff --git a/src/main/java/freemarker/template/DefaultIterableAdapter.java b/src/main/java/freemarker/template/DefaultIterableAdapter.java
index 7438ff9..24a07ea 100644
--- a/src/main/java/freemarker/template/DefaultIterableAdapter.java
+++ b/src/main/java/freemarker/template/DefaultIterableAdapter.java
@@ -67,18 +67,22 @@
         this.iterable = iterable;
     }
 
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         return new IteratorToTemplateModelIteratorAdapter(iterable.iterator(), getObjectWrapper());
     }
 
+    @Override
     public Object getWrappedObject() {
         return iterable;
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         return getWrappedObject();
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(iterable);
     }
diff --git a/src/main/java/freemarker/template/DefaultIteratorAdapter.java b/src/main/java/freemarker/template/DefaultIteratorAdapter.java
index 150e51f..8f8d0c3 100644
--- a/src/main/java/freemarker/template/DefaultIteratorAdapter.java
+++ b/src/main/java/freemarker/template/DefaultIteratorAdapter.java
@@ -65,18 +65,22 @@
         this.iterator = iterator;
     }
 
+    @Override
     public Object getWrappedObject() {
         return iterator;
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         return getWrappedObject();
     }
 
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         return new SimpleTemplateModelIterator();
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(iterator);
     }
@@ -88,6 +92,7 @@
 
         private boolean iteratorOwnedByMe;
 
+        @Override
         public TemplateModel next() throws TemplateModelException {
             if (!iteratorOwnedByMe) {
                 checkNotOwner();
@@ -103,6 +108,7 @@
             return value instanceof TemplateModel ? (TemplateModel) value : wrap(value);
         }
 
+        @Override
         public boolean hasNext() throws TemplateModelException {
             // Calling hasNext may looks safe, but I have met sync. problems.
             if (!iteratorOwnedByMe) {
diff --git a/src/main/java/freemarker/template/DefaultListAdapter.java b/src/main/java/freemarker/template/DefaultListAdapter.java
index 3585ed8..1f84c30 100644
--- a/src/main/java/freemarker/template/DefaultListAdapter.java
+++ b/src/main/java/freemarker/template/DefaultListAdapter.java
@@ -72,18 +72,22 @@
         this.list = list;
     }
 
+    @Override
     public TemplateModel get(int index) throws TemplateModelException {
         return index >= 0 && index < list.size() ? wrap(list.get(index)) : null;
     }
 
+    @Override
     public int size() throws TemplateModelException {
         return list.size();
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         return getWrappedObject();
     }
 
+    @Override
     public Object getWrappedObject() {
         return list;
     }
@@ -95,12 +99,14 @@
             super(list, wrapper);
         }
 
+        @Override
         public TemplateModelIterator iterator() throws TemplateModelException {
             return new IteratorToTemplateModelIteratorAdapter(list.iterator(), getObjectWrapper());
         }
 
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(list);
     }
diff --git a/src/main/java/freemarker/template/DefaultMapAdapter.java b/src/main/java/freemarker/template/DefaultMapAdapter.java
index 3039e4c..a892aae 100644
--- a/src/main/java/freemarker/template/DefaultMapAdapter.java
+++ b/src/main/java/freemarker/template/DefaultMapAdapter.java
@@ -67,6 +67,7 @@
         this.map = map;
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         Object val;
         try {
@@ -118,34 +119,42 @@
         return wrap(val);
     }
 
+    @Override
     public boolean isEmpty() {
         return map.isEmpty();
     }
 
+    @Override
     public int size() {
         return map.size();
     }
 
+    @Override
     public TemplateCollectionModel keys() {
         return new SimpleCollection(map.keySet(), getObjectWrapper());
     }
 
+    @Override
     public TemplateCollectionModel values() {
         return new SimpleCollection(map.values(), getObjectWrapper());
     }
 
+    @Override
     public KeyValuePairIterator keyValuePairIterator() {
         return new MapKeyValuePairIterator(map, getObjectWrapper());
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         return map;
     }
 
+    @Override
     public Object getWrappedObject() {
         return map;
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(map);
     }
diff --git a/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java b/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
index ab87cc6..2da89a4 100644
--- a/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
+++ b/src/main/java/freemarker/template/DefaultNonListCollectionAdapter.java
@@ -69,22 +69,27 @@
         this.collection = collection;
     }
 
+    @Override
     public TemplateModelIterator iterator() throws TemplateModelException {
         return new IteratorToTemplateModelIteratorAdapter(collection.iterator(), getObjectWrapper());
     }
 
+    @Override
     public int size() {
         return collection.size();
     }
 
+    @Override
     public boolean isEmpty() {
         return collection.isEmpty();
     }
 
+    @Override
     public Object getWrappedObject() {
         return collection;
     }
 
+    @Override
     public Object getAdaptedObject(Class hint) {
         return getWrappedObject();
     }
@@ -96,11 +101,12 @@
         } catch (ClassCastException e) {
             throw new _TemplateModelException(e,
                     "Failed to check if the collection contains the item. Probably the item's Java type, ",
-                    itemPojo != null ? new _DelayedShortClassName(itemPojo.getClass()) : (Object) "Null",
+                    itemPojo != null ? new _DelayedShortClassName(itemPojo.getClass()) : "Null",
                     ", doesn't match the type of (some of) the collection items; see cause exception.");
         }
     }
 
+    @Override
     public TemplateModel getAPI() throws TemplateModelException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(collection);
     }
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapper.java b/src/main/java/freemarker/template/DefaultObjectWrapper.java
index eac0198..c0337db 100644
--- a/src/main/java/freemarker/template/DefaultObjectWrapper.java
+++ b/src/main/java/freemarker/template/DefaultObjectWrapper.java
@@ -221,8 +221,8 @@
                     return DefaultListAdapter.adapt((List<?>) obj, this);
                 } else {
                     return forceLegacyNonListCollections
-                            ? (TemplateModel) new SimpleSequence((Collection<?>) obj, this)
-                            : (TemplateModel) DefaultNonListCollectionAdapter.adapt((Collection<?>) obj, this);
+                            ? new SimpleSequence((Collection<?>) obj, this)
+                            : DefaultNonListCollectionAdapter.adapt((Collection<?>) obj, this);
                 }
             } else {
                 return new SimpleSequence((Collection<?>) obj, this);
@@ -230,16 +230,16 @@
         }
         if (obj instanceof Map) {
             return useAdaptersForContainers
-                    ? (TemplateModel) DefaultMapAdapter.adapt((Map<?, ?>) obj, this)
-                    : (TemplateModel) new SimpleHash((Map<?, ?>) obj, this);
+                    ? DefaultMapAdapter.adapt((Map<?, ?>) obj, this)
+                    : new SimpleHash((Map<?, ?>) obj, this);
         }
         if (obj instanceof Boolean) {
             return obj.equals(Boolean.TRUE) ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
         }
         if (obj instanceof Iterator) {
             return useAdaptersForContainers
-                    ? (TemplateModel) DefaultIteratorAdapter.adapt((Iterator<?>) obj, this)
-                    : (TemplateModel) new SimpleCollection((Iterator<?>) obj, this);
+                    ? DefaultIteratorAdapter.adapt((Iterator<?>) obj, this)
+                    : new SimpleCollection((Iterator<?>) obj, this);
         }
         if (useAdapterForEnumerations && obj instanceof Enumeration) {
             return DefaultEnumerationAdapter.adapt((Enumeration<?>) obj, this);
diff --git a/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java b/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
index e73fa8b..dc925db 100644
--- a/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
+++ b/src/main/java/freemarker/template/DefaultObjectWrapperBuilder.java
@@ -39,10 +39,9 @@
 public class DefaultObjectWrapperBuilder extends DefaultObjectWrapperConfiguration {
 
     private final static Map<ClassLoader, Map<DefaultObjectWrapperConfiguration, WeakReference<DefaultObjectWrapper>>>
-            INSTANCE_CACHE = new WeakHashMap<
-                    ClassLoader, Map<DefaultObjectWrapperConfiguration, WeakReference<DefaultObjectWrapper>>>();
+            INSTANCE_CACHE = new WeakHashMap<>();
     private final static ReferenceQueue<DefaultObjectWrapper> INSTANCE_CACHE_REF_QUEUE
-            = new ReferenceQueue<DefaultObjectWrapper>();
+            = new ReferenceQueue<>();
     
     /**
      * Creates a builder that creates a {@link DefaultObjectWrapper} with the given {@code incompatibleImprovements};
@@ -74,6 +73,7 @@
     
         private static final DefaultObjectWrapperFactory INSTANCE = new DefaultObjectWrapperFactory(); 
         
+        @Override
         public DefaultObjectWrapper create(DefaultObjectWrapperConfiguration bwConf) {
             return new DefaultObjectWrapper(bwConf, true);
         }
diff --git a/src/main/java/freemarker/template/EmptyMap.java b/src/main/java/freemarker/template/EmptyMap.java
index 763ac93..354a541 100644
--- a/src/main/java/freemarker/template/EmptyMap.java
+++ b/src/main/java/freemarker/template/EmptyMap.java
@@ -35,38 +35,47 @@
 public class EmptyMap implements Map, Cloneable {
     public static final EmptyMap instance = new EmptyMap(); 
     
+    @Override
     public void clear() {
         // no op
     }
     
+    @Override
     public boolean containsKey(Object arg0) {
         return false;
     }
     
+    @Override
     public boolean containsValue(Object arg0) {
         return false;
     }
     
+    @Override
     public Set entrySet() {
         return Collections.EMPTY_SET;
     }
     
+    @Override
     public Object get(Object arg0) {
         return null;
     }
     
+    @Override
     public boolean isEmpty() {
         return true;
     }
     
+    @Override
     public Set keySet() {
         return Collections.EMPTY_SET;
     }
     
+    @Override
     public Object put(Object arg0, Object arg1) {
         throw new UnsupportedOperationException("This Map is read-only.");
     }
     
+    @Override
     public void putAll(Map arg0) {
         // Checking for arg0.isEmpty() wouldn't reflect precisely how putAll in
         // AbstractMap works. 
@@ -75,14 +84,17 @@
         }
     }
     
+    @Override
     public Object remove(Object arg0) {
         return null;
     }
     
+    @Override
     public int size() {
         return 0;
     }
     
+    @Override
     public Collection values() {
         return Collections.EMPTY_LIST;
     }
diff --git a/src/main/java/freemarker/template/FalseTemplateBooleanModel.java b/src/main/java/freemarker/template/FalseTemplateBooleanModel.java
index 02628c8..7bbcc49 100644
--- a/src/main/java/freemarker/template/FalseTemplateBooleanModel.java
+++ b/src/main/java/freemarker/template/FalseTemplateBooleanModel.java
@@ -24,6 +24,7 @@
  */
 final class FalseTemplateBooleanModel implements SerializableTemplateBooleanModel {
     
+    @Override
     public boolean getAsBoolean() {
         return false;
     }
diff --git a/src/main/java/freemarker/template/GeneralPurposeNothing.java b/src/main/java/freemarker/template/GeneralPurposeNothing.java
index cb2d3af..67dbfe9 100644
--- a/src/main/java/freemarker/template/GeneralPurposeNothing.java
+++ b/src/main/java/freemarker/template/GeneralPurposeNothing.java
@@ -41,42 +41,52 @@
         return instance;
     }
 
+    @Override
     public String getAsString() {
         return "";
     }
 
+    @Override
     public boolean getAsBoolean() {
         return false;
     }
 
+    @Override
     public boolean isEmpty() {
         return true;
     }
 
+    @Override
     public int size() {
         return 0;
     }
 
+    @Override
     public TemplateModel get(int i) throws TemplateModelException {
         throw new TemplateModelException("Can't get item from an empty sequence.");
     }
 
+    @Override
     public TemplateModel get(String key) {
         return null;
     }
 
+    @Override
     public Object exec(List args) {
         return null;
     }
     
+    @Override
     public TemplateCollectionModel keys() {
         return Constants.EMPTY_COLLECTION;
     }
 
+    @Override
     public TemplateCollectionModel values() {
         return Constants.EMPTY_COLLECTION;
     }
 
+    @Override
     public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
         return Constants.EMPTY_KEY_VALUE_PAIR_ITERATOR;
     }
diff --git a/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java b/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
index 6b49237..594cd65 100644
--- a/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
+++ b/src/main/java/freemarker/template/IteratorToTemplateModelIteratorAdapter.java
@@ -35,6 +35,7 @@
         this.wrapper = wrapper;
     }
 
+    @Override
     public TemplateModel next() throws TemplateModelException {
         try {
             return wrapper.wrap(it.next());
@@ -43,6 +44,7 @@
         }
     }
 
+    @Override
     public boolean hasNext() throws TemplateModelException {
         return it.hasNext();
     }
diff --git a/src/main/java/freemarker/template/LocalizedString.java b/src/main/java/freemarker/template/LocalizedString.java
index f65267c..943c7de 100755
--- a/src/main/java/freemarker/template/LocalizedString.java
+++ b/src/main/java/freemarker/template/LocalizedString.java
@@ -44,7 +44,8 @@
 abstract public class LocalizedString implements TemplateScalarModel {
 	
 	
-	public String getAsString() throws TemplateModelException {
+	@Override
+    public String getAsString() throws TemplateModelException {
 		Environment env = Environment.getCurrentEnvironment();
 		Locale locale = env.getLocale();
 		return getLocalizedString(locale);
diff --git a/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java b/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
index 19c3893..09e54f6 100644
--- a/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
+++ b/src/main/java/freemarker/template/LoggingAttemptExceptionReporter.java
@@ -35,6 +35,7 @@
         this.logAsWarn = logAsWarn;
     }
 
+    @Override
     public void report(TemplateException te, Environment env) {
         String message = "Error executing FreeMarker template part in the #attempt block";
         if (!logAsWarn) {
diff --git a/src/main/java/freemarker/template/MapKeyValuePairIterator.java b/src/main/java/freemarker/template/MapKeyValuePairIterator.java
index 05e1356..3cc0171 100644
--- a/src/main/java/freemarker/template/MapKeyValuePairIterator.java
+++ b/src/main/java/freemarker/template/MapKeyValuePairIterator.java
@@ -43,18 +43,22 @@
         this.objectWrapper = objectWrapper;
     }
 
+    @Override
     public boolean hasNext() {
         return entrySetIterator.hasNext();
     }
 
+    @Override
     public KeyValuePair next() {
         final Entry<?, ?> entry = entrySetIterator.next();
         return new KeyValuePair() {
 
+            @Override
             public TemplateModel getKey() throws TemplateModelException {
                 return wrap(entry.getKey());
             }
 
+            @Override
             public TemplateModel getValue() throws TemplateModelException {
                 return wrap(entry.getValue());
             }
diff --git a/src/main/java/freemarker/template/SimpleCollection.java b/src/main/java/freemarker/template/SimpleCollection.java
index 46e8671..ec19581 100644
--- a/src/main/java/freemarker/template/SimpleCollection.java
+++ b/src/main/java/freemarker/template/SimpleCollection.java
@@ -104,6 +104,7 @@
      * <tt>TemplateModelException</tt> when you try to call their methods, since the wrapped <tt>Iterator</tt>
      * can't return the first element anymore.
      */
+    @Override
     public TemplateModelIterator iterator() {
         return iterator != null
                 ? new SimpleTemplateModelIterator(iterator, false)
@@ -126,6 +127,7 @@
             this.iteratorOwnedByMe = iteratorOwnedByMe;
         }
 
+        @Override
         public TemplateModel next() throws TemplateModelException {
             if (!iteratorOwnedByMe) { 
                 synchronized (SimpleCollection.this) {
@@ -143,6 +145,7 @@
             return value instanceof TemplateModel ? (TemplateModel) value : wrap(value);
         }
 
+        @Override
         public boolean hasNext() throws TemplateModelException {
             // Calling hasNext may looks safe, but I have met sync. problems.
             if (!iteratorOwnedByMe) {
diff --git a/src/main/java/freemarker/template/SimpleDate.java b/src/main/java/freemarker/template/SimpleDate.java
index c8b9963..b92b335 100644
--- a/src/main/java/freemarker/template/SimpleDate.java
+++ b/src/main/java/freemarker/template/SimpleDate.java
@@ -64,10 +64,12 @@
         this.type = type;
     }
     
+    @Override
     public java.util.Date getAsDate() {
         return date;
     }
 
+    @Override
     public int getDateType() {
         return type;
     }
diff --git a/src/main/java/freemarker/template/SimpleHash.java b/src/main/java/freemarker/template/SimpleHash.java
index f32ebb2..ff5510e 100644
--- a/src/main/java/freemarker/template/SimpleHash.java
+++ b/src/main/java/freemarker/template/SimpleHash.java
@@ -209,6 +209,7 @@
         put(key, b ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE);
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         Object result;
         try {
@@ -345,22 +346,27 @@
         return map.toString();
     }
 
+    @Override
     public int size() {
         return map.size();
     }
 
+    @Override
     public boolean isEmpty() {
         return map == null || map.isEmpty();
     }
 
+    @Override
     public TemplateCollectionModel keys() {
         return new SimpleCollection(map.keySet(), getObjectWrapper());
     }
 
+    @Override
     public TemplateCollectionModel values() {
         return new SimpleCollection(map.values(), getObjectWrapper());
     }
 
+    @Override
     public KeyValuePairIterator keyValuePairIterator() {
         return new MapKeyValuePairIterator(map, getObjectWrapper());
     }
diff --git a/src/main/java/freemarker/template/SimpleNumber.java b/src/main/java/freemarker/template/SimpleNumber.java
index 860b68c..5de9cc7 100644
--- a/src/main/java/freemarker/template/SimpleNumber.java
+++ b/src/main/java/freemarker/template/SimpleNumber.java
@@ -63,6 +63,7 @@
         this.value = Double.valueOf(val);
     }
 
+    @Override
     public Number getAsNumber() {
         return value;
     }
diff --git a/src/main/java/freemarker/template/SimpleScalar.java b/src/main/java/freemarker/template/SimpleScalar.java
index ea44017..a5f31ad 100644
--- a/src/main/java/freemarker/template/SimpleScalar.java
+++ b/src/main/java/freemarker/template/SimpleScalar.java
@@ -48,6 +48,7 @@
         this.value = value;
     }
 
+    @Override
     public String getAsString() {
         return (value == null) ? "" : value;
     }
diff --git a/src/main/java/freemarker/template/SimpleSequence.java b/src/main/java/freemarker/template/SimpleSequence.java
index cf5560f..a6b5aea 100644
--- a/src/main/java/freemarker/template/SimpleSequence.java
+++ b/src/main/java/freemarker/template/SimpleSequence.java
@@ -233,6 +233,7 @@
      * Returns the item at the specified index of the list. If the item isn't yet an {@link TemplateModel}, it will wrap
      * it to one now, and writes it back into the backing list.
      */
+    @Override
     public TemplateModel get(int index) throws TemplateModelException {
         try {
             Object value = list.get(index);
@@ -247,6 +248,7 @@
         }
     }
 
+    @Override
     public int size() {
         return list.size();
     }
diff --git a/src/main/java/freemarker/template/Template.java b/src/main/java/freemarker/template/Template.java
index d531f3a..eca6e8d 100644
--- a/src/main/java/freemarker/template/Template.java
+++ b/src/main/java/freemarker/template/Template.java
@@ -292,7 +292,7 @@
      */
     @Deprecated
     public Template(String name, Reader reader) throws IOException {
-        this(name, reader, (Configuration) null);
+        this(name, reader, null);
     }
 
     /**
diff --git a/src/main/java/freemarker/template/TemplateException.java b/src/main/java/freemarker/template/TemplateException.java
index 30da1b8..f0781b1 100644
--- a/src/main/java/freemarker/template/TemplateException.java
+++ b/src/main/java/freemarker/template/TemplateException.java
@@ -77,7 +77,7 @@
      * or underlying cause.
      */
     public TemplateException(Environment env) {
-        this((String) null, null, env);
+        this(null, null, env);
     }
 
     /**
@@ -95,7 +95,7 @@
      * backward-compatibility.
      */
     public TemplateException(Exception cause, Environment env) {
-        this((String) null, cause, env);
+        this(null, cause, env);
     }
 
     /**
@@ -108,7 +108,7 @@
      * @since 2.3.20
      */
     public TemplateException(Throwable cause, Environment env) {
-        this((String) null, cause, env);
+        this(null, cause, env);
     }
     
     /**
@@ -195,7 +195,7 @@
             if (!positionsCalculated) {
                 // The expressions is the argument of the template element, so we prefer it as it's more specific. 
                 TemplateObject templateObject = blamedExpression != null
-                        ? (TemplateObject) blamedExpression
+                        ? blamedExpression
                         : (
                                 ftlInstructionStackSnapshot != null && ftlInstructionStackSnapshot.length != 0
                                 ? ftlInstructionStackSnapshot[0] : null);
@@ -606,18 +606,22 @@
             this.out = out;
         }
 
+        @Override
         public void print(Object obj) {
             out.print(obj);
         }
 
+        @Override
         public void println(Object obj) {
             out.println(obj);
         }
 
+        @Override
         public void println() {
             out.println();
         }
 
+        @Override
         public void printStandardStackTrace(Throwable exception) {
             if (exception instanceof TemplateException) {
                 ((TemplateException) exception).printStandardStackTrace(out);
@@ -636,18 +640,22 @@
             this.out = out;
         }
 
+        @Override
         public void print(Object obj) {
             out.print(obj);
         }
 
+        @Override
         public void println(Object obj) {
             out.println(obj);
         }
 
+        @Override
         public void println() {
             out.println();
         }
 
+        @Override
         public void printStandardStackTrace(Throwable exception) {
             if (exception instanceof TemplateException) {
                 ((TemplateException) exception).printStandardStackTrace(out);
diff --git a/src/main/java/freemarker/template/TemplateExceptionHandler.java b/src/main/java/freemarker/template/TemplateExceptionHandler.java
index d1c25e9..628f011 100644
--- a/src/main/java/freemarker/template/TemplateExceptionHandler.java
+++ b/src/main/java/freemarker/template/TemplateExceptionHandler.java
@@ -59,6 +59,7 @@
     * other {@link TemplateExceptionHandler}-s.
     */
     TemplateExceptionHandler IGNORE_HANDLER = new TemplateExceptionHandler() {
+        @Override
         public void handleTemplateException(TemplateException te, Environment env, Writer out) {
             // Do nothing
         }
@@ -69,6 +70,7 @@
      * in most production systems.
      */
     TemplateExceptionHandler RETHROW_HANDLER = new TemplateExceptionHandler() {
+        @Override
         public void handleTemplateException(TemplateException te, Environment env, Writer out)
                 throws TemplateException {
             throw te;
@@ -80,6 +82,7 @@
      * handler outputs the stack trace information to the client and then re-throws the exception.
      */
     TemplateExceptionHandler DEBUG_HANDLER = new TemplateExceptionHandler() {
+        @Override
         public void handleTemplateException(TemplateException te, Environment env, Writer out)
                 throws TemplateException {
             if (!env.isInAttemptBlock()) {
@@ -99,6 +102,7 @@
      * well readable in the browser, and then re-throws the exception.
      */
     TemplateExceptionHandler HTML_DEBUG_HANDLER = new TemplateExceptionHandler() {
+        @Override
         public void handleTemplateException(TemplateException te, Environment env, Writer out)
                 throws TemplateException {
             if (!env.isInAttemptBlock()) {
diff --git a/src/main/java/freemarker/template/TemplateMethodModelEx.java b/src/main/java/freemarker/template/TemplateMethodModelEx.java
index 689aa70..60ccb37 100644
--- a/src/main/java/freemarker/template/TemplateMethodModelEx.java
+++ b/src/main/java/freemarker/template/TemplateMethodModelEx.java
@@ -48,6 +48,7 @@
      *     wrapped using the {@link Environment#getObjectWrapper() environment's 
      *     object wrapper}.
      */
+    @Override
     public Object exec(List arguments) throws TemplateModelException;
     
 }
\ No newline at end of file
diff --git a/src/main/java/freemarker/template/TemplateModelException.java b/src/main/java/freemarker/template/TemplateModelException.java
index 2926ba8..df1efd9 100644
--- a/src/main/java/freemarker/template/TemplateModelException.java
+++ b/src/main/java/freemarker/template/TemplateModelException.java
@@ -35,7 +35,7 @@
      * specified detail message.
      */
     public TemplateModelException() {
-        this((String) null, null);
+        this(null, null);
     }
 
     /**
@@ -53,7 +53,7 @@
      * backward-compatibility.
      */
     public TemplateModelException(Exception cause) {
-        this((String) null, cause);
+        this(null, cause);
     }
 
     /**
@@ -64,7 +64,7 @@
      * exception to be raised
      */
     public TemplateModelException(Throwable cause) {
-        this((String) null, cause);
+        this(null, cause);
     }
     
     /**
diff --git a/src/main/java/freemarker/template/TemplateModelListSequence.java b/src/main/java/freemarker/template/TemplateModelListSequence.java
index 2077e42..5f48c58 100644
--- a/src/main/java/freemarker/template/TemplateModelListSequence.java
+++ b/src/main/java/freemarker/template/TemplateModelListSequence.java
@@ -34,10 +34,12 @@
         this.list = list;
     }
 
+    @Override
     public TemplateModel get(int index) {
         return (TemplateModel) list.get(index);
     }
 
+    @Override
     public int size() {
         return list.size();
     }
diff --git a/src/main/java/freemarker/template/TrueTemplateBooleanModel.java b/src/main/java/freemarker/template/TrueTemplateBooleanModel.java
index da26499..5b24f9b 100644
--- a/src/main/java/freemarker/template/TrueTemplateBooleanModel.java
+++ b/src/main/java/freemarker/template/TrueTemplateBooleanModel.java
@@ -24,6 +24,7 @@
  */
 final class TrueTemplateBooleanModel implements SerializableTemplateBooleanModel {
 
+    @Override
     public boolean getAsBoolean() {
         return true;
     }
diff --git a/src/main/java/freemarker/template/utility/CaptureOutput.java b/src/main/java/freemarker/template/utility/CaptureOutput.java
index 9bab1f1..686090a 100644
--- a/src/main/java/freemarker/template/utility/CaptureOutput.java
+++ b/src/main/java/freemarker/template/utility/CaptureOutput.java
@@ -61,6 +61,7 @@
 @Deprecated
 public class CaptureOutput implements TemplateTransformModel {
 
+    @Override
     public Writer getWriter(final Writer out, final Map args) throws TemplateModelException {
         String errmsg = "Must specify the name of the variable in "
                 + "which to capture the output with the 'var' or 'local' or 'global' parameter.";
diff --git a/src/main/java/freemarker/template/utility/ClassUtil.java b/src/main/java/freemarker/template/utility/ClassUtil.java
index 95fd3b8..7fc4046 100644
--- a/src/main/java/freemarker/template/utility/ClassUtil.java
+++ b/src/main/java/freemarker/template/utility/ClassUtil.java
@@ -94,7 +94,7 @@
 
     private static final Map<String, Class<?>> PRIMITIVE_CLASSES_BY_NAME;
     static {
-        PRIMITIVE_CLASSES_BY_NAME = new HashMap<String, Class<?>>();
+        PRIMITIVE_CLASSES_BY_NAME = new HashMap<>();
         PRIMITIVE_CLASSES_BY_NAME.put("boolean", boolean.class);
         PRIMITIVE_CLASSES_BY_NAME.put("byte", byte.class);
         PRIMITIVE_CLASSES_BY_NAME.put("char", char.class);
diff --git a/src/main/java/freemarker/template/utility/Constants.java b/src/main/java/freemarker/template/utility/Constants.java
index 8392c01..07ccdc0 100644
--- a/src/main/java/freemarker/template/utility/Constants.java
+++ b/src/main/java/freemarker/template/utility/Constants.java
@@ -62,10 +62,12 @@
     
     private static class EmptyIteratorModel implements TemplateModelIterator, Serializable {
 
+        @Override
         public TemplateModel next() throws TemplateModelException {
             throw new TemplateModelException("The collection has no more elements.");
         }
 
+        @Override
         public boolean hasNext() throws TemplateModelException {
             return false;
         }
@@ -76,6 +78,7 @@
     
     private static class EmptyCollectionModel implements TemplateCollectionModel, Serializable {
 
+        @Override
         public TemplateModelIterator iterator() throws TemplateModelException {
             return EMPTY_ITERATOR;
         }
@@ -86,10 +89,12 @@
     
     private static class EmptySequenceModel implements TemplateSequenceModel, Serializable {
         
+        @Override
         public TemplateModel get(int index) throws TemplateModelException {
             return null;
         }
     
+        @Override
         public int size() throws TemplateModelException {
             return 0;
         }
@@ -109,26 +114,32 @@
      */
     private static class EmptyHashModel implements TemplateHashModelEx2, Serializable {
         
+        @Override
         public int size() throws TemplateModelException {
             return 0;
         }
 
+        @Override
         public TemplateCollectionModel keys() throws TemplateModelException {
             return EMPTY_COLLECTION;
         }
 
+        @Override
         public TemplateCollectionModel values() throws TemplateModelException {
             return EMPTY_COLLECTION;
         }
 
+        @Override
         public TemplateModel get(String key) throws TemplateModelException {
             return null;
         }
 
+        @Override
         public boolean isEmpty() throws TemplateModelException {
             return true;
         }
 
+        @Override
         public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
             return EMPTY_KEY_VALUE_PAIR_ITERATOR;
         }
@@ -145,10 +156,12 @@
             //
         }
 
+        @Override
         public boolean hasNext() throws TemplateModelException {
             return false;
         }
 
+        @Override
         public TemplateHashModelEx2.KeyValuePair next() throws TemplateModelException {
             throw new NoSuchElementException("Can't retrieve element from empty key-value pair iterator.");
         }
diff --git a/src/main/java/freemarker/template/utility/DOMNodeModel.java b/src/main/java/freemarker/template/utility/DOMNodeModel.java
index 404fe45..b1c6f1b 100644
--- a/src/main/java/freemarker/template/utility/DOMNodeModel.java
+++ b/src/main/java/freemarker/template/utility/DOMNodeModel.java
@@ -61,6 +61,7 @@
         this.node = node;
     }
 
+    @Override
     public TemplateModel get(String key) throws TemplateModelException {
         TemplateModel result = null;
         if (equivalenceTable.containsKey(key)) {
@@ -128,6 +129,7 @@
         return result;
     }
 
+    @Override
     public boolean isEmpty() {
         return false;
     }
@@ -216,6 +218,7 @@
 
 
     class AncestorByName implements TemplateMethodModel {
+        @Override
         public Object exec(List arguments) throws TemplateModelException {
             if (arguments.size() != 1) {
                 throw new TemplateModelException("Expecting exactly one string argument here");
@@ -243,6 +246,7 @@
             nodes = new TemplateModel[nodeList.getLength()];
         }
 
+        @Override
         public TemplateModel get(int index) {
             DOMNodeModel result = (DOMNodeModel) nodes[index];
             if (result == null) {
@@ -253,10 +257,12 @@
             return result;
         }
 
+        @Override
         public int size() {
             return nodes.length;
         }
 
+        @Override
         public Object exec(List arguments) throws TemplateModelException {
             if (arguments.size() != 1) {
                 throw new TemplateModelException("Expecting exactly one string argument here");
diff --git a/src/main/java/freemarker/template/utility/DateUtil.java b/src/main/java/freemarker/template/utility/DateUtil.java
index eb37ba4..a4db6e5 100644
--- a/src/main/java/freemarker/template/utility/DateUtil.java
+++ b/src/main/java/freemarker/template/utility/DateUtil.java
@@ -843,6 +843,7 @@
         private GregorianCalendar calendar;
         private TimeZone lastlySetTimeZone;
     
+        @Override
         public GregorianCalendar get(TimeZone tz, Date date) {
             if (calendar == null) {
                 calendar = new GregorianCalendar(tz, Locale.US);
@@ -869,6 +870,7 @@
         private GregorianCalendar calendar;
         private TimeZone lastlySetTimeZone;
 
+        @Override
         public Date calculate(int era, int year, int month, int day, int hours, int minutes, int secs, int millisecs,
                 boolean addOneDay, TimeZone tz) {
             if (calendar == null) {
diff --git a/src/main/java/freemarker/template/utility/DeepUnwrap.java b/src/main/java/freemarker/template/utility/DeepUnwrap.java
index aa893a2..090aa6c 100644
--- a/src/main/java/freemarker/template/utility/DeepUnwrap.java
+++ b/src/main/java/freemarker/template/utility/DeepUnwrap.java
@@ -151,7 +151,7 @@
         }
         if (model instanceof TemplateHashModelEx) {
             TemplateHashModelEx hash = (TemplateHashModelEx) model;
-            Map<Object, Object> map = new LinkedHashMap<Object, Object>();
+            Map<Object, Object> map = new LinkedHashMap<>();
             if (model instanceof TemplateHashModelEx2) {
                 KeyValuePairIterator kvps = ((TemplateHashModelEx2) model).keyValuePairIterator();
                 while (kvps.hasNext()) {
diff --git a/src/main/java/freemarker/template/utility/Execute.java b/src/main/java/freemarker/template/utility/Execute.java
index 034c961..d649b45 100644
--- a/src/main/java/freemarker/template/utility/Execute.java
+++ b/src/main/java/freemarker/template/utility/Execute.java
@@ -69,6 +69,7 @@
      * of the arguments passed to the method.
      * @return the <tt>TemplateModel</tt> produced by the method, or null.
      */
+    @Override
     public Object exec (List arguments) throws TemplateModelException {
         String aExecute;
         StringBuilder    aOutputBuffer = new StringBuilder();
@@ -83,18 +84,15 @@
             Process exec = Runtime.getRuntime().exec( aExecute );
 
             // stdout from the process comes in here
-            InputStream execOut = exec.getInputStream();
-            try {
-                Reader execReader = new InputStreamReader( execOut );
-    
-                char[] buffer = new char[ OUTPUT_BUFFER_SIZE ];
-                int bytes_read = execReader.read( buffer );
-                while ( bytes_read > 0 ) {
-                    aOutputBuffer.append( buffer, 0, bytes_read );
-                    bytes_read = execReader.read( buffer );
+            try (InputStream execOut = exec.getInputStream()) {
+                Reader execReader = new InputStreamReader(execOut);
+
+                char[] buffer = new char[OUTPUT_BUFFER_SIZE];
+                int bytes_read = execReader.read(buffer);
+                while (bytes_read > 0) {
+                    aOutputBuffer.append(buffer, 0, bytes_read);
+                    bytes_read = execReader.read(buffer);
                 }
-            } finally {
-                execOut.close();
             }
         } catch ( IOException ioe ) {
             throw new TemplateModelException( ioe.getMessage() );
diff --git a/src/main/java/freemarker/template/utility/HtmlEscape.java b/src/main/java/freemarker/template/utility/HtmlEscape.java
index 6b6f100..c8bd79d 100644
--- a/src/main/java/freemarker/template/utility/HtmlEscape.java
+++ b/src/main/java/freemarker/template/utility/HtmlEscape.java
@@ -59,6 +59,7 @@
     private static final char[] AMP = "&amp;".toCharArray();
     private static final char[] QUOT = "&quot;".toCharArray();
 
+    @Override
     public Writer getWriter(final Writer out, Map args) {
         return new Writer()
         {
diff --git a/src/main/java/freemarker/template/utility/JythonRuntime.java b/src/main/java/freemarker/template/utility/JythonRuntime.java
index 91e8625..026c638 100644
--- a/src/main/java/freemarker/template/utility/JythonRuntime.java
+++ b/src/main/java/freemarker/template/utility/JythonRuntime.java
@@ -35,6 +35,7 @@
 
 public class JythonRuntime extends PythonInterpreter
     implements TemplateTransformModel {
+    @Override
     public Writer getWriter(final Writer out,
                             final Map args) {
         final StringBuilder buf = new StringBuilder();
diff --git a/src/main/java/freemarker/template/utility/NormalizeNewlines.java b/src/main/java/freemarker/template/utility/NormalizeNewlines.java
index 59d5e00..e75a24c 100644
--- a/src/main/java/freemarker/template/utility/NormalizeNewlines.java
+++ b/src/main/java/freemarker/template/utility/NormalizeNewlines.java
@@ -63,6 +63,7 @@
  */
 public class NormalizeNewlines implements TemplateTransformModel {
 
+    @Override
     public Writer getWriter(final Writer out,
                             final Map args) {
         final StringBuilder buf = new StringBuilder();
diff --git a/src/main/java/freemarker/template/utility/NumberUtil.java b/src/main/java/freemarker/template/utility/NumberUtil.java
index 9cd3382..f4ccdcd 100644
--- a/src/main/java/freemarker/template/utility/NumberUtil.java
+++ b/src/main/java/freemarker/template/utility/NumberUtil.java
@@ -66,31 +66,31 @@
      */
     public static int getSignum(Number num) throws ArithmeticException {
         if (num instanceof Integer) {
-            int n = ((Integer) num).intValue();
+            int n = num.intValue();
             return n > 0 ? 1 : (n == 0 ? 0 : -1);
         } else if (num instanceof BigDecimal) {
             BigDecimal n = (BigDecimal) num;
             return n.signum();
         } else if (num instanceof Double) {
-            double n = ((Double) num).doubleValue();
+            double n = num.doubleValue();
             if (n > 0) return 1;
             else if (n == 0) return 0;
             else if (n < 0) return -1;
             else throw new ArithmeticException("The signum of " + n + " is not defined.");  // NaN
         } else if (num instanceof Float) {
-            float n = ((Float) num).floatValue();
+            float n = num.floatValue();
             if (n > 0) return 1;
             else if (n == 0) return 0;
             else if (n < 0) return -1;
             else throw new ArithmeticException("The signum of " + n + " is not defined.");  // NaN
         } else if (num instanceof Long) {
-            long n = ((Long) num).longValue();
+            long n = num.longValue();
             return n > 0 ? 1 : (n == 0 ? 0 : -1);
         } else if (num instanceof Short) {
-            short n = ((Short) num).shortValue();
+            short n = num.shortValue();
             return n > 0 ? 1 : (n == 0 ? 0 : -1);
         } else if (num instanceof Byte) {
-            byte n = ((Byte) num).byteValue();
+            byte n = num.byteValue();
             return n > 0 ? 1 : (n == 0 ? 0 : -1);
         } else if (num instanceof BigInteger) {
             BigInteger n = (BigInteger) num;
diff --git a/src/main/java/freemarker/template/utility/ObjectConstructor.java b/src/main/java/freemarker/template/utility/ObjectConstructor.java
index 1473160..1f8565b 100644
--- a/src/main/java/freemarker/template/utility/ObjectConstructor.java
+++ b/src/main/java/freemarker/template/utility/ObjectConstructor.java
@@ -39,6 +39,7 @@
  * <br>&lt;#assign aList = objectConstructor("java.util.ArrayList", 100)&gt;
  */
 public class ObjectConstructor implements TemplateMethodModelEx {
+    @Override
     public Object exec(List args) throws TemplateModelException {
         if (args.isEmpty()) {
             throw new TemplateModelException("This method must have at least one argument, the name of the class to instantiate.");
diff --git a/src/main/java/freemarker/template/utility/SecurityUtilities.java b/src/main/java/freemarker/template/utility/SecurityUtilities.java
index a38d502..de6b3a9 100644
--- a/src/main/java/freemarker/template/utility/SecurityUtilities.java
+++ b/src/main/java/freemarker/template/utility/SecurityUtilities.java
@@ -36,6 +36,7 @@
         return (String) AccessController.doPrivileged(
             new PrivilegedAction()
             {
+                @Override
                 public Object run() {
                     return System.getProperty(key);
                 }
@@ -47,6 +48,7 @@
             return (String) AccessController.doPrivileged(
                 new PrivilegedAction()
                 {
+                    @Override
                     public Object run() {
                         return System.getProperty(key, defValue);
                     }
@@ -64,6 +66,7 @@
             return (Integer) AccessController.doPrivileged(
                 new PrivilegedAction()
                 {
+                    @Override
                     public Object run() {
                         return Integer.getInteger(key, defValue);
                     }
diff --git a/src/main/java/freemarker/template/utility/StandardCompress.java b/src/main/java/freemarker/template/utility/StandardCompress.java
index 571afa7..b1d8078 100644
--- a/src/main/java/freemarker/template/utility/StandardCompress.java
+++ b/src/main/java/freemarker/template/utility/StandardCompress.java
@@ -87,6 +87,7 @@
         this.defaultBufferSize = defaultBufferSize;
     }
 
+    @Override
     public Writer getWriter(final Writer out, Map args)
     throws TemplateModelException {
         int bufferSize = defaultBufferSize;
diff --git a/src/main/java/freemarker/template/utility/TemplateModelUtils.java b/src/main/java/freemarker/template/utility/TemplateModelUtils.java
index aaadb33..4efff56 100644
--- a/src/main/java/freemarker/template/utility/TemplateModelUtils.java
+++ b/src/main/java/freemarker/template/utility/TemplateModelUtils.java
@@ -78,10 +78,12 @@
             keyIter = hash.keys().iterator();
         }
 
+        @Override
         public boolean hasNext() throws TemplateModelException {
             return keyIter.hasNext();
         }
 
+        @Override
         public KeyValuePair next() throws TemplateModelException {
             final TemplateModel key = keyIter.next();
             if (!(key instanceof TemplateScalarModel)) {
@@ -90,10 +92,12 @@
 
             return new KeyValuePair() {
 
+                @Override
                 public TemplateModel getKey() throws TemplateModelException {
                     return key;
                 }
 
+                @Override
                 public TemplateModel getValue() throws TemplateModelException {
                     return hash.get(((TemplateScalarModel) key).getAsString());
                 }
@@ -155,7 +159,7 @@
             throws TemplateModelException {
         NullArgumentException.check("hashLikeObjects", hashLikeObjects);
         
-        List<TemplateHashModel> hashes = new ArrayList<TemplateHashModel>(hashLikeObjects.size());
+        List<TemplateHashModel> hashes = new ArrayList<>(hashLikeObjects.size());
         
         boolean allTHMEx = true;
         for (Object hashLikeObject : hashLikeObjects) {
@@ -195,6 +199,7 @@
             this.hashes = hashes;
         }
 
+        @Override
         public TemplateModel get(String key) throws TemplateModelException {
             for (int i = hashes.size() - 1; i >= 0; i--) {
                 TemplateModel value = hashes.get(i).get(key);
@@ -205,6 +210,7 @@
             return null;
         }
 
+        @Override
         public boolean isEmpty() throws TemplateModelException {
             for (TemplateHashModel hash : hashes) {
                 if (!hash.isEmpty()) {
@@ -231,16 +237,19 @@
             super(hashes);
         }
         
+        @Override
         public int size() throws TemplateModelException {
             initKeys();
             return keys.size();
         }
 
+        @Override
         public TemplateCollectionModel keys() throws TemplateModelException {
             initKeys();
             return keys;
         }
 
+        @Override
         public TemplateCollectionModel values() throws TemplateModelException {
             initValues();
             return values;
@@ -248,7 +257,7 @@
 
         private void initKeys() throws TemplateModelException {
             if (keys == null) {
-                Set<String> keySet = new HashSet<String>();
+                Set<String> keySet = new HashSet<>();
                 SimpleSequence keySeq = new SimpleSequence(_TemplateAPI.SAFE_OBJECT_WRAPPER);
                 for (TemplateHashModelEx hash : hashes) {
                     addKeys(keySet, keySeq, hash);
diff --git a/src/main/java/freemarker/template/utility/ToCanonical.java b/src/main/java/freemarker/template/utility/ToCanonical.java
index 87752b8..1f1babb 100644
--- a/src/main/java/freemarker/template/utility/ToCanonical.java
+++ b/src/main/java/freemarker/template/utility/ToCanonical.java
@@ -66,11 +66,8 @@
         File convertedFile = new File(dir, filename + ".canonical");
         config.setDirectoryForTemplateLoading(dir);
         Template template = config.getTemplate(filename);
-        FileWriter output = new FileWriter(convertedFile);
-        try {
+        try (FileWriter output = new FileWriter(convertedFile)) {
             template.dump(output);
-        } finally {
-            output.close();
         }
     }
 
diff --git a/src/main/java/freemarker/template/utility/XmlEscape.java b/src/main/java/freemarker/template/utility/XmlEscape.java
index cbf823f..ac6fb71 100644
--- a/src/main/java/freemarker/template/utility/XmlEscape.java
+++ b/src/main/java/freemarker/template/utility/XmlEscape.java
@@ -40,6 +40,7 @@
     private static final char[] QUOT = "&quot;".toCharArray();
     private static final char[] APOS = "&apos;".toCharArray();
 
+    @Override
     public Writer getWriter(final Writer out, Map args) {
         return new Writer()
         {
diff --git a/src/test/java/freemarker/core/ASTPrinter.java b/src/test/java/freemarker/core/ASTPrinter.java
index b84d779..a32f037 100644
--- a/src/test/java/freemarker/core/ASTPrinter.java
+++ b/src/test/java/freemarker/core/ASTPrinter.java
@@ -166,8 +166,7 @@
             throw new IOException("Failed to get the length of " + file);
         }
         byte[] buffer = new byte[(int) ln];
-        InputStream in = new FileInputStream(file);
-        try {
+        try (InputStream in = new FileInputStream(file)) {
             int offset = 0;
             int bytesRead;
             while (offset < buffer.length) {
@@ -177,8 +176,6 @@
                 }
                 offset += bytesRead;
             }
-        } finally {
-            in.close();
         }
         
         try {
@@ -199,12 +196,9 @@
         if (!parentDir.isDirectory() && !parentDir.mkdirs()) {
             throw new IOException("Failed to create parent directory: " + parentDir);
         }
-        
-        Writer w = new BufferedWriter(new FileWriter(file));
-        try {
+
+        try (Writer w = new BufferedWriter(new FileWriter(file))) {
             w.write(astStr);
-        } finally {
-            w.close();
         }
     }
 
diff --git a/src/test/java/freemarker/core/AttemptLoggingTest.java b/src/test/java/freemarker/core/AttemptLoggingTest.java
index aa2d2c2..9f3cf83 100644
--- a/src/test/java/freemarker/core/AttemptLoggingTest.java
+++ b/src/test/java/freemarker/core/AttemptLoggingTest.java
@@ -48,7 +48,7 @@
 
     @Test
     public void customConfigTest() throws IOException, TemplateException {
-        List<String> reports = new ArrayList<String>();
+        List<String> reports = new ArrayList<>();
         getConfiguration().setAttemptExceptionReporter(new TestAttemptExceptionReporter(reports));
         
         assertOutput(
@@ -62,7 +62,7 @@
 
     @Test
     public void dontReportSuppressedExceptionsTest() throws IOException, TemplateException {
-        List<String> reports = new ArrayList<String>();
+        List<String> reports = new ArrayList<>();
         getConfiguration().setAttemptExceptionReporter(new TestAttemptExceptionReporter(reports));
         
         getConfiguration().setTemplateExceptionHandler(new TemplateExceptionHandler() {
diff --git a/src/test/java/freemarker/core/CamelCaseTest.java b/src/test/java/freemarker/core/CamelCaseTest.java
index 22b3008..b1e1dcd 100644
--- a/src/test/java/freemarker/core/CamelCaseTest.java
+++ b/src/test/java/freemarker/core/CamelCaseTest.java
@@ -256,8 +256,8 @@
         assertContainsBothNamingStyles(getConfiguration().getSupportedBuiltInNames(), new NamePairAssertion() {
 
             public void assertPair(String name1, String name2) {
-                BuiltIn bi1  = (BuiltIn) BuiltIn.BUILT_INS_BY_NAME.get(name1);
-                BuiltIn bi2 = (BuiltIn) BuiltIn.BUILT_INS_BY_NAME.get(name2);
+                BuiltIn bi1  = BuiltIn.BUILT_INS_BY_NAME.get(name1);
+                BuiltIn bi2 = BuiltIn.BUILT_INS_BY_NAME.get(name2);
                 assertTrue("\"" + name1 + "\" and \"" + name2 + "\" doesn't belong to the same BI object.",
                         bi1 == bi2);
             }
@@ -266,7 +266,7 @@
     }
 
     private void assertContainsBothNamingStyles(Set<String> names, NamePairAssertion namePairAssertion) {
-        Set<String> underscoredNamesWithCamelCasePair = new HashSet<String>();
+        Set<String> underscoredNamesWithCamelCasePair = new HashSet<>();
         for (String name : names) {
             if (_CoreStringUtils.getIdentifierNamingConvention(name) == Configuration.CAMEL_CASE_NAMING_CONVENTION) {
                 String underscoredName = correctIsoBIExceptions(_CoreStringUtils.camelCaseToUnderscored(name)); 
diff --git a/src/test/java/freemarker/core/ConfigurableTest.java b/src/test/java/freemarker/core/ConfigurableTest.java
index e0a79c0..10ff854 100644
--- a/src/test/java/freemarker/core/ConfigurableTest.java
+++ b/src/test/java/freemarker/core/ConfigurableTest.java
@@ -83,8 +83,8 @@
     public void testGetSettingNamesNameConventionsContainTheSame() throws Exception {
         Configurable cfgable = createConfigurable();
         ConfigurableTest.testGetSettingNamesNameConventionsContainTheSame(
-                new ArrayList<String>(cfgable.getSettingNames(false)),
-                new ArrayList<String>(cfgable.getSettingNames(true)));
+                new ArrayList<>(cfgable.getSettingNames(false)),
+                new ArrayList<>(cfgable.getSettingNames(true)));
     }
 
     public static void testKeyStaticFieldsHasAllVariationsAndCorrectFormat(
@@ -146,10 +146,10 @@
     }
     
     public static void testGetSettingNamesNameConventionsContainTheSame(List<String> namesSCList, List<String> namesCCList) {
-        Set<String> namesSC = new HashSet<String>(namesSCList);
+        Set<String> namesSC = new HashSet<>(namesSCList);
         assertEquals(namesSCList.size(), namesSC.size());
         
-        Set<String> namesCC = new HashSet<String>(namesCCList);
+        Set<String> namesCC = new HashSet<>(namesCCList);
         assertEquals(namesCCList.size(), namesCC.size());
 
         assertEquals(namesSC.size(), namesCC.size());
diff --git a/src/test/java/freemarker/core/DirectiveCallPlaceTest.java b/src/test/java/freemarker/core/DirectiveCallPlaceTest.java
index dcbe59b..3a4e532 100644
--- a/src/test/java/freemarker/core/DirectiveCallPlaceTest.java
+++ b/src/test/java/freemarker/core/DirectiveCallPlaceTest.java
@@ -100,7 +100,7 @@
     @SuppressWarnings("boxing")
     @Override
     protected Object createDataModel() {
-        Map<String, Object> dm = new HashMap<String, Object>();
+        Map<String, Object> dm = new HashMap<>();
         dm.put("uc", new CachingUpperCaseDirective());
         dm.put("lc", new CachingLowerCaseDirective());
         dm.put("pa", new PositionAwareDirective());
diff --git a/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java b/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
index 0dee5f4..2004305 100644
--- a/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
+++ b/src/test/java/freemarker/core/LazilyGeneratedCollectionTest.java
@@ -291,7 +291,7 @@
         protected final List<Number> elements;
 
         public ListContainingTemplateModel(Number... elements) {
-            this.elements = new ArrayList<Number>(Arrays.asList(elements));
+            this.elements = new ArrayList<>(Arrays.asList(elements));
         }
 
         public int size() {
diff --git a/src/test/java/freemarker/core/NullTransparencyTest.java b/src/test/java/freemarker/core/NullTransparencyTest.java
index a5f6638..715e25c 100644
--- a/src/test/java/freemarker/core/NullTransparencyTest.java
+++ b/src/test/java/freemarker/core/NullTransparencyTest.java
@@ -37,15 +37,15 @@
 
     @Override
     protected Object createDataModel() {
-        Map<String, Object> dataModel = new HashMap<String, Object>();
+        Map<String, Object> dataModel = new HashMap<>();
 
-        List<String> list = new ArrayList<String>();
+        List<String> list = new ArrayList<>();
         list.add("a");
         list.add(null);
         list.add("b");
         dataModel.put("list", list);
 
-        Map<String, String> map = new LinkedHashMap<String, String>();
+        Map<String, String> map = new LinkedHashMap<>();
         map.put("ak", "av");
         map.put(null, "bv");
         map.put("ck", null);
diff --git a/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java b/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
index 1fd0ed7..bb582b8 100644
--- a/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
+++ b/src/test/java/freemarker/core/PrintfGTemplateNumberFormatFactory.java
@@ -80,7 +80,7 @@
                 if (n instanceof BigInteger) {
                     gCompatibleN = new BigDecimal((BigInteger) n);                        
                 } else if (n instanceof Long) {
-                    gCompatibleN = BigDecimal.valueOf(((Long) n).longValue());
+                    gCompatibleN = BigDecimal.valueOf(n.longValue());
                 } else {
                     gCompatibleN = Double.valueOf(n.doubleValue());
                 }
diff --git a/src/test/java/freemarker/core/TemplateConfigurationTest.java b/src/test/java/freemarker/core/TemplateConfigurationTest.java
index 5be84d7..e48c38a 100644
--- a/src/test/java/freemarker/core/TemplateConfigurationTest.java
+++ b/src/test/java/freemarker/core/TemplateConfigurationTest.java
@@ -152,7 +152,7 @@
     private static final Map<String, Object> SETTING_ASSIGNMENTS;
 
     static {
-        SETTING_ASSIGNMENTS = new HashMap<String, Object>();
+        SETTING_ASSIGNMENTS = new HashMap<>();
 
         // "Configurable" settings:
         SETTING_ASSIGNMENTS.put("APIBuiltinEnabled", true);
@@ -214,7 +214,7 @@
     public static List<PropertyDescriptor> getTemplateConfigurationSettingPropDescs(
             boolean includeCompilerSettings, boolean includeSpecialSettings)
             throws IntrospectionException {
-        List<PropertyDescriptor> settingPropDescs = new ArrayList<PropertyDescriptor>();
+        List<PropertyDescriptor> settingPropDescs = new ArrayList<>();
 
         BeanInfo beanInfo = Introspector.getBeanInfo(TemplateConfiguration.class);
         for (PropertyDescriptor pd : beanInfo.getPropertyDescriptors()) {
@@ -254,7 +254,7 @@
 
     private static final Set<String> CONFIGURABLE_PROP_NAMES;
     static {
-        CONFIGURABLE_PROP_NAMES = new HashSet<String>();
+        CONFIGURABLE_PROP_NAMES = new HashSet<>();
         try {
             for (PropertyDescriptor propDesc : Introspector.getBeanInfo(Configurable.class).getPropertyDescriptors()) {
                 String propName = propDesc.getName();
@@ -269,7 +269,7 @@
     
     private static final Set<String> PARSER_PROP_NAMES;
     static {
-        PARSER_PROP_NAMES = new HashSet<String>();
+        PARSER_PROP_NAMES = new HashSet<>();
         // It's an interface; can't use standard Inrospector
         for (Method m : ParserConfiguration.class.getMethods()) {
             String propertyName;
@@ -291,7 +291,7 @@
 
     private static final Set<String> SPECIAL_PROP_NAMES;
     static {
-        SPECIAL_PROP_NAMES = new HashSet<String>();
+        SPECIAL_PROP_NAMES = new HashSet<>();
         SPECIAL_PROP_NAMES.add("encoding");
     }
     
@@ -510,7 +510,7 @@
         }
         assertEquals("Y,N", t.getBooleanFormat());
         assertEquals(ImmutableMap.of("a", "a.ftl", "b", "b.ftl", "c", "c.ftl"), t.getAutoImports());
-        assertEquals(ImmutableList.of("a", "b", "c"), new ArrayList<String>(t.getAutoImports().keySet()));
+        assertEquals(ImmutableList.of("a", "b", "c"), new ArrayList<>(t.getAutoImports().keySet()));
         assertEquals(ImmutableList.of("i1.ftl", "i2.ftl", "i3.ftl"), t.getAutoIncludes());
         
         {
@@ -527,7 +527,7 @@
         }
         assertEquals("Y,N", t.getBooleanFormat());
         assertEquals(ImmutableMap.of("d", "d.ftl", "a", "a.ftl", "b", "b.ftl", "c", "c.ftl"), t.getAutoImports());
-        assertEquals(ImmutableList.of("d", "a", "b", "c"), new ArrayList<String>(t.getAutoImports().keySet()));
+        assertEquals(ImmutableList.of("d", "a", "b", "c"), new ArrayList<>(t.getAutoImports().keySet()));
         assertEquals(ImmutableList.of("i4.ftl", "i1.ftl", "i2.ftl", "i3.ftl"), t.getAutoIncludes());
         assertEquals(ImmutableMap.of( //
                 "b", LocaleSensitiveTemplateNumberFormatFactory.INSTANCE, //
@@ -597,7 +597,7 @@
     
     @Test
     public void testConfigureParser() throws Exception {
-        Set<String> testedProps = new HashSet<String>();
+        Set<String> testedProps = new HashSet<>();
         
         {
             TemplateConfiguration tc = new TemplateConfiguration();
@@ -890,11 +890,7 @@
             if (expectedConfiguredOutput == null) {
                 fail("Template should have fail.");
             }
-        } catch (TemplateException e) {
-            if (expectedConfiguredOutput != null) {
-                throw e;
-            }
-        } catch (ParseException e) {
+        } catch (TemplateException | ParseException e) {
             if (expectedConfiguredOutput != null) {
                 throw e;
             }
diff --git a/src/test/java/freemarker/core/WithArgsBuiltInTest.java b/src/test/java/freemarker/core/WithArgsBuiltInTest.java
index 71366e6..ebfb033 100644
--- a/src/test/java/freemarker/core/WithArgsBuiltInTest.java
+++ b/src/test/java/freemarker/core/WithArgsBuiltInTest.java
@@ -122,7 +122,7 @@
         assertOutput("<@mCAO?withArgs({}) />", "o={}");
 
         assertOutput("<@m b=2 a=1 c=null />", "a=1; b=2; c=d3");
-        Map<String, Integer> cNull = new HashMap<String, Integer>();
+        Map<String, Integer> cNull = new HashMap<>();
         cNull.put("c", null);
         addToDataModel("cNull", cNull);
         assertOutput("<@m?withArgs(cNull) b=2 a=1 />", "a=1; b=2; c=d3");
@@ -132,7 +132,7 @@
     public void testNullsWithMacroWithNamedWithArgs() throws Exception {
         // Null-s in ?withArgs should behave similarly as if they were given directly as argument.
         assertOutput("<@mCAO a=null b=null />", "o={a=null, b=null}");
-        Map<String, Integer> aNullBNull = new LinkedHashMap<String, Integer>();
+        Map<String, Integer> aNullBNull = new LinkedHashMap<>();
         aNullBNull.put("a", null);
         aNullBNull.put("b", null);
         addToDataModel("aNullBNull", aNullBNull);
@@ -403,7 +403,7 @@
                 "{}{11 22}");
         assertOutput("<@directive?withArgs({'a': 1, 'b': 2}) b=22 c=3; u>${u}</@>",
                 "{a=1, b=22, c=3}{11}");
-        Map<String, Integer> args = new LinkedHashMap<String, Integer>();
+        Map<String, Integer> args = new LinkedHashMap<>();
         args.put("a", null);
         args.put("b", 2);
         args.put("c", 3);
@@ -417,7 +417,7 @@
     public void testTemplateDirectiveModelWithArgsLast() throws IOException, TemplateException {
         addToDataModel("directive", new TestTemplateDirectiveModel());
 
-        Map<String, Integer> args = new LinkedHashMap<String, Integer>();
+        Map<String, Integer> args = new LinkedHashMap<>();
         args.put("a", null);
         args.put("b", 2);
         args.put("c", 3);
@@ -476,7 +476,7 @@
     @Test
     public void testMacroWithArgsLastNamedNullArgs() throws IOException, TemplateException {
         assertOutput("<@mCA?withArgsLast({'c': 3, 'd': 4}) a=1 d=null b=2 />", "a=1; b=2; o={d=null, c=3}");
-        Map<String, Integer> cAndDNull = new LinkedHashMap<String, Integer>();
+        Map<String, Integer> cAndDNull = new LinkedHashMap<>();
         cAndDNull.put("c", 3);
         cAndDNull.put("d", null);
         addToDataModel("cAndDNull", cAndDNull);
@@ -520,7 +520,7 @@
 
     @Test
     public void testMacroWithArgsLastPositionalNullArgs() throws IOException, TemplateException {
-        ArrayList<Object> twoAndNull = new ArrayList<Object>();
+        ArrayList<Object> twoAndNull = new ArrayList<>();
         twoAndNull.add(2);
         twoAndNull.add(null);
         addToDataModel("twoAndNull", twoAndNull);
diff --git a/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java b/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
index 3317fe4..d5054e8 100644
--- a/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
+++ b/src/test/java/freemarker/ext/beans/BeansWrapperSingletonsTest.java
@@ -145,7 +145,7 @@
     }
     
     public void testBeansWrapperBuilderProducts() throws Exception {
-        List<BeansWrapper> hardReferences = new LinkedList<BeansWrapper>();
+        List<BeansWrapper> hardReferences = new LinkedList<>();
         
         assertEquals(0, getBeansWrapperInstanceCacheSize());
         
@@ -349,7 +349,7 @@
     }
 
     public void testMultipleTCCLs() {
-        List<BeansWrapper> hardReferences = new LinkedList<BeansWrapper>();
+        List<BeansWrapper> hardReferences = new LinkedList<>();
         
         assertEquals(0, getBeansWrapperInstanceCacheSize());
         
@@ -407,7 +407,7 @@
         BeansWrapperBuilder.clearInstanceCache();
         checkClassIntrospectorCacheSize(0);
         
-        List<BeansWrapper> hardReferences = new LinkedList<BeansWrapper>();
+        List<BeansWrapper> hardReferences = new LinkedList<>();
         BeansWrapperBuilder factory;
         
         {
diff --git a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java b/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
index 2c5ff54..c5b9761 100644
--- a/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
+++ b/src/test/java/freemarker/ext/beans/DefaultObjectWrapperMemberAccessPolicyTest.java
@@ -608,7 +608,7 @@
 
     private static Object exec(ObjectWrapperAndUnwrapper ow, TemplateModel objM, Object... args) throws TemplateModelException {
         assertThat(objM, instanceOf(TemplateMethodModelEx.class));
-        List<TemplateModel> argModels = new ArrayList<TemplateModel>();
+        List<TemplateModel> argModels = new ArrayList<>();
         for (Object arg : args) {
             argModels.add(ow.wrap(arg));
         }
diff --git a/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java b/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
index 9f4e4e5..f303e34 100644
--- a/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
+++ b/src/test/java/freemarker/ext/beans/Java7MembersOnlyBeansWrapper.java
@@ -87,7 +87,7 @@
     }
 
     private static <T> Set<T> newHashSet(T... items) {
-        HashSet<T> r = new HashSet<T>();
+        HashSet<T> r = new HashSet<>();
         for (T item : items) {
             r.add(item);
         }
diff --git a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java b/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
index 2685297..ad0c7b6 100644
--- a/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
+++ b/src/test/java/freemarker/ext/jsp/RealServletContainertTest.java
@@ -105,7 +105,7 @@
                 + "?action=" + AllKindOfContainersModel2Action.class.getName()
                 + "&view=attributes.ftl&viewServlet=freemarker-2.3.0",
                 true,
-                ImmutableList.<Pattern>of(
+                ImmutableList.of(
                         Pattern.compile("(?<=^Date-time: ).*", Pattern.MULTILINE), // Uses Date.toString, so plat. dep.
                         Pattern.compile("(?<=^MyMap: ).*", Pattern.MULTILINE)  // Uses HashMap, so order unknown
                         ));
diff --git a/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java b/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
index b6fe1a3..37f3ba9 100644
--- a/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
+++ b/src/test/java/freemarker/ext/jsp/taglibmembers/TestFunctions.java
@@ -73,7 +73,7 @@
 
     @SuppressWarnings("boxing")
     public static Map<String, Integer> testMap() {
-        return ImmutableMap.<String, Integer>of("a", 1, "b", 2, "c", 3);
+        return ImmutableMap.of("a", 1, "b", 2, "c", 3);
     }
     
 }
diff --git a/src/test/java/freemarker/manual/CustomFormatsExample.java b/src/test/java/freemarker/manual/CustomFormatsExample.java
index 2070217..5f2ff7c 100644
--- a/src/test/java/freemarker/manual/CustomFormatsExample.java
+++ b/src/test/java/freemarker/manual/CustomFormatsExample.java
@@ -42,13 +42,13 @@
         Configuration cfg = getConfiguration();
 
         Map<String, TemplateNumberFormatFactory> customNumberFormats
-                = new HashMap<String, TemplateNumberFormatFactory>();
+                = new HashMap<>();
         customNumberFormats.put("price", new AliasTemplateNumberFormatFactory(",000.00"));
         customNumberFormats.put("weight", new AliasTemplateNumberFormatFactory("0.##;; roundingMode=halfUp"));
         cfg.setCustomNumberFormats(customNumberFormats);
 
         Map<String, TemplateDateFormatFactory> customDateFormats
-                = new HashMap<String, TemplateDateFormatFactory>();
+                = new HashMap<>();
         customDateFormats.put("fileDate", new AliasTemplateDateFormatFactory("dd/MMM/yy hh:mm a"));
         customDateFormats.put("logEventTime", new AliasTemplateDateFormatFactory("iso ms u"));
         cfg.setCustomDateFormats(customDateFormats);
@@ -66,7 +66,7 @@
         Configuration cfg = getConfiguration();
 
         Map<String, TemplateNumberFormatFactory> customNumberFormats
-                = new HashMap<String, TemplateNumberFormatFactory>();
+                = new HashMap<>();
         customNumberFormats.put("base", BaseNTemplateNumberFormatFactory.INSTANCE);
         customNumberFormats.put("oct", new AliasTemplateNumberFormatFactory("@base 8"));
         cfg.setCustomNumberFormats(customNumberFormats);
@@ -79,7 +79,7 @@
         Configuration cfg = getConfiguration();
 
         Map<String, TemplateNumberFormatFactory> customNumberFormats
-                = new HashMap<String, TemplateNumberFormatFactory>();
+                = new HashMap<>();
         customNumberFormats.put("ua", UnitAwareTemplateNumberFormatFactory.INSTANCE);
         cfg.setCustomNumberFormats(customNumberFormats);
         cfg.setNumberFormat("@ua 0.####;; roundingMode=halfUp");
diff --git a/src/test/java/freemarker/manual/ExamplesTest.java b/src/test/java/freemarker/manual/ExamplesTest.java
index 7738bc5..7478d74 100644
--- a/src/test/java/freemarker/manual/ExamplesTest.java
+++ b/src/test/java/freemarker/manual/ExamplesTest.java
@@ -36,11 +36,8 @@
 
     protected Properties loadPropertiesFile(String name) throws IOException {
         Properties props = new Properties();
-        InputStream in = this.getClass().getResourceAsStream(name);
-        try {
+        try (InputStream in = this.getClass().getResourceAsStream(name)) {
             props.load(in);
-        } finally {
-            in.close();
         }
         return props;
     }
diff --git a/src/test/java/freemarker/template/ConfigurationTest.java b/src/test/java/freemarker/template/ConfigurationTest.java
index 3ab21cc..586bd98 100644
--- a/src/test/java/freemarker/template/ConfigurationTest.java
+++ b/src/test/java/freemarker/template/ConfigurationTest.java
@@ -1251,7 +1251,7 @@
         cfg.setSharedVariable("erased", "");
         assertNotNull(cfg.getSharedVariable("erased"));
         
-        Map<String, Object> vars = new HashMap<String, Object>(); 
+        Map<String, Object> vars = new HashMap<>();
         vars.put("a", "aa");
         vars.put("b", "bb");
         vars.put("c", new MyScalarModel());
@@ -1905,7 +1905,7 @@
     static {
         try {
             CONFIG_TEST_MEMBER_ACCESS_POLICY = new WhitelistMemberAccessPolicy(MemberSelectorListMemberAccessPolicy.MemberSelector.parse(
-                    ImmutableList.<String>of(
+                    ImmutableList.of(
                             File.class.getName() + ".getName()",
                             File.class.getName() + ".isFile()"),
                     false,
@@ -1945,8 +1945,8 @@
     public void testGetSettingNamesAreSorted() throws Exception {
         Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
         for (boolean camelCase : new boolean[] { false, true }) {
-            List<String> names = new ArrayList<String>(cfg.getSettingNames(camelCase)); 
-            List<String> cfgableNames = new ArrayList<String>(new Template(null, "", cfg).getSettingNames(camelCase));
+            List<String> names = new ArrayList<>(cfg.getSettingNames(camelCase));
+            List<String> cfgableNames = new ArrayList<>(new Template(null, "", cfg).getSettingNames(camelCase));
             assertStartsWith(names, cfgableNames);
             
             String prevName = null;
@@ -1964,15 +1964,15 @@
     public void testGetSettingNamesNameConventionsContainTheSame() throws Exception {
         Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
         ConfigurableTest.testGetSettingNamesNameConventionsContainTheSame(
-                new ArrayList<String>(cfg.getSettingNames(false)),
-                new ArrayList<String>(cfg.getSettingNames(true)));
+                new ArrayList<>(cfg.getSettingNames(false)),
+                new ArrayList<>(cfg.getSettingNames(true)));
     }
 
     @Test
     public void testStaticFieldKeysCoverAllGetSettingNames() throws Exception {
         Configuration cfg = new Configuration(Configuration.VERSION_2_3_22);
-        List<String> names = new ArrayList<String>(cfg.getSettingNames(false)); 
-        List<String> cfgableNames = new ArrayList<String>(cfg.getSettingNames(false));
+        List<String> names = new ArrayList<>(cfg.getSettingNames(false));
+        List<String> cfgableNames = new ArrayList<>(cfg.getSettingNames(false));
         assertStartsWith(names, cfgableNames);
         
         for (int i = cfgableNames.size(); i < names.size(); i++) {
diff --git a/src/test/java/freemarker/template/CustomAttributeTest.java b/src/test/java/freemarker/template/CustomAttributeTest.java
index 612d2ca..2ff33da 100644
--- a/src/test/java/freemarker/template/CustomAttributeTest.java
+++ b/src/test/java/freemarker/template/CustomAttributeTest.java
@@ -44,7 +44,7 @@
     private static final Object VALUE_2 = new Object();
     private static final Object VALUE_3 = new Object();
     private static final Object VALUE_LIST = ImmutableList.<Object>of(
-            "s", BigDecimal.valueOf(2), Boolean.TRUE, ImmutableMap.<String, String>of("a", "A"));
+            "s", BigDecimal.valueOf(2), Boolean.TRUE, ImmutableMap.of("a", "A"));
     private static final Object VALUE_BIGDECIMAL = BigDecimal.valueOf(22);
 
     private static final CustomAttribute CUST_ATT_TMP_1 = new CustomAttribute(CustomAttribute.SCOPE_TEMPLATE);
diff --git a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java b/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
index 0719f00..3334301 100644
--- a/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
+++ b/src/test/java/freemarker/template/DefaultObjectWrapperTest.java
@@ -85,7 +85,7 @@
     
     @Test
     public void testIncompatibleImprovementsVersionBreakPoints() throws Exception {
-        List<Version> expected = new ArrayList<Version>();
+        List<Version> expected = new ArrayList<>();
         for (int u = 0; u < 21; u++) {
             expected.add(Configuration.VERSION_2_3_0);
         }
@@ -100,7 +100,7 @@
         expected.add(Configuration.VERSION_2_3_27); // no non-BC change in 2.3.29
         expected.add(Configuration.VERSION_2_3_27); // no non-BC change in 2.3.30
 
-        List<Version> actual = new ArrayList<Version>();
+        List<Version> actual = new ArrayList<>();
         for (int i = _TemplateAPI.VERSION_INT_2_3_0; i <= Configuration.getVersion().intValue(); i++) {
             int major = i / 1000000;
             int minor = i % 1000000 / 1000;
@@ -451,8 +451,8 @@
         {
             // Check custom TM usage and round trip:
             final TemplateModel mr = (TemplateModel) ((TemplateMethodModelEx) bean.get("incTupple"))
-                    .exec(Collections.singletonList(ow.wrap(new Tupple<Integer, Integer>(1, 2))));
-            assertEquals(new Tupple<Integer, Integer>(2, 3), ow.unwrap(mr));
+                    .exec(Collections.singletonList(ow.wrap(new Tupple<>(1, 2))));
+            assertEquals(new Tupple<>(2, 3), ow.unwrap(mr));
             assertTrue(TuppleAdapter.class.isInstance(mr));
         }
     }
@@ -506,7 +506,7 @@
     @SuppressWarnings("boxing")
     @Test
     public void testMapAdapter() throws TemplateModelException {
-        HashMap<String, Object> testMap = new LinkedHashMap<String, Object>();
+        HashMap<String, Object> testMap = new LinkedHashMap<>();
         testMap.put("a", 1);
         testMap.put("b", null);
         testMap.put("c", "C");
@@ -861,7 +861,7 @@
 
     private void testIteratorWrapping(DefaultObjectWrapper ow, Class<?> expectedTMClass, Class<?> expectedPOJOClass)
             throws TemplateModelException {
-        final List<String> list = ImmutableList.<String> of("a", "b", "c");
+        final List<String> list = ImmutableList.of("a", "b", "c");
         Iterator<String> it = list.iterator();
         TemplateCollectionModel coll = (TemplateCollectionModel) ow.wrap(it);
 
@@ -990,7 +990,7 @@
     @Test
     public void testNoEnumerationAdapter() throws TemplateModelException {
          DefaultObjectWrapper ow = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_25).build();
-         Vector<String> vector = new Vector<String>();
+         Vector<String> vector = new Vector<>();
          vector.add("a");
          vector.add("b");
          
@@ -1003,7 +1003,7 @@
     @Test
     public void testEnumerationAdapter() throws TemplateModelException {
          DefaultObjectWrapper ow = new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_26).build();
-         Vector<String> vector = new Vector<String>();
+         Vector<String> vector = new Vector<>();
          vector.add("a");
          vector.add("b");
          
diff --git a/src/test/java/freemarker/template/utility/DeepUnwrapTest.java b/src/test/java/freemarker/template/utility/DeepUnwrapTest.java
index 6b43431..765cb1f 100644
--- a/src/test/java/freemarker/template/utility/DeepUnwrapTest.java
+++ b/src/test/java/freemarker/template/utility/DeepUnwrapTest.java
@@ -39,7 +39,7 @@
     @SuppressWarnings("rawtypes")
     @Test
     public void testHashEx2Unwrapping() throws Exception {
-        Map<Object, Object> map = new LinkedHashMap<Object, Object>();
+        Map<Object, Object> map = new LinkedHashMap<>();
         map.put("k1", "v1");
         map.put("k2", null);
         map.put(3, "v3");
diff --git a/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java b/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
index 6122532..835f05c 100644
--- a/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
+++ b/src/test/java/freemarker/template/utility/TemplateModelUtilTest.java
@@ -56,7 +56,7 @@
     
     @Test
     public void testGetKeyValuePairIterator() throws Exception {
-        Map<Object, Object> map = new LinkedHashMap<Object, Object>();
+        Map<Object, Object> map = new LinkedHashMap<>();
         TemplateHashModelEx thme = new TemplateHashModelExOnly(map);
         
         assertetGetKeyValuePairIteratorContent("", thme);
@@ -92,7 +92,7 @@
 
     @Test
     public void testGetKeyValuePairIteratorWithEx2() throws Exception {
-        Map<Object, Object> map = new LinkedHashMap<Object, Object>();
+        Map<Object, Object> map = new LinkedHashMap<>();
         TemplateHashModelEx thme = DefaultMapAdapter.adapt(map, ow);
         
         assertetGetKeyValuePairIteratorContent("", thme);
@@ -222,15 +222,15 @@
             
             assertEquals(expected.size(), actualEx.size());
             
-            List<String> expectedKeys = new ArrayList<String>(expected.keySet());
-            List<String> actualKeys = new ArrayList<String>();
+            List<String> expectedKeys = new ArrayList<>(expected.keySet());
+            List<String> actualKeys = new ArrayList<>();
             for (TemplateModelIterator it = ((TemplateHashModelEx) actual).keys().iterator(); it.hasNext(); ) {
                 actualKeys.add(((TemplateScalarModel) it.next()).getAsString());
             }
             assertEquals(expectedKeys, actualKeys);
             
-            List<Integer> expectedValues = new ArrayList<Integer>(expected.values());
-            List<Integer> actualValues = new ArrayList<Integer>();
+            List<Integer> expectedValues = new ArrayList<>(expected.values());
+            List<Integer> actualValues = new ArrayList<>();
             for (TemplateModelIterator it = ((TemplateHashModelEx) actual).values().iterator(); it.hasNext(); ) {
                 actualValues.add((Integer) ((TemplateNumberModel) it.next()).getAsNumber());
             }
diff --git a/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java b/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
index f09b88c..da37be4 100644
--- a/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
+++ b/src/test/java/freemarker/test/CopyrightCommentRemoverTemplateLoader.java
@@ -49,12 +49,9 @@
     }
 
     public Reader getReader(Object templateSource, String encoding) throws IOException {
-        Reader reader = innerTemplateLoader.getReader(templateSource, encoding);
-        try {
+        try (Reader reader = innerTemplateLoader.getReader(templateSource, encoding)) {
             String content = IOUtils.toString(reader);
             return new StringReader(TestUtil.removeFTLCopyrightComment(content));
-        } finally {
-            reader.close();
         }
     }
 
diff --git a/src/test/java/freemarker/test/MonitoredTemplateLoader.java b/src/test/java/freemarker/test/MonitoredTemplateLoader.java
index cc504d8..8c9dea7 100644
--- a/src/test/java/freemarker/test/MonitoredTemplateLoader.java
+++ b/src/test/java/freemarker/test/MonitoredTemplateLoader.java
@@ -66,7 +66,7 @@
     }
     
     public List<String> getNamesSearched() {
-        ArrayList<String> result = new ArrayList<String>();
+        ArrayList<String> result = new ArrayList<>();
         for (AbstractTemplateLoaderEvent event : events) {
             if (event instanceof FindTemplateSourceEvent) {
                 result.add(((FindTemplateSourceEvent) event).getName());
diff --git a/src/test/java/freemarker/test/ResourcesExtractor.java b/src/test/java/freemarker/test/ResourcesExtractor.java
index b1cca04..b96c85f 100644
--- a/src/test/java/freemarker/test/ResourcesExtractor.java
+++ b/src/test/java/freemarker/test/ResourcesExtractor.java
@@ -101,14 +101,11 @@
             deleteDstRootDir = !dstRootDir.exists();
         }
         try {
-            BufferedReader contR = new BufferedReader(new InputStreamReader(contIn, "UTF-8"));
-            try {
+            try (BufferedReader contR = new BufferedReader(new InputStreamReader(contIn, "UTF-8"))) {
                 String contLine;
                 while ((contLine = contR.readLine()) != null) {
                     processLine(contLine, resolverClass, srcDirResourcePath, dstRootDir, contResource);
                 }
-            } finally {
-                contR.close();
             }
             jarMarkedSubdirectories(dstRootDir);
             deleteDstRootDir = false;
@@ -231,16 +228,13 @@
     private static void jarDirectory(File srcDir, File jarFile) throws FileNotFoundException, IOException {
         boolean finished = false;
         try {
-            FileOutputStream fileOut = new FileOutputStream(jarFile);
-            try {
+            try (FileOutputStream fileOut = new FileOutputStream(jarFile)) {
                 JarOutputStream jarOut = new JarOutputStream(fileOut);
                 try {
                     addFilesToJar("", srcDir, jarOut);
                 } finally {
                     jarOut.close();
                 }
-            } finally {
-                fileOut.close();
             }
             finished = true;
         } finally {
@@ -275,11 +269,8 @@
         for (File entry : entries) {
             if (entry.isFile()) {
                 jarOut.putNextEntry(new ZipEntry(entryBasePath + entry.getName()));
-                FileInputStream fileIn = new FileInputStream(entry);
-                try {
+                try (FileInputStream fileIn = new FileInputStream(entry)) {
                     IOUtils.copy(fileIn, jarOut);
-                } finally {
-                    fileIn.close();
                 }
                 jarOut.closeEntry();
             } else if (entry.isDirectory()) {
diff --git a/src/test/java/freemarker/test/TemplateTest.java b/src/test/java/freemarker/test/TemplateTest.java
index 9377a45..b55eb62 100644
--- a/src/test/java/freemarker/test/TemplateTest.java
+++ b/src/test/java/freemarker/test/TemplateTest.java
@@ -204,7 +204,7 @@
     
     @SuppressWarnings("boxing")
     protected Map<String, Object> createCommonTestValuesDataModel() {
-        Map<String, Object> dataModel = new HashMap<String, Object>();
+        Map<String, Object> dataModel = new HashMap<>();
         dataModel.put("map", Collections.singletonMap("key", "value"));
         dataModel.put("list", Collections.singletonList("item"));
         dataModel.put("s", "text");
diff --git a/src/test/java/freemarker/test/servlet/WebAppTestCase.java b/src/test/java/freemarker/test/servlet/WebAppTestCase.java
index 3471795..0366bde 100644
--- a/src/test/java/freemarker/test/servlet/WebAppTestCase.java
+++ b/src/test/java/freemarker/test/servlet/WebAppTestCase.java
@@ -59,7 +59,7 @@
 
     private static Server server;
     private static ContextHandlerCollection contextHandlers;
-    private static Map<String, WebAppContext> deployedWebApps = new HashMap<String, WebAppContext>();
+    private static Map<String, WebAppContext> deployedWebApps = new HashMap<>();
     private static volatile File testTempDirectory;
 
     @BeforeClass
@@ -123,11 +123,8 @@
 
             final String content;
             if (responseCode == 200) {
-                InputStream in = httpCon.getInputStream();
-                try {
+                try (InputStream in = httpCon.getInputStream()) {
                     content = IOUtils.toString(in, "UTF-8");
-                } finally {
-                    in.close();
                 }
             } else {
                 content = null;
@@ -184,12 +181,9 @@
         final String expected;
         {
             ClassPathResource cpResource = findWebAppDirectoryResource(webAppName);
-            final InputStream in = cpResource.resolverClass.getResourceAsStream(
-                    cpResource.path + EXPECTED_DIR + expectedFileName);
-            try {
+            try (InputStream in = cpResource.resolverClass.getResourceAsStream(
+                    cpResource.path + EXPECTED_DIR + expectedFileName)) {
                 expected = TestUtil.removeTxtCopyrightComment(normalizeWS(IOUtils.toString(in, "utf-8"), compressWS));
-            } finally {
-                in.close();
             }
         }
         assertEquals(maskIgnored(expected, ignoredParts), maskIgnored(actual, ignoredParts));
diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java b/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
index ba418dd..f0cb148 100644
--- a/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
+++ b/src/test/java/freemarker/test/templatesuite/TemplateTestCase.java
@@ -120,7 +120,7 @@
     private final boolean noOutput;
     
     private final Configuration conf;
-    private final HashMap<String, Object> dataModel = new HashMap<String, Object>();
+    private final HashMap<String, Object> dataModel = new HashMap<>();
     
     public TemplateTestCase(String testName, String simpleTestName, String templateName, String expectedFileName, boolean noOutput,
             Version incompatibleImprovements) {
@@ -249,7 +249,7 @@
         } else if (simpleTestName.equals("beans")) {
             dataModel.put("array", new String[] { "array-0", "array-1"});
             dataModel.put("list", Arrays.asList(new String[] { "list-0", "list-1", "list-2"}));
-            Map<Object, Object> tmap = new HashMap<Object, Object>();
+            Map<Object, Object> tmap = new HashMap<>();
             tmap.put("key", "value");
             Object objKey = new Object();
             tmap.put(objKey, "objValue");
@@ -300,23 +300,23 @@
             dataModel.put("bigDecimal", new SimpleNumber(java.math.BigDecimal.valueOf(1)));
             dataModel.put("bigDecimal2", new SimpleNumber(java.math.BigDecimal.valueOf(1, 16)));
         } else if (simpleTestName.equals("simplehash-char-key")) {
-            HashMap<String, String> mStringC = new HashMap<String, String>();
+            HashMap<String, String> mStringC = new HashMap<>();
             mStringC.put("c", "string");
             dataModel.put("mStringC", mStringC);
             
-            HashMap<String, String> mStringCNull = new HashMap<String, String>();
+            HashMap<String, String> mStringCNull = new HashMap<>();
             mStringCNull.put("c", null);
             dataModel.put("mStringCNull", mStringCNull);
             
-            HashMap<Character, String> mCharC = new HashMap<Character, String>();
+            HashMap<Character, String> mCharC = new HashMap<>();
             mCharC.put(Character.valueOf('c'), "char");
             dataModel.put("mCharC", mCharC);
             
-            HashMap<String, String> mCharCNull = new HashMap<String, String>();
+            HashMap<String, String> mCharCNull = new HashMap<>();
             mCharCNull.put("c", null);
             dataModel.put("mCharCNull", mCharCNull);
             
-            HashMap<Object, String> mMixed = new HashMap<Object, String>();
+            HashMap<Object, String> mMixed = new HashMap<>();
             mMixed.put(Character.valueOf('c'), "char");
             mMixed.put("s", "string");
             mMixed.put("s2", "string2");
@@ -336,8 +336,8 @@
         } else if (simpleTestName.startsWith("type-builtins")) {
             dataModel.put("testmethod", new TestMethod());
             dataModel.put("testnode", new TestNode());
-            dataModel.put("testcollection", new SimpleCollection(new ArrayList<Object>()));
-            dataModel.put("testcollectionEx", DefaultNonListCollectionAdapter.adapt(new HashSet<Object>(), null));
+            dataModel.put("testcollection", new SimpleCollection(new ArrayList<>()));
+            dataModel.put("testcollectionEx", DefaultNonListCollectionAdapter.adapt(new HashSet<>(), null));
             dataModel.put("bean", new TestBean());
         } else if (simpleTestName.equals("date-type-builtins")) {
             GregorianCalendar cal = new GregorianCalendar(2003, 4 - 1, 5, 6, 7, 8);
@@ -379,20 +379,20 @@
             NodeModel nm = NodeModel.parse(is);
             dataModel.put("doc", nm);
         } else if (simpleTestName.startsWith("sequence-builtins")) {
-            Set<String> abcSet = new TreeSet<String>();
+            Set<String> abcSet = new TreeSet<>();
             abcSet.add("a");
             abcSet.add("b");
             abcSet.add("c");
             dataModel.put("abcSet", abcSet);
             dataModel.put("abcSetNonSeq", DefaultNonListCollectionAdapter.adapt(abcSet, beansWrapper));
             
-            List<String> listWithNull = new ArrayList<String>();
+            List<String> listWithNull = new ArrayList<>();
             listWithNull.add("a");
             listWithNull.add(null);
             listWithNull.add("c");
             dataModel.put("listWithNull", listWithNull);
             
-            List<String> listWithNullsOnly = new ArrayList<String>();
+            List<String> listWithNullsOnly = new ArrayList<>();
             listWithNull.add(null);
             listWithNull.add(null);
             listWithNull.add(null);
@@ -400,7 +400,7 @@
             
             dataModel.put("abcCollection", new SimpleCollection(abcSet));
             
-            Set<String> set = new HashSet<String>();
+            Set<String> set = new HashSet<>();
             set.add("a");
             set.add("b");
             set.add("c");
diff --git a/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java b/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
index 17d35c2..52435d1 100644
--- a/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
+++ b/src/test/java/freemarker/test/templatesuite/TemplateTestSuite.java
@@ -81,7 +81,7 @@
     public static final String INCOMPATIBLE_IMPROVEMENTS_PROPERTY_NAME
             = "freemareker.templateTestSuite.incompatibleImprovements";
     
-    private final Map<String, String> testSuiteSettings = new LinkedHashMap<String, String>();
+    private final Map<String, String> testSuiteSettings = new LinkedHashMap<>();
 
     private final ArrayList<Version> testSuiteIcis;
 
@@ -100,7 +100,7 @@
             System.out.println("Note: " + TEST_FILTER_PROPERTY_NAME + " is " + StringUtil.jQuote(testCaseNameFilter));
         }
         
-        testSuiteIcis = new ArrayList<Version>();
+        testSuiteIcis = new ArrayList<>();
         String testedIcIsStr = System.getProperty(INCOMPATIBLE_IMPROVEMENTS_PROPERTY_NAME);
         if (testedIcIsStr != null) {
             for (String iciStr : testedIcIsStr.split(",")) {
@@ -228,7 +228,7 @@
             }
         }
 
-        List<TemplateTestCase> result = new ArrayList<TemplateTestCase>(); 
+        List<TemplateTestCase> result = new ArrayList<>();
         for (Version iciToTest : icisToTest) {
             TemplateTestCase testCase = new TemplateTestCase(
                     caseName + "(ici=" + iciToTest + ")", caseName,
@@ -247,7 +247,7 @@
     }
 
     private List<Version> parseVersionList(String versionsStr) {
-        List<Version> versions = new ArrayList<Version>();
+        List<Version> versions = new ArrayList<>();
         for (String versionStr : versionsStr.split(",")) {
             versionStr = versionStr.trim();
             if (versionStr.length() != 0) {
@@ -279,7 +279,7 @@
 
     private Map<String, String> getCaseFMSettings(Element e) {
         final Map<String, String> caseFMSettings;
-        caseFMSettings = new LinkedHashMap<String, String>();
+        caseFMSettings = new LinkedHashMap<>();
         NodeList settingElems = e.getElementsByTagName(ELEM_SETTING);
         for (int elemIdx = 0; elemIdx < settingElems.getLength(); elemIdx++) {
             NamedNodeMap attrs = settingElems.item(elemIdx).getAttributes();
diff --git a/src/test/java/freemarker/test/templatesuite/models/Listables.java b/src/test/java/freemarker/test/templatesuite/models/Listables.java
index 165dce8..cadcc01 100644
--- a/src/test/java/freemarker/test/templatesuite/models/Listables.java
+++ b/src/test/java/freemarker/test/templatesuite/models/Listables.java
@@ -49,7 +49,7 @@
     
     private static final List<Integer> LIST;
     static {
-        List<Integer> list = new ArrayList<Integer>();
+        List<Integer> list = new ArrayList<>();
         list.add(11);
         list.add(22);
         list.add(33);
@@ -58,7 +58,7 @@
 
     private static final List<Integer> LINKED_LIST;
     static {
-        List<Integer> list = new LinkedList<Integer>();
+        List<Integer> list = new LinkedList<>();
         list.add(11);
         list.add(22);
         list.add(33);
@@ -67,13 +67,13 @@
 
     private static final List<Integer> EMPTY_LINKED_LIST;
     static {
-        List<Integer> list = new LinkedList<Integer>();
+        List<Integer> list = new LinkedList<>();
         EMPTY_LINKED_LIST = list;
     }
     
     private static final Set<Integer> SET;
     static {
-        Set<Integer> set = new TreeSet<Integer>();
+        Set<Integer> set = new TreeSet<>();
         set.add(11);
         set.add(22);
         set.add(33);
@@ -114,7 +114,7 @@
     
     public List<TemplateHashModelEx2> getHashEx2s() throws TemplateModelException {
         Map<Object, Object> map;
-        map = new LinkedHashMap<Object, Object>();
+        map = new LinkedHashMap<>();
         map.put("k1", "v1");
         map.put(2, "v2");
         map.put("k3", "v3");
@@ -126,7 +126,7 @@
     }
 
     public List<? extends TemplateHashModelEx> getEmptyHashes() throws TemplateModelException {
-        List<TemplateHashModelEx> emptyMaps = new ArrayList<TemplateHashModelEx>();
+        List<TemplateHashModelEx> emptyMaps = new ArrayList<>();
         emptyMaps.addAll(getMapsWrappedAsEx2(Collections.emptyMap()));
         emptyMaps.add((TemplateHashModelEx) new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_24).build()
                 .wrap(Collections.emptyMap()));
@@ -137,7 +137,7 @@
      * Returns the map wrapped on various ways.
      */
     private List<TemplateHashModelEx2> getMapsWrappedAsEx2(Map<?, ?> map) throws TemplateModelException {
-        List<TemplateHashModelEx2> maps = new ArrayList<TemplateHashModelEx2>();
+        List<TemplateHashModelEx2> maps = new ArrayList<>();
         
         maps.add((SimpleHash) new DefaultObjectWrapperBuilder(Configuration.VERSION_2_3_0).build().wrap(map));
         
diff --git a/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java b/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
index e73c696..8daf480 100644
--- a/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
+++ b/src/test/java/freemarker/test/templatesuite/models/OverloadedMethods2.java
@@ -922,7 +922,7 @@
     
     @SuppressWarnings("boxing")
     public List<Integer> getJavaIntegerList() {
-        List<Integer> list = new ArrayList<Integer>();
+        List<Integer> list = new ArrayList<>();
         list.add(1);
         list.add(2);
         return list;
@@ -930,7 +930,7 @@
 
     @SuppressWarnings("boxing")
     public List<Byte> getJavaByteList() {
-        List<Byte> list = new ArrayList<Byte>();
+        List<Byte> list = new ArrayList<>();
         list.add((byte) 1);
         list.add((byte) 2);
         return list;
@@ -938,7 +938,7 @@
 
     @SuppressWarnings("boxing")
     public List<Character> getJavaCharacterList() {
-        List<Character> list = new ArrayList<Character>();
+        List<Character> list = new ArrayList<>();
         list.add('c');
         list.add('C');
         return list;
diff --git a/src/test/java/freemarker/test/utility/FileTestCase.java b/src/test/java/freemarker/test/utility/FileTestCase.java
index c8ad159..8f4fc75 100644
--- a/src/test/java/freemarker/test/utility/FileTestCase.java
+++ b/src/test/java/freemarker/test/utility/FileTestCase.java
@@ -105,11 +105,8 @@
     }
 
     private void saveString(File actualFile, String actualContents) throws IOException {
-        Writer w = new OutputStreamWriter(new FileOutputStream(actualFile), "UTF-8");
-        try {
+        try (Writer w = new OutputStreamWriter(new FileOutputStream(actualFile), "UTF-8")) {
             w.write(actualContents);
-        } finally {
-            w.close();
         }
     }