Merge remote-tracking branch 'origin/2.3-gae' into 2.3
diff --git a/DISCLAIMER b/DISCLAIMER
deleted file mode 100644
index 569ba05..0000000
--- a/DISCLAIMER
+++ /dev/null
@@ -1,8 +0,0 @@
-Apache FreeMarker is an effort undergoing incubation at The Apache Software
-Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of
-all newly accepted projects until a further review indicates that the
-infrastructure, communications, and decision making process have stabilized in
-a manner consistent with other successful ASF projects. While incubation
-status is not necessarily a reflection of the completeness or stability of the
-code, it does indicate that the project has yet to be fully endorsed by the
-ASF.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
index d645695..1121eba 100644
--- a/LICENSE
+++ b/LICENSE
@@ -200,3 +200,24 @@
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
+
+=========================================================================
+
+The source code contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
+
+  src/main/misc/overloadedNumberRules/prices.ods
+  src/manual/en_US/docgen-originals/figures/overview.odg
+  src/manual/en_US/docgen-originals/figures/model2sketch_with_alpha.png
+  src/manual/en_US/docgen-originals/figures/tree_with_alpha.png
+  src/manual/en_US/favicon.png
+  src/manual/en_US/figures/model2sketch.png
+  src/manual/en_US/figures/overview.png
+  src/manual/en_US/figures/tree.png
+  src/manual/en_US/logo.png
+  src/manual/zh_CN/favicon.png
+  src/manual/zh_CN/figures/model2sketch.png
+  src/manual/zh_CN/figures/overview.png
+  src/manual/zh_CN/figures/tree.png
+  src/manual/zh_CN/logo.png
diff --git a/NOTICE b/NOTICE
index c14c3fa..929539f 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,5 +1,5 @@
-Apache FreeMarker (incubating)
-Copyright 2015-2017 The Apache Software Foundation
+Apache FreeMarker
+Copyright 2015-2018 The Apache Software Foundation
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
diff --git a/README.md b/README.md
index cf60951..b2f7dd8 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,12 @@
 Apache FreeMarker {version}
 ===========================
 
-[![Build Status](https://travis-ci.org/apache/incubator-freemarker.svg?branch=2.3-gae)](https://travis-ci.org/apache/incubator-freemarker)
+[![Build Status](https://travis-ci.org/apache/freemarker.svg?branch=2.3-gae)](https://travis-ci.org/apache/freemarker)
 
 For the latest version or to report bugs visit:
 https://freemarker.apache.org/
 
 
-DISCLAIMER
-----------
-
-Apache FreeMarker is an effort undergoing incubation at The Apache
-Software Foundation (ASF). Incubation is required of all newly accepted
-projects until a further review indicates that the infrastructure,
-communications, and decision making process have stabilized in a manner
-consistent with other successful ASF projects. While incubation status is
-not necessarily a reflection of the completeness or stability of the
-code, it does indicate that the project has yet to be fully endorsed by
-the ASF.
-
-
 Regarding pull requests on Github
 ---------------------------------
 
diff --git a/build.xml b/build.xml
index 9530672..f6d3bb8 100644
--- a/build.xml
+++ b/build.xml
@@ -386,9 +386,6 @@
       />
     </copy>
     <copy toDir="build/classes/META-INF">
-      <fileset dir="." includes="DISCLAIMER" />
-    </copy>
-    <copy toDir="build/classes/META-INF">
       <fileset dir="src/dist/jar/META-INF" includes="*" />
     </copy>
     <delete dir="build/src-main-java-filtered" />
@@ -668,7 +665,6 @@
         <include name="README.md" />
         <!-- LICENSE is binary-distribution-specific, and is copied later. -->
         <include name="NOTICE" />
-        <include name="DISCLAIMER" />
         <include name="RELEASE-NOTES" />
       </fileset>
     </copy>
@@ -679,7 +675,9 @@
     />
     <!-- Copy binary-distribution-specific files: -->
     <copy todir="${dist.bin.dir}/">
-      <fileset dir="src/dist/bin/" />
+      <fileset dir="src/dist/bin/">
+        <exclude name="rat-excludes" />
+      </fileset>
     </copy>
 
     <!-- Copy binary -->
@@ -717,7 +715,6 @@
         <include name="README.md" />
         <include name="LICENSE" />
         <include name="NOTICE" />
-        <include name="DISCLAIMER" />
         <include name="RELEASE-NOTES" />
       </fileset>
     </copy>
@@ -853,9 +850,9 @@
   </licenses>
   
   <scm>
-    <connection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-freemarker.git</connection>
-    <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/incubator-freemarker.git</developerConnection>
-    <url>https://git-wip-us.apache.org/repos/asf?p=incubator-freemarker.git</url>
+    <connection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git</connection>
+    <developerConnection>scm:git:https://git-wip-us.apache.org/repos/asf/freemarker.git</developerConnection>
+    <url>https://git-wip-us.apache.org/repos/asf?p=freemarker.git</url>
     <tag>v${version}</tag>
   </scm>
 
@@ -867,21 +864,21 @@
   <mailingLists>
     <mailingList>
         <name>FreeMarker developer list</name>
-        <post>dev@freemarker.incubator.apache.org</post>
-        <subscribe>dev-subscribe@freemarker.incubator.apache.org</subscribe>
-        <unsubscribe>dev-unsubscribe@freemarker.incubator.apache.org</unsubscribe>
-        <archive>http://mail-archives.apache.org/mod_mbox/incubator-freemarker-dev/</archive>
+        <post>dev@freemarker.apache.org</post>
+        <subscribe>dev-subscribe@freemarker.apache.org</subscribe>
+        <unsubscribe>dev-unsubscribe@freemarker.apache.org</unsubscribe>
+        <archive>http://mail-archives.apache.org/mod_mbox/freemarker-dev/</archive>
     </mailingList>
     <mailingList>
         <name>FreeMarker commit and Jira notifications list</name>
-        <post>notifications@freemarker.incubator.apache.org</post>
-        <subscribe>notifications-subscribe@freemarker.incubator.apache.org</subscribe>
-        <unsubscribe>notifications-unsubscribe@freemarker.incubator.apache.org</unsubscribe>
-        <archive>http://mail-archives.apache.org/mod_mbox/incubator-freemarker-notifications/</archive>
+        <post>notifications@freemarker.apache.org</post>
+        <subscribe>notifications-subscribe@freemarker.apache.org</subscribe>
+        <unsubscribe>notifications-unsubscribe@freemarker.apache.org</unsubscribe>
+        <archive>http://mail-archives.apache.org/mod_mbox/freemarker-notifications/</archive>
     </mailingList>
     <mailingList>
       <name>FreeMarker management private</name>
-      <post>private@freemarker.incubator.apache.org</post>
+      <post>private@freemarker.apache.org</post>
     </mailingList>
   </mailingLists>
   
@@ -913,12 +910,12 @@
       <fileset dir="${dist.src.dir}/src/main/resources" />
       <fileset dir="${dist.src.dir}/src/main/javacc/" />
       <fileset dir="build/generated-sources/java/" includes="**/*.java" />
-      <metainf dir="${dist.src.dir}" includes="LICENSE, NOTICE, DISCLAIMER" />
+      <metainf dir="${dist.src.dir}" includes="LICENSE, NOTICE" />
     </jar>
 
     <mkdir dir="build/javadoc-attachment-metainf"/>
     <copy todir="build/javadoc-attachment-metainf">
-      <fileset dir="${dist.bin.dir}" includes="DISCLAIMER, NOTICE" />
+      <fileset dir="${dist.bin.dir}" includes="NOTICE" />
     </copy>
     <copy todir="build/javadoc-attachment-metainf">
       <fileset dir="src/dist/javadoc/META-INF/" />
@@ -1098,7 +1095,6 @@
       <patternset>
         <include name="META-INF/*"/>
         <exclude name="META-INF/LICENSE"/>
-        <exclude name="META-INF/DISCLAIMER"/>
         <exclude name="META-INF/NOTICE"/>
       </patternset>
     </unzip>
diff --git a/rat-excludes b/rat-excludes
index cdc8ffc..221d104 100644
--- a/rat-excludes
+++ b/rat-excludes
@@ -38,10 +38,6 @@
 src/manual/zh_CN/figures/tree.png
 src/manual/zh_CN/logo.png
 
-# Binaries/archives created in the Incubatir project:
-src/manual/en_US/apache-incubator.png
-src/manual/zh_CN/apache-incubator.png
-
 # Rat thinks it's a binary, but it's UTF-16 text:
 src/test/resources/freemarker/test/templatesuite/expected/output-encoding2.txt
 
diff --git a/src/dist/bin/LICENSE b/src/dist/bin/LICENSE
index 9cf0525..93af53b 100644
--- a/src/dist/bin/LICENSE
+++ b/src/dist/bin/LICENSE
@@ -203,12 +203,10 @@
 
 =========================================================================
 
-The Apache FreeMarker (incubating) documentation contains the following
-binaries, which were created at the Apache FreeMarker (incubating)
-project, and hence are covered by the same license as the other source
-files of it:
+The Apache FreeMarker documentation contains the following binaries,
+which were created at the Apache FreeMarker project, and hence are
+covered by the same license as the other source files of it:
 
-    documentation/_html/apache-incubator.png
     documentation/_html/docgen-resources/img/patterned-bg.png
     documentation/_html/docgen-resources/img/xxe.png
     documentation/_html/favicon.png
@@ -219,14 +217,6 @@
     
 =========================================================================
 
-The Apache FreeMarker (incubating) documentation contains the following
-binaries, which were created at the Apache Incubator project, and hence
-are covered by the same license as Apache FreeMarker (incubating):
-    
-    documentation/_html/apache-incubator.png
-
-=========================================================================
-
 The documentation includes a selection of icons from various icon sets
 (fonts), stored together inside these files, which were geneated with
 https://icomoon.io/app/:
diff --git a/src/dist/bin/documentation/index.html b/src/dist/bin/documentation/index.html
index 4766233..45a5748 100644
--- a/src/dist/bin/documentation/index.html
+++ b/src/dist/bin/documentation/index.html
@@ -61,7 +61,5 @@
     </ul>
     
     <p><a href="https://freemarker.apache.org/">Visit the FreeMarker home page</a> (help, editor plugins, latest downloads, etc.)</p>
-    
-    <p><i><b>Disclaimer:</b> Apache FreeMarker is an effort undergoing incubation at The Apache Software Foundation (ASF), sponsored by the Apache Incubator. Incubation is required of all newly accepted projects until a further review indicates that the infrastructure, communications, and decision making process have stabilized in a manner consistent with other successful ASF projects. While incubation status is not necessarily a reflection of the completeness or stability of the code, it does indicate that the project has yet to be fully endorsed by the ASF.</i></p>
 </body>
 </html>
diff --git a/src/dist/bin/rat-excludes b/src/dist/bin/rat-excludes
index b97e0b4..4e99682 100644
--- a/src/dist/bin/rat-excludes
+++ b/src/dist/bin/rat-excludes
@@ -20,7 +20,6 @@
 /documentation/_html/api/**
 
 # Images/binaries that were create at FreeMarker:
-documentation/_html/apache-incubator.png
 documentation/_html/docgen-resources/img/patterned-bg.png
 documentation/_html/docgen-resources/img/xxe.png
 documentation/_html/favicon.png
@@ -29,9 +28,6 @@
 documentation/_html/figures/tree.png
 documentation/_html/logo.png
 
-# Images/binaries that were create at other Apache projects:
-documentation/_html/apache-incubator.png
-
 # Fonts whose license is detailed in the LICENSE file:
 documentation/_html/docgen-resources/fonts/icomoon.eot
 documentation/_html/docgen-resources/fonts/icomoon.svg
diff --git a/src/main/java/freemarker/cache/TemplateLoader.java b/src/main/java/freemarker/cache/TemplateLoader.java
index 42d5677..ebbcd9d 100644
--- a/src/main/java/freemarker/cache/TemplateLoader.java
+++ b/src/main/java/freemarker/cache/TemplateLoader.java
@@ -117,6 +117,10 @@
      * template content (based on the {@code #ftl encoding=...} header), this method will be called for a second time
      * with the correct {@code encoding} parameter value.
      * 
+     * <p>
+     * Unlike {@link #findTemplateSource(String)}, this method must not tolerate if the template is not found, and
+     * must throw {@link IOException} in that case. 
+     * 
      * @param templateSource
      *            an object representing a template source, obtained through a prior call to
      *            {@link #findTemplateSource(String)}. This must be an object on which
@@ -126,9 +130,9 @@
      *            to the byte representation of the template stream, and instead directly obtain a character stream.
      *            These loaders should ignore the encoding parameter.
      * 
-     * @return A {@link Reader} representing the template character stream. It's the responsibility of the caller (which
-     *         is {@link TemplateCache} usually) to {@code close()} it. The {@link Reader} is not required to work after
-     *         the {@code templateSource} was closed ({@link #closeTemplateSource(Object)}).
+     * @return A {@link Reader} representing the template character stream; not {@code null}. It's the responsibility of
+     *         the caller (which is {@link TemplateCache} usually) to {@code close()} it. The {@link Reader} is not
+     *         required to work after the {@code templateSource} was closed ({@link #closeTemplateSource(Object)}).
      * 
      * @throws IOException
      *             if an I/O error occurs while accessing the stream.
diff --git a/src/main/java/freemarker/core/Configurable.java b/src/main/java/freemarker/core/Configurable.java
index a2b5d29..3c83e94 100644
--- a/src/main/java/freemarker/core/Configurable.java
+++ b/src/main/java/freemarker/core/Configurable.java
@@ -2365,12 +2365,18 @@
      *   <li><p>{@code "tag_syntax"}:
      *       See {@link Configuration#setTagSyntax(int)}.
      *       <br>String value: Must be one of
-     *       {@code "auto_detect"}, {@code "angle_bracket"}, and {@code "square_bracket"}.
+     *       {@code "auto_detect"}, {@code "angle_bracket"}, and {@code "square_bracket"} (like {@code [#if x]}).
+     *       <br>Note that setting the {@code "tagSyntax"} to {@code "square_bracket"} does <em>not</em> change
+     *       <code>${x}</code> to {@code [=...]}; that's <em>interpolation</em> syntax, so use the
+     *       {@code "interpolation_syntax"} setting for that, not this setting.
      *        
      *   <li><p>{@code "interpolation_syntax"} (since 2.3.28):
      *       See {@link Configuration#setInterpolationSyntax(int)}.
      *       <br>String value: Must be one of
-     *       {@code "legacy"}, {@code "dollar"}, and {@code "square_bracket"}. 
+     *       {@code "legacy"}, {@code "dollar"}, and {@code "square_bracket"} (like {@code [=x]}). 
+     *       <br>Note that setting the {@code "interpolation_syntax"} to {@code "square_bracket"} does <em>not</em>
+     *       change {@code <#if x>} to {@code [#if x]}; that's <em>tag</em> syntax, so use the
+     *       {@code "tag_syntax"} setting for that, not this setting.       
      *       
      *   <li><p>{@code "naming_convention"}:
      *       See {@link Configuration#setNamingConvention(int)}.
diff --git a/src/main/java/freemarker/template/Configuration.java b/src/main/java/freemarker/template/Configuration.java
index f0c6a0d..0785d21 100644
--- a/src/main/java/freemarker/template/Configuration.java
+++ b/src/main/java/freemarker/template/Configuration.java
@@ -376,15 +376,35 @@
         STANDARD_OUTPUT_FORMATS.put(JSONOutputFormat.INSTANCE.getName(), JSONOutputFormat.INSTANCE);
     }
     
+    /**
+     * The parser decides between {@link #ANGLE_BRACKET_TAG_SYNTAX} and {@link #SQUARE_BRACKET_TAG_SYNTAX} based on the
+     * first tag (like {@code [#if x]} or {@code <#if x>}) it mets. Note that {@code [=...]} is <em>not</em> a tag, but
+     * an interpolation, so it's not used for tag syntax auto-detection.
+     */
     public static final int AUTO_DETECT_TAG_SYNTAX = 0;
+    
+    /** For example {@code <#if x><@foo /></#if>} */
     public static final int ANGLE_BRACKET_TAG_SYNTAX = 1;
+    
+    /**
+     * For example {@code [#if x][@foo /][/#if]}.
+     * It does <em>not</em> change <code>${x}</code> to {@code [=x]}; that's square bracket <em>interpolation</em>
+     * syntax ({@link #SQUARE_BRACKET_INTERPOLATION_SYNTAX}).
+     */
     public static final int SQUARE_BRACKET_TAG_SYNTAX = 2;
 
     /** <code>${expression}</code> and the deprecated <code>#{expression; numFormat}</code> @since 2.3.28 */
     public static final int LEGACY_INTERPOLATION_SYNTAX = 20;
+    
     /** <code>${expression}</code> only (not <code>#{expression; numFormat}</code>) @since 2.3.28 */
     public static final int DOLLAR_INTERPOLATION_SYNTAX = 21;
-    /** <code>[=expression]</code> @since 2.3.28 */
+    
+    /**
+     * <code>[=expression]</code> instead of <code>${expression}</code>.
+     * It does <em>not</em> change {@code <#if x>} to {@code [#if x]}; that's square bracket <em>tag</em> syntax
+     * ({@link #SQUARE_BRACKET_TAG_SYNTAX}).
+     * @since 2.3.28
+     */
     public static final int SQUARE_BRACKET_INTERPOLATION_SYNTAX = 22;
     
     public static final int AUTO_DETECT_NAMING_CONVENTION = 10;
@@ -2378,15 +2398,20 @@
 
     /**
      * Determines the tag syntax (like {@code <#if x>} VS {@code [#if x]}) of the template files 
-     * that has no {@code #ftl} header to decide that. The {@code tagSyntax} parameter must be one of:
+     * that has no {@code #ftl} header to decide that. Don't confuse this with the interpolation syntax
+     * ({@link #setInterpolationSyntax(int)}); they are independent.
+     * 
+     * <p>The {@code tagSyntax} parameter must be one of:
      * <ul>
      *   <li>{@link Configuration#AUTO_DETECT_TAG_SYNTAX}:
-     *     use the syntax of the first FreeMarker tag (can be anything, like <tt>#list</tt>,
+     *     Use the syntax of the first FreeMarker tag (can be anything, like <tt>#list</tt>,
      *     <tt>#include</tt>, user defined, etc.)
      *   <li>{@link Configuration#ANGLE_BRACKET_TAG_SYNTAX}:
-     *     use the angle bracket syntax (the normal syntax)
+     *     Use the angle bracket tag syntax (the normal syntax), like {@code <#include ...>}
      *   <li>{@link Configuration#SQUARE_BRACKET_TAG_SYNTAX}:
-     *     use the square bracket syntax
+     *     Use the square bracket tag syntax, like {@code [#include ...]}. Note that this does <em>not</em> change
+     *     <code>${x}</code> to {@code [=...]}; that's <em>interpolation</em> syntax, so use
+     *     {@link #setInterpolationSyntax(int)} for that.
      * </ul>
      *
      * <p>In FreeMarker 2.3.x {@link Configuration#ANGLE_BRACKET_TAG_SYNTAX} is the
@@ -2413,9 +2438,14 @@
     }
 
     /**
-     * Determines the interpolation syntax (like <code>${x}</code> VS <code>[=x]</code>) of the template files. The
-     * {@code interpolationSyntax} parameter must be one of {@link Configuration#LEGACY_INTERPOLATION_SYNTAX},
+     * Determines the interpolation syntax (like <code>${x}</code> VS <code>[=x]</code>) of the template files. Don't
+     * confuse this with the tag syntax ({@link #setTagSyntax(int)}); they are independent.
+     * 
+     * <p>
+     * The {@code interpolationSyntax} parameter must be one of {@link Configuration#LEGACY_INTERPOLATION_SYNTAX},
      * {@link Configuration#DOLLAR_INTERPOLATION_SYNTAX}, and {@link Configuration#SQUARE_BRACKET_INTERPOLATION_SYNTAX}.
+     * Note that {@link Configuration#SQUARE_BRACKET_INTERPOLATION_SYNTAX} does <em>not</em> change {@code <#if x>} to
+     * {@code [#if x]}; that's <em>tag</em> syntax, so use {@link #setTagSyntax(int)} for that.
      * 
      * @see #setTagSyntax(int)
      * 
diff --git a/src/main/javacc/FTL.jj b/src/main/javacc/FTL.jj
index d1ab33d..0946661 100644
--- a/src/main/javacc/FTL.jj
+++ b/src/main/javacc/FTL.jj
Binary files differ
diff --git a/src/main/resources/freemarker/version.properties b/src/main/resources/freemarker/version.properties
index 1b862c0..24a3d29 100644
--- a/src/main/resources/freemarker/version.properties
+++ b/src/main/resources/freemarker/version.properties
@@ -26,7 +26,6 @@
 #   Qualifier :: = NightlyQualifier
 #                  |
 #                  ( ('pre'|'rc') twoDigitPositiveInteger ('-' NightlyQualifier)? )
-#                  '-incubating'?
 #   NightlyQualifier :: = 'nightly_@timestampInVersion@'
 #
 # This format is compatible both with Maven and JSR 277, and it must
@@ -57,12 +56,11 @@
 #   continue working without modification or recompilation.
 # - When the major version number is increased, major backward
 #   compatibility violations are allowed, but still should be avoided.
-# During Apache Incubation, "-incubating" is added to this string.
-version=2.3.28-nightly_@timestampInVersion@-incubating
+version=2.3.28
 # This exists as for Maven we use "-SNAPSHOT" for nightly releases,
-# and no _nightly_@timestampInVersion@. Also, "-incubating" is added
-# *before* "-SNAPSHOT". For final releases it's the same as "version".
-mavenVersion=2.3.28-incubating-SNAPSHOT
+# and no _nightly_@timestampInVersion@. For final releases it's the
+# same as "version".
+mavenVersion=2.3.28
 
 # Version string that conforms to OSGi
 # ------------------------------------
@@ -70,13 +68,12 @@
 # This is different from the plain version string:
 # - "." is used instead of a "-" before the qualifier.
 # - The stable releases must use "stable" qualifier.
-#   Examples:
+# - Examples:
 #   2.4.0.stable
 #   2.4.0.rc01
 #   2.4.0.pre01
 #   2.4.0.nightly_@timestampInVersion@
-# During Apache Incubation, "-incubating" is added to this string.
-versionForOSGi=2.3.28.nightly_@timestampInVersion@-incubating
+versionForOSGi=2.3.28.stable
 
 # Version string that conforms to legacy MF
 # -----------------------------------------
@@ -95,7 +92,7 @@
 # "97 denotes "nightly", 98 denotes "pre", 99 denotes "rc" build.
 # In general, for the nightly/preview/rc Y of version 2.X, the versionForMf is
 # 2.X-1.(99|98).Y. Note the X-1.
-versionForMf=2.3.27.97
+versionForMf=2.3.28
 
 # The date of the build.
 # This should be automatically filled by the building tool (Ant).
diff --git a/src/manual/en_US/apache-incubator.png b/src/manual/en_US/apache-incubator.png
deleted file mode 100644
index 7ab45fc..0000000
--- a/src/manual/en_US/apache-incubator.png
+++ /dev/null
Binary files differ
diff --git a/src/manual/en_US/book.xml b/src/manual/en_US/book.xml
index 3fcef11..f59d2eb 100644
--- a/src/manual/en_US/book.xml
+++ b/src/manual/en_US/book.xml
@@ -73,18 +73,6 @@
     <para>FreeMarker is <link
     xlink:href="http://www.fsf.org/philosophy/free-sw.html">Free</link>,
     released under the Apache License, Version 2.0.</para>
-
-    <para><emphasis role="bold">Disclaimer: </emphasis><emphasis>Apache
-    FreeMarker is an effort undergoing incubation at The Apache Software
-    Foundation (ASF), sponsored by the <link
-    xlink:href="http://incubator.apache.org">Apache Incubator</link>.
-    Incubation is required of all newly accepted projects until a further
-    review indicates that the infrastructure, communications, and decision
-    making process have stabilized in a manner consistent with other
-    successful ASF projects. While incubation status is not necessarily a
-    reflection of the completeness or stability of the code, it does indicate
-    that the project has yet to be fully endorsed by the
-    ASF.</emphasis></para>
   </preface>
 
   <part xml:id="dgui">
@@ -6260,8 +6248,7 @@
         configured to be like <literal>[=x]</literal> instead of
         <literal>${x}</literal>. Also, independently of that, the FreeMarker
         tag syntax can be configured to use <literal>[]</literal>, like in
-        <literal>[#if x]<replaceable>...</replaceable>[/#if]</literal>.
-        </para>
+        <literal>[#if x]<replaceable>...</replaceable>[/#if]</literal>.</para>
 
         <note>
           <para>While both the <quote>tag syntax</quote> and
@@ -9554,6 +9541,11 @@
         <section>
           <title>Overview</title>
 
+          <note>
+            <para>Custom formats (of the kind described here) exists since
+            FreeMarker 2.3.24.</para>
+          </note>
+
           <para>FreeMarker allows you to define your own number and
           date/time/datetime formats, and associate a name to them. This
           mechanism has several applications:</para>
@@ -20607,14 +20599,15 @@
                 application uses a custom
                 <literal>freemarker.cache.TemplateLoader</literal>
                 implementation, which incorrectly (against the API
-                documentation) throws an <literal>IOException</literal>
-                instead of returning <literal>null</literal> if a template is
-                not found. If it's so, the Java programmers need to fix that.
-                Another possibility is of course that it was indeed not
-                possible to tell if the template exists or not due to some
-                technical issues, in which case stopping with error is the
-                correct behavior. See the cause <literal>IOException</literal>
-                in the Java stack trace to figure out which case it is.</para>
+                documentation) throws an <literal>IOException</literal> in the
+                <literal>findTemplateSource</literal> method instead of
+                returning <literal>null</literal> if a template is not found.
+                If it's so, the Java programmers need to fix that. Another
+                possibility is of course that it was indeed not possible to
+                tell if the template exists or not due to some technical
+                issues, in which case stopping with error is the correct
+                behavior. See the cause <literal>IOException</literal> in the
+                Java stack trace to figure out which case it is.</para>
               </note>
             </listitem>
           </itemizedlist>
@@ -23894,7 +23887,8 @@
           often because your application uses a custom
           <literal>freemarker.cache.TemplateLoader</literal> implementation,
           which incorrectly (against the API documentation) throws an
-          <literal>IOException</literal> instead of returning
+          <literal>IOException</literal> in the
+          <literal>findTemplateSource</literal> method instead of returning
           <literal>null</literal> if a template is not found. If it's so, the
           Java programmers need to fix that. Another possibility is of course
           that it was indeed not possible to tell if the template exists or
@@ -27620,14 +27614,9 @@
       <title>Version history</title>
 
       <section xml:id="versions_2_3_28">
-        <title>2.3.28 (incubating at Apache)</title>
+        <title>2.3.28</title>
 
-        <para>Release date: [FIXME]</para>
-
-        <para><emphasis role="bold">This is a stable, final
-        release.</emphasis> The <quote>incubating</quote> suffix is required
-        by the Apache Software Foundation until the project becomes a fully
-        accepted (graduated) Apache project.</para>
+        <para>Release date: 2018-03-30 + release process</para>
 
         <section>
           <title>Changes on the FTL side</title>
@@ -27665,8 +27654,10 @@
             </listitem>
 
             <listitem>
-              <para>Added new built-ins: <literal>sequence?min</literal> and
-              <literal>sequence?max</literal> (<link
+              <para>Added new built-ins:
+              <literal><replaceable>sequence</replaceable>?min</literal> and
+              <literal><replaceable>sequence</replaceable>?max</literal>
+              (<link
               xlink:href="https://issues.apache.org/jira/browse/FREEMARKER-86">FREEMARKER-86</link>),
               which return the smallest and greatest item from a list of
               numbers or date/time/date-times. <link
@@ -27777,16 +27768,15 @@
 
             <listitem>
               <para>When specifying the <literal>output_format</literal>
-              configuration settings with
+              configuration setting with
               <literal>String</literal>-<literal>String</literal> key-value
               pairs (like with <literal>Configuration.setSetting(String,
               String)</literal> or in a <literal>.properties</literal> file),
-              it's now possible to specify the standard output formats by name
-              rather than by class name (like
-              <literal>output_format=HTML</literal>). (Custom formats still
-              has to be referred by class name, as FreeMarker can't discover
-              what their names are, since it's not aware of the custom
-              classes.)</para>
+              it's now possible to specify the standard output formats by
+              short name (like <literal>output_format=HTML</literal>) rather
+              than by class name. (Custom formats still has to be referred by
+              class name, as FreeMarker can't discover what their names are,
+              since it's not aware of the custom classes.)</para>
             </listitem>
 
             <listitem>
@@ -27794,7 +27784,7 @@
               <literal>Configuration.removeTemplateFromCache</literal>
               overload that has a <literal>Object
               customLookupCondition</literal> parameter. This is useful to
-              manually evacuate a template from the cache that was get via a
+              manually evacuate a template from the cache that was get with a
               non-<literal>null</literal> custom lookup condition.</para>
             </listitem>
 
@@ -27873,16 +27863,16 @@
               <para>The default arithmetic engine
               (<literal>ArithmeticEngine.BIGDECIMAL_ENGINE</literal>) can now
               compare infinite (both positive and negative) to any other
-              standard type. Earlier, since <literal>BigDecimal</literal>
-              can't represent infinite, it was only working in certain special
-              cases. Also did some performance optimizations to slightly
-              decrease the impact and number of conversions to
-              <literal>BigDecimal</literal>.</para>
+              standard numerical type. Earlier, since
+              <literal>BigDecimal</literal> can't represent infinite, it was
+              only working in certain special cases. Also there were some
+              performance optimizations to slightly decrease the impact and
+              number of conversions to <literal>BigDecimal</literal>.</para>
             </listitem>
 
             <listitem>
               <para>Avoided possible performance bottleneck when executing
-              templates on many threads, caused be that
+              templates on many threads, caused by that
               <literal>java.beans.PropertyDescriptor.getReadMethod()</literal>
               is synchronized (<link
               xlink:href="https://issues.apache.org/jira/browse/FREEMARKER-80">FREEMARKER-80</link>).</para>
@@ -27917,28 +27907,29 @@
             <listitem>
               <para>When the <link
               linkend="pgui_config_incompatible_improvements_how_to_set"><literal>incompatible_improvements</literal>
-              setting</link> is set to 2.3.28 (or greater), fixed legacy
+              setting</link> is set to 2.3.28 (or greater): Fixed legacy
               parser glitch where a tag can be closed with an illegal
               <literal>]</literal> (when it's not part of an expression)
               despite that the tag syntax is set to angle brackets. For
               example <literal>&lt;#if x]</literal> worked just like
-              <literal>&lt;#if x&gt;</literal>. Note that it doesn't affect
-              the legal usage of <literal>]</literal>, like <literal>&lt;#if
-              x[0]&gt;</literal> works correctly without this fix as
-              well.</para>
+              <literal>&lt;#if x&gt;</literal>. Note that this legacy glitch
+              didn't affect the legal usage of <literal>]</literal>, like
+              <literal>&lt;#if x[0]&gt;</literal> has always worked
+              correctly.</para>
             </listitem>
 
             <listitem>
               <para>Fixed parser bug that disallowed using
-              <literal>&gt;</literal> at the top-level inside an interpolation
-              (<literal>${...}</literal>). It had the same reason why
-              <literal>&lt;#if x &gt; y&gt;</literal> doesn't work as naively
-              expected, but there's no real ambiguity in <literal>${x &gt;
-              y}</literal>, so now it's allowed. Note that <literal>${(x &gt;
-              y)?c}</literal> and <literal>${(x &gt; y)?string('y',
-              'n')}</literal>, which are how booleans are commonly printed,
-              have always worked, as the <literal>&gt;</literal> operation is
-              not on the top-level inside the interpolation.</para>
+              <literal>&gt;</literal> as the top-level expression inside an
+              interpolation (<literal>${...}</literal>). It had the same
+              reason why <literal>&lt;#if x &gt; y&gt;</literal> doesn't work
+              as naively expected, but there's no real ambiguity in
+              <literal>${x &gt; y}</literal>, so now it's allowed. Note that
+              <literal>${(x &gt; y)?c}</literal> and <literal>${(x &gt;
+              y)?string('y', 'n')}</literal>, which are how booleans are
+              commonly printed, have always worked, as the
+              <literal>&gt;</literal> operation is not on the top-level inside
+              the interpolation.</para>
             </listitem>
 
             <listitem>
@@ -27949,6 +27940,19 @@
             </listitem>
           </itemizedlist>
         </section>
+
+        <section>
+          <title>Other changes</title>
+
+          <itemizedlist>
+            <listitem>
+              <para>FreeMarker has graduated from the Apache Incubator (as of
+              2018-03-21), and now is a normal top-level project at Apache.
+              Therefore, the version number doesn't contain
+              <quote>-incubating</quote> anymore.</para>
+            </listitem>
+          </itemizedlist>
+        </section>
       </section>
 
       <section xml:id="versions_2_3_27">
@@ -28784,18 +28788,6 @@
           The license is still Apache License Version 2.0, just like earlier,
           but the owner is different. The official full product name has
           changed to Apache FreeMarker.</para>
-
-          <para><emphasis role="bold">Disclaimer:</emphasis><emphasis> Apache
-          FreeMarker is an effort undergoing incubation at The Apache Software
-          Foundation (ASF), sponsored by the <link
-          xlink:href="http://incubator.apache.org">Apache Incubator</link>.
-          Incubation is required of all newly accepted projects until a
-          further review indicates that the infrastructure, communications,
-          and decision making process have stabilized in a manner consistent
-          with other successful ASF projects. While incubation status is not
-          necessarily a reflection of the completeness or stability of the
-          code, it does indicate that the project has yet to be fully endorsed
-          by the ASF.</emphasis></para>
         </section>
 
         <section>
diff --git a/src/manual/en_US/docgen.cjson b/src/manual/en_US/docgen.cjson
index b2b977e..4652dae 100644
--- a/src/manual/en_US/docgen.cjson
+++ b/src/manual/en_US/docgen.cjson
@@ -131,7 +131,3 @@
   "Twitter": { class: "twitter", href: "olink:twitter" }
   "Stack Overflow": { class: "stack-overflow", href: "olink:newStackOverflowQuestion" }
 }
-
-sideTOCLogos: [
-  { src: "apache-incubator.png", alt: "Apache Incubator", href: "olink:asfIncubator" }
-]
diff --git a/src/manual/zh_CN/apache-incubator.png b/src/manual/zh_CN/apache-incubator.png
deleted file mode 100644
index 7ab45fc..0000000
--- a/src/manual/zh_CN/apache-incubator.png
+++ /dev/null
Binary files differ
diff --git a/src/manual/zh_CN/docgen.cjson b/src/manual/zh_CN/docgen.cjson
index 59df72a..88addcf 100644
--- a/src/manual/zh_CN/docgen.cjson
+++ b/src/manual/zh_CN/docgen.cjson
@@ -129,7 +129,3 @@
   "Twitter": { class: "twitter", href: "olink:twitter" }
   "Stack Overflow": { class: "stack-overflow", href: "olink:newStackOverflowQuestion" }
 }
-
-sideTOCLogos: [
-  { src: "apache-incubator.png", alt: "Apache Incubator", href: "olink:asfIncubator" }
-]