You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@freemarker.apache.org by dd...@apache.org on 2017/07/16 23:15:58 UTC

[4/4] incubator-freemarker git commit: Renamed `?datetime` and `?datetimeIfUnknown` and the `datetimeFormat` setting to `?dateTime` and `?dateTimeIfUnknown` and `dateTimeFormat`. (In general, it's `dateTime`, not `datetime` everywhere. This is consistent

Renamed `?datetime` and `?datetimeIfUnknown` and the `datetimeFormat` setting to `?dateTime` and `?dateTimeIfUnknown` and `dateTimeFormat`. (In general, it's `dateTime`, not `datetime` everywhere. This is consistent with the configuration get/setter names, and with the Java 8 API). Also renamed TemplateDateModel.DATETIME to DATE_TIME.


Project: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/commit/2af16e4f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/tree/2af16e4f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-freemarker/diff/2af16e4f

Branch: refs/heads/3
Commit: 2af16e4f2837ba15da22a8dbe766ffbefbb3a8eb
Parents: 7e171b7
Author: ddekany <dd...@apache.org>
Authored: Mon Jul 17 00:04:06 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Mon Jul 17 00:04:06 2017 +0200

----------------------------------------------------------------------
 FM3-CHANGE-LOG.txt                              | 14 +++--
 .../core/FM2ASTToFM3SourceConverter.java        |  3 +
 .../freemarker/core/CoercionToTextualTest.java  |  2 +-
 .../apache/freemarker/core/DateFormatTest.java  | 48 +++++++-------
 .../core/ParsingErrorMessagesTest.java          |  6 ++
 .../apache/freemarker/core/SQLTimeZoneTest.java | 66 ++++++++++----------
 .../DefaultObjectWrapperSingletonsTest.java     |  4 +-
 .../templatesuite/CoreTemplateTestSuite.java    |  2 +-
 .../templatesuite/models/AllTemplateModels.java |  2 +-
 .../templates/date-type-builtins.ftl            |  2 +-
 .../templates/dateformat-iso-bi.ftl             | 10 +--
 .../templates/dateformat-iso-like.ftl           | 10 +--
 .../templatesuite/templates/dateformat-java.ftl |  2 +-
 .../templatesuite/templates/dateparsing.ftl     | 42 ++++++-------
 .../templates/sequence-builtins.ftl             |  2 +-
 .../core/templatesuite/templates/setting.ftl    |  4 +-
 .../apache/freemarker/core/ASTDirSetting.java   |  8 ++-
 .../apache/freemarker/core/ASTExpBuiltIn.java   | 18 ++++--
 .../freemarker/core/ASTExpBuiltInVariable.java  |  2 +-
 .../core/BuiltInsForMultipleTypes.java          |  6 +-
 .../org/apache/freemarker/core/Environment.java | 16 ++---
 .../org/apache/freemarker/core/MessageUtil.java |  4 +-
 .../core/ProcessingConfiguration.java           |  2 +-
 .../core/model/TemplateDateModel.java           |  6 +-
 .../freemarker/core/model/impl/SimpleDate.java  |  6 +-
 .../apache/freemarker/core/util/FTLUtil.java    |  2 +-
 .../core/valueformat/TemplateDateFormat.java    |  8 +--
 .../valueformat/TemplateDateFormatFactory.java  |  2 +-
 .../impl/ISOLikeTemplateDateFormat.java         |  4 +-
 .../impl/JavaTemplateDateFormatFactory.java     |  2 +-
 .../org/apache/freemarker/dom/NodeModel.java    |  4 +-
 .../examples/TemplateConfigurationExamples.java |  2 +-
 .../examples/CustomFormatsExample-alias1.ftlh   |  2 +-
 .../servlet/jsp/webapps/basic/attributes.ftl    |  2 +-
 34 files changed, 171 insertions(+), 144 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/FM3-CHANGE-LOG.txt
----------------------------------------------------------------------
diff --git a/FM3-CHANGE-LOG.txt b/FM3-CHANGE-LOG.txt
index 9004675..3d32e15 100644
--- a/FM3-CHANGE-LOG.txt
+++ b/FM3-CHANGE-LOG.txt
@@ -27,6 +27,10 @@ https://cwiki.apache.org/confluence/display/FREEMARKER/FreeMarker+3
 Template language changes
 =========================
 
+Note that the template converter tool (freemarker-converter) can automatically apply many of these changes on FM2
+templates. But changes that aren't purely syntactical (but behavioral) often can't be treated with 100% safety or at
+all, in which ase it's always noted for that change.
+
 Major changes / features
 ------------------------
 
@@ -44,26 +48,25 @@ Smaller changes
 
 Node: Changes already mentioned above aren't repeated here!
 
-- Renamed `?datetime` and `?datetimeIfUnknown` and the `datetimeFormat` setting to
-  `?dateTime` and `?dateTimeIfUnknown` and `dateTimeFormat`.
 - Removed support for all old glitches that you could turn on/off with incompatibleImprovements in FM2
+  (These are generally not covered by the converter tool.)
 - Removed some long deprecated template language directives:
   - <#call ...> (deprecated by <@... />)
   - <#comment>...</#comment> (deprecated by <#-- ... -->)
   - <#transform ...>...</#transform> (deprecated by <@....@...>)
   - <#foreach x in xs>...</#foreach> (deprecated by <#list xs as x>...</#list>)
-- #include has no "encoding" parameter anymore (see reasons in the API changes)
 - Removed long deprecated `#{}` interpolations. They are treated as plain static text now. (The
   template converter tool translates these to `${}` interpolations. For example `#{x}` is simply
   translated to `${b}`, while `#{x; m1M3}` is translated to `${x?string('0.0##')}`).
+- #include has no "encoding" parameter anymore (as now only the Configuration is responsible ofr deciding the encoding)
 - You can't close #attempt/#recover with `</#recover>` anymore, only with `<#attempt>`. This was the
   standard form in FM2 as well, and is consistent with how #if/#else works. (The template converter
   tool does this conversion.)
 - Inside a #switch, #case can't be after #default anymore (this is actually a bug in FM2)
   (The template converter can't fix this automatically, but reports it as an error.)
 - #else and #elseIf tags must be ended without "/", for example, <#else/> is illegal now, <#else> is legal.
-  (The template converter tool does this conversion.)
-- .template_name now means the same as .current_template_name (it doesn't emulate 2.3 glitches anymore)
+- Renamed `?datetime` and `?datetimeIfUnknown` and the `datetimeFormat` setting to
+  `?dateTime` and `?dateTimeIfUnknown` and `dateTimeFormat`. (In general, it's `dateTime`, not `datetime` everywhere.)
 
 
 Java API changes
@@ -289,6 +292,7 @@ Core / Models and Object wrapping
 - Removed DefaultObjectWrapper.methodsShadowItems setting, in effect defaulting it to true. This has decided if the generic
   get method (`get(String)`) had priority over methods of similar name. The generic get method is only recognized from its
   name and parameter type, so it's a quite consfusing feature, and might will be removed alltogether.
+- Renamed TemplateDateModel.DATETIME to DATE_TIME (to be consistent with "dateTime" used elsewhere).
 
 Core / Template loading and caching
 ...................................

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
----------------------------------------------------------------------
diff --git a/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java b/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
index c60c31f..db61f98 100644
--- a/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
+++ b/freemarker-converter/src/main/java/freemarker/core/FM2ASTToFM3SourceConverter.java
@@ -1884,6 +1884,9 @@ public class FM2ASTToFM3SourceConverter {
             .put("iso_ms_nz", "isoMsNZ")
             .put("iso_m_nz", "isoMNZ")
             .put("iso_h_nz", "isoHNZ")
+            .put("datetime", "dateTime")
+            .put("datetime_if_unknown", "dateTimeIfUnknown")
+            .put("datetimeIfUnknown", "dateTimeIfUnknown")
             .build();
 
     private void printParameterSeparatorSource(Expression lho, Expression rho) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
index 1e945fe..1a98373 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/CoercionToTextualTest.java
@@ -40,7 +40,7 @@ public class CoercionToTextualTest extends TemplateTest {
     
     /** 2015-09-06T12:00:00Z */
     private static long T = 1441540800000L;
-    private static TemplateDateModel TM = new SimpleDate(new Date(T), TemplateDateModel.DATETIME);
+    private static TemplateDateModel TM = new SimpleDate(new Date(T), TemplateDateModel.DATE_TIME);
     
     @Test
     public void testBasicStringBuiltins() throws IOException, TemplateException {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/java/org/apache/freemarker/core/DateFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/DateFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/DateFormatTest.java
index 9cd835b..b0ca6ad 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/DateFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/DateFormatTest.java
@@ -53,7 +53,7 @@ public class DateFormatTest extends TemplateTest {
     
     /** 2015-09-06T12:00:00Z */
     private static long T = 1441540800000L;
-    private static TemplateDateModel TM = new SimpleDate(new Date(T), TemplateDateModel.DATETIME);
+    private static TemplateDateModel TM = new SimpleDate(new Date(T), TemplateDateModel.DATE_TIME);
     
     private TestConfigurationBuilder createConfigurationBuilder() {
         return new TestConfigurationBuilder()
@@ -82,13 +82,13 @@ public class DateFormatTest extends TemplateTest {
 
         setConfigurationWithDateTimeFormat("@epoch");
         assertOutput(
-                "<#assign d = d?datetime>"
+                "<#assign d = d?dateTime>"
                 + "${d} ${d?string} <#setting locale='de_DE'>${d}",
                 "123456789 123456789 123456789");
 
         setConfigurationWithDateTimeFormat("@htmlIso");
         assertOutput(
-                "<#assign d = d?datetime>"
+                "<#assign d = d?dateTime>"
                 + "${d} ${d?string} <#setting locale='de_DE'>${d}",
                 "1970-01-02<span class='T'>T</span>10:17:36Z "
                 + "1970-01-02T10:17:36Z "
@@ -110,7 +110,7 @@ public class DateFormatTest extends TemplateTest {
 
         setConfigurationWithDateTimeFormat("@loc");
         assertOutput(
-                "<#assign d = d?datetime>"
+                "<#assign d = d?dateTime>"
                 + "${d} ${d?string} "
                 + "<#setting locale='de_DE'>"
                 + "${d} ${d?string} "
@@ -126,18 +126,18 @@ public class DateFormatTest extends TemplateTest {
         addToDataModel("d", new Date(123456789));
         setConfigurationWithDateTimeFormat("iso");
         assertOutput(
-                "${d?string.@loc} ${d?string.@loc} ${d?datetime?isoLocal} "
+                "${d?string.@loc} ${d?string.@loc} ${d?dateTime?isoLocal} "
                 + "<#setting timeZone='GMT+02:00'>"
-                + "${d?string.@loc} ${d?string.@loc} ${d?datetime?isoLocal} "
+                + "${d?string.@loc} ${d?string.@loc} ${d?dateTime?isoLocal} "
                 + "<#setting timeZone='GMT+01:00'>"
-                + "${d?string.@loc} ${d?string.@loc} ${d?datetime?isoLocal}",
+                + "${d?string.@loc} ${d?string.@loc} ${d?dateTime?isoLocal}",
                 "123456789@en_US:GMT+01:00 123456789@en_US:GMT+01:00 1970-01-02T11:17:36+01:00 "
                 + "123456789@en_US:GMT+02:00 123456789@en_US:GMT+02:00 1970-01-02T12:17:36+02:00 "
                 + "123456789@en_US:GMT+01:00 123456789@en_US:GMT+01:00 1970-01-02T11:17:36+01:00");
 
         setConfigurationWithDateTimeFormat("@loc");
         assertOutput(
-                "<#assign d = d?datetime>"
+                "<#assign d = d?dateTime>"
                 + "${d} ${d?string} "
                 + "<#setting timeZone='GMT+02:00'>"
                 + "${d} ${d?string} "
@@ -163,14 +163,14 @@ public class DateFormatTest extends TemplateTest {
                 .timeFormat("[wrong t]")
                 .build());
         assertErrorContains("${.now?date}", "\"dateFormat\"", "[wrong d]");
-        assertErrorContains("${.now?datetime}", "\"dateTimeFormat\"", "[wrong dt]");
+        assertErrorContains("${.now?dateTime}", "\"dateTimeFormat\"", "[wrong dt]");
         assertErrorContains("${.now?time}", "\"timeFormat\"", "[wrong t]");
     }
 
     @Test
     public void testCustomParameterized() throws Exception {
         Configuration cfg = getConfiguration();
-        addToDataModel("d", new SimpleDate(new Date(12345678L), TemplateDateModel.DATETIME));
+        addToDataModel("d", new SimpleDate(new Date(12345678L), TemplateDateModel.DATE_TIME));
         setConfigurationWithDateTimeFormat("@div 1000");
         assertOutput("${d}", "12345");
         assertOutput("${d?string}", "12345");
@@ -225,7 +225,7 @@ public class DateFormatTest extends TemplateTest {
     
     @Test
     public void testIcIAndEscaping() throws Exception {
-        addToDataModel("d", new SimpleDate(new Date(12345678L), TemplateDateModel.DATETIME));
+        addToDataModel("d", new SimpleDate(new Date(12345678L), TemplateDateModel.DATE_TIME));
         
         setConfigurationWithDateTimeFormat("@epoch");
         assertOutput("${d}", "12345678");
@@ -261,7 +261,7 @@ public class DateFormatTest extends TemplateTest {
         // Test that values are coming from the cache if possible
         for (Class dateClass : new Class[] { Date.class, Timestamp.class, java.sql.Date.class, Time.class } ) {
             for (int dateType
-                    : new int[] { TemplateDateModel.DATE, TemplateDateModel.TIME, TemplateDateModel.DATETIME }) {
+                    : new int[] { TemplateDateModel.DATE, TemplateDateModel.TIME, TemplateDateModel.DATE_TIME }) {
                 String formatString =
                         dateType == TemplateDateModel.DATE ? cfg.getDateFormat() :
                         (dateType == TemplateDateModel.TIME ? cfg.getTimeFormat()
@@ -280,9 +280,9 @@ public class DateFormatTest extends TemplateTest {
         String dateTimeFormatStr2 = dateTimeFormatStr + "'!'";
         
         assertEquals("2015.09.06. 13:00",
-                env.getTemplateDateFormat(TemplateDateModel.DATETIME, Date.class).formatToPlainText(TM));
+                env.getTemplateDateFormat(TemplateDateModel.DATE_TIME, Date.class).formatToPlainText(TM));
         assertEquals("2015.09.06. 13:00!",
-                env.getTemplateDateFormat(dateTimeFormatStr2, TemplateDateModel.DATETIME, Date.class).formatToPlainText(TM));
+                env.getTemplateDateFormat(dateTimeFormatStr2, TemplateDateModel.DATE_TIME, Date.class).formatToPlainText(TM));
         
         assertEquals("2015.09.06. (+0100)",
                 env.getTemplateDateFormat(TemplateDateModel.DATE, Date.class).formatToPlainText(TM));
@@ -295,9 +295,9 @@ public class DateFormatTest extends TemplateTest {
                 env.getTemplateDateFormat(timeFormatStr2, TemplateDateModel.TIME, Date.class).formatToPlainText(TM));
         
         assertEquals("2015.09.06. 13:00",
-                env.getTemplateDateFormat(TemplateDateModel.DATETIME, Timestamp.class).formatToPlainText(TM));
+                env.getTemplateDateFormat(TemplateDateModel.DATE_TIME, Timestamp.class).formatToPlainText(TM));
         assertEquals("2015.09.06. 13:00!",
-                env.getTemplateDateFormat(dateTimeFormatStr2, TemplateDateModel.DATETIME, Timestamp.class).formatToPlainText(TM));
+                env.getTemplateDateFormat(dateTimeFormatStr2, TemplateDateModel.DATE_TIME, Timestamp.class).formatToPlainText(TM));
 
         assertEquals("2015.09.06. (+0000)",
                 env.getTemplateDateFormat(TemplateDateModel.DATE, java.sql.Date.class).formatToPlainText(TM));
@@ -313,23 +313,23 @@ public class DateFormatTest extends TemplateTest {
             String dateTimeFormatStrLoc = dateTimeFormatStr + " EEEE";
             // Gets into cache:
             TemplateDateFormat format1
-                    = env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATETIME, Date.class);
+                    = env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATE_TIME, Date.class);
             assertEquals("2015.09.06. 13:00 Sunday", format1.formatToPlainText(TM));
             // Different locale (not cached):
             assertEquals("2015.09.06. 13:00 Sonntag",
-                    env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATETIME, Date.class,
+                    env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATE_TIME, Date.class,
                             Locale.GERMANY).formatToPlainText(TM));
             // Different locale and zone (not cached):
             assertEquals("2015.09.06. 14:00 Sonntag",
-                    env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATETIME, Date.class,
+                    env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATE_TIME, Date.class,
                             Locale.GERMANY, TimeZone.getTimeZone("GMT+02"), TimeZone.getTimeZone("GMT+03")).formatToPlainText(TM));
             // Different locale and zone (not cached):
             assertEquals("2015.09.06. 15:00 Sonntag",
-                    env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATETIME, java.sql.Date.class,
+                    env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATE_TIME, java.sql.Date.class,
                             Locale.GERMANY, TimeZone.getTimeZone("GMT+02"), TimeZone.getTimeZone("GMT+03")).formatToPlainText(TM));
             // Check for corrupted cache:
             TemplateDateFormat format2
-                    = env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATETIME, Date.class);
+                    = env.getTemplateDateFormat(dateTimeFormatStrLoc, TemplateDateModel.DATE_TIME, Date.class);
             assertEquals("2015.09.06. 13:00 Sunday", format2.formatToPlainText(TM));
             assertSame(format1, format2);
         }
@@ -407,7 +407,7 @@ public class DateFormatTest extends TemplateTest {
                 "${t?time?string.xs_u} ${t?time()?string.xs_u}",
                 "12:00:00Z 12:00:00Z");
         assertOutput(
-                "${t?datetime?string.xs_u} ${t?datetime()?string.xs_u}",
+                "${t?dateTime?string.xs_u} ${t?dateTime()?string.xs_u}",
                 "2015-09-06T12:00:00Z 2015-09-06T12:00:00Z");
     }
 
@@ -429,7 +429,7 @@ public class DateFormatTest extends TemplateTest {
                 "${t?time} ${t?time()}",
                 T + " " + T + "/foo");
         assertOutput(
-                "${t?datetime} ${t?datetime()}",
+                "${t?dateTime} ${t?dateTime()}",
                 T + " " + T + "/foo");
     }
     
@@ -456,7 +456,7 @@ public class DateFormatTest extends TemplateTest {
 
         @Override
         public int getDateType() {
-            return DATETIME;
+            return DATE_TIME;
         }
         
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
index 3e77769..6b77d97 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ParsingErrorMessagesTest.java
@@ -81,6 +81,9 @@ public class ParsingErrorMessagesTest {
         assertErrorContains("${x?iso_utc_nz}", "camel case", "The correct name is: isoUtcNZ");
         assertErrorContains("${x?no_such_name}", "camel case", "\\!The correct name is:", "alphabetical list");
         assertErrorContains("${x?nosuchname}", "\\!camel case", "\\!The correct name is:", "alphabetical list");
+        assertErrorContains("${x?datetime}", "The correct name is: dateTime");
+        assertErrorContains("${x?datetimeIfUnknown}", "The correct name is: dateTimeIfUnknown");
+        assertErrorContains("${x?datetime_if_unknown}", "The correct name is: dateTimeIfUnknown");
     }
 
     @Test
@@ -91,6 +94,9 @@ public class ParsingErrorMessagesTest {
                 "setting names are:");
         assertErrorContains("<#setting nosuchname=1>", "\\!The correct name is:", "\\!camel case",
                 "setting names are:");
+
+        assertErrorContains("<#setting datetime_format='HHmm'>", "The correct name is: dateTimeFormat");
+        assertErrorContains("<#setting datetimeFormat='HHmm'>", "The correct name is: dateTimeFormat");
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/java/org/apache/freemarker/core/SQLTimeZoneTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/SQLTimeZoneTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/SQLTimeZoneTest.java
index 5dbc2bb..3939a15 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/SQLTimeZoneTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/SQLTimeZoneTest.java
@@ -87,21 +87,21 @@ public class SQLTimeZoneTest extends TemplateTest {
     }
 
     private static final String FTL =
-            "${sqlDate} ${sqlTime} ${sqlTimestamp} ${javaDate?datetime}\n"
+            "${sqlDate} ${sqlTime} ${sqlTimestamp} ${javaDate?dateTime}\n"
             + "${sqlDate?string.iso_fz} ${sqlTime?string.iso_fz} "
-            + "${sqlTimestamp?string.iso_fz} ${javaDate?datetime?string.iso_fz}\n"
+            + "${sqlTimestamp?string.iso_fz} ${javaDate?dateTime?string.iso_fz}\n"
             + "${sqlDate?string.xs_fz} ${sqlTime?string.xs_fz} "
-            + "${sqlTimestamp?string.xs_fz} ${javaDate?datetime?string.xs_fz}\n"
+            + "${sqlTimestamp?string.xs_fz} ${javaDate?dateTime?string.xs_fz}\n"
             + "${sqlDate?string.xs} ${sqlTime?string.xs} "
-            + "${sqlTimestamp?string.xs} ${javaDate?datetime?string.xs}\n"
+            + "${sqlTimestamp?string.xs} ${javaDate?dateTime?string.xs}\n"
             + "<#setting timeZone='GMT'>\n"
-            + "${sqlDate} ${sqlTime} ${sqlTimestamp} ${javaDate?datetime}\n"
+            + "${sqlDate} ${sqlTime} ${sqlTimestamp} ${javaDate?dateTime}\n"
             + "${sqlDate?string.iso_fz} ${sqlTime?string.iso_fz} "
-            + "${sqlTimestamp?string.iso_fz} ${javaDate?datetime?string.iso_fz}\n"
+            + "${sqlTimestamp?string.iso_fz} ${javaDate?dateTime?string.iso_fz}\n"
             + "${sqlDate?string.xs_fz} ${sqlTime?string.xs_fz} "
-            + "${sqlTimestamp?string.xs_fz} ${javaDate?datetime?string.xs_fz}\n"
+            + "${sqlTimestamp?string.xs_fz} ${javaDate?dateTime?string.xs_fz}\n"
             + "${sqlDate?string.xs} ${sqlTime?string.xs} "
-            + "${sqlTimestamp?string.xs} ${javaDate?datetime?string.xs}\n";
+            + "${sqlTimestamp?string.xs} ${javaDate?dateTime?string.xs}\n";
 
     private static final String OUTPUT_BEFORE_SETTING_GMT_CFG_GMT2
             = "2014-07-12 12:30:05 2014-07-12T12:30:05 2014-07-12T12:30:05\n"
@@ -213,53 +213,53 @@ public class SQLTimeZoneTest extends TemplateTest {
     public void testCacheFlushings() throws Exception {
         setConfiguration(testCacheFlushing_createBuilder().build());
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting locale='de'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-11 Fri, 10:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-11 Fr, 10:30:05 Do, 2014-07-12T10:30:05 Sa, 2014-07-12T10:30:05 Sa, 2014-07-12 Sa, 10:30:05 Sa\n");
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting dateFormat='yyyy-MM-dd'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-11 Fri, 10:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-11, 10:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12, 10:30:05 Sat\n");
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting timeFormat='HH:mm:ss'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-11 Fri, 10:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-11 Fri, 10:30:05, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05\n");
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting dateTimeFormat='yyyy-MM-dd\\'T\\'HH:mm:ss'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-11 Fri, 10:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-11 Fri, 10:30:05 Thu, 2014-07-12T10:30:05, 2014-07-12T10:30:05, 2014-07-12 Sat, 10:30:05 Sat\n");
 
         setConfiguration(testCacheFlushing_createBuilder().sqlDateAndTimeTimeZone(GMT_P02).build());
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting locale='de'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-12 Sat, 12:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-12 Sa, 12:30:05 Do, 2014-07-12T10:30:05 Sa, 2014-07-12T10:30:05 Sa, 2014-07-12 Sa, 10:30:05 Sa\n");
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting dateFormat='yyyy-MM-dd'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-12 Sat, 12:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-12, 12:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12, 10:30:05 Sat\n");
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting timeFormat='HH:mm:ss'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-12 Sat, 12:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-12 Sat, 12:30:05, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05\n");
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n"
                 + "<#setting dateTimeFormat='yyyy-MM-dd\\'T\\'HH:mm:ss'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}, ${javaDate?date}, ${javaDate?time}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}, ${javaDate?date}, ${javaDate?time}\n",
                 "2014-07-12 Sat, 12:30:05 Thu, 2014-07-12T10:30:05 Sat, 2014-07-12T10:30:05 Sat, 2014-07-12 Sat, 10:30:05 Sat\n"
                 + "2014-07-12 Sat, 12:30:05 Thu, 2014-07-12T10:30:05, 2014-07-12T10:30:05, 2014-07-12 Sat, 10:30:05 Sat\n");
     }
@@ -302,23 +302,23 @@ public class SQLTimeZoneTest extends TemplateTest {
                 .build());
 
         assertOutput(
-                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting sqlDateAndTimeTimeZone='GMT+02'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting sqlDateAndTimeTimeZone='null'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting timeZone='GMT+03'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting sqlDateAndTimeTimeZone='GMT+02'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting sqlDateAndTimeTimeZone='GMT-11'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting dateFormat='xs fz'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting timeFormat='xs fz'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n"
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n"
                 + "<#setting dateTimeFormat='iso m'>\n"
-                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?datetime}\n",
+                + "${sqlDate}, ${sqlTime}, ${sqlTimestamp}, ${javaDate?dateTime}\n",
                 "2014-07-11, 10:30:05, 2014-07-12T10:30:05, 2014-07-12T10:30:05\n"
                 + "2014-07-12, 12:30:05, 2014-07-12T10:30:05, 2014-07-12T10:30:05\n"
                 + "2014-07-11, 10:30:05, 2014-07-12T10:30:05, 2014-07-12T10:30:05\n"

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java
index ae21f2d..be2c6a2 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperSingletonsTest.java
@@ -200,12 +200,12 @@ public class DefaultObjectWrapperSingletonsTest extends TestCase {
         {
             DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
                     .strict(true)
-                    .defaultDateType(TemplateDateModel.DATETIME)
+                    .defaultDateType(TemplateDateModel.DATE_TIME)
                     .outerIdentity(new RestrictedObjectWrapper.Builder(Configuration.VERSION_3_0_0).build())
                     .build();
             assertEquals(5, getDefaultObjectWrapperInstanceCacheSize());
             assertTrue(ow.isStrict());
-            assertEquals(TemplateDateModel.DATETIME, ow.getDefaultDateType());
+            assertEquals(TemplateDateModel.DATE_TIME, ow.getDefaultDateType());
             assertSame(RestrictedObjectWrapper.class, ow.getOuterIdentity().getClass());
             
             hardReferences.add(ow);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/CoreTemplateTestSuite.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/CoreTemplateTestSuite.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/CoreTemplateTestSuite.java
index 2adef86..0b21c75 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/CoreTemplateTestSuite.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/CoreTemplateTestSuite.java
@@ -102,7 +102,7 @@ public class CoreTemplateTestSuite extends TemplateTestSuite {
         } else if (simpleTestName.startsWith("dateformat")) {
             GregorianCalendar cal = new GregorianCalendar(2002, 10, 15, 14, 54, 13);
             cal.setTimeZone(TimeZone.getTimeZone("GMT"));
-            dataModel.put("date", new SimpleDate(cal.getTime(), TemplateDateModel.DATETIME));
+            dataModel.put("date", new SimpleDate(cal.getTime(), TemplateDateModel.DATE_TIME));
             dataModel.put("unknownDate", new SimpleDate(cal.getTime(), TemplateDateModel.UNKNOWN));
             dataModel.put("javaGMT02", TimeZone.getTimeZone("GMT+02"));
             dataModel.put("javaUTC", TimeZone.getTimeZone("UTC"));

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java
index d656a6b..efde933 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/AllTemplateModels.java
@@ -111,7 +111,7 @@ public class AllTemplateModels implements
 
     @Override
     public int getDateType() {
-        return TemplateDateModel.DATETIME;
+        return TemplateDateModel.DATE_TIME;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/date-type-builtins.ftl
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/date-type-builtins.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/date-type-builtins.ftl
index d65571e..2cadc42 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/date-type-builtins.ftl
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/date-type-builtins.ftl
@@ -39,7 +39,7 @@
 <@assert test=dateTime?isDatetime />
 
 <@assertFails message="isn't known if">${unknown?string.xs}</@>
-<@assertEquals expected="2003-04-05T06:07:08Z" actual=unknown?datetimeIfUnknown?string.xs />
+<@assertEquals expected="2003-04-05T06:07:08Z" actual=unknown?dateTimeIfUnknown?string.xs />
 <@assertEquals expected="2003-04-05Z" actual=unknown?dateIfUnknown?string.xs />
 <@assertEquals expected="06:07:08Z" actual=unknown?timeIfUnknown?string.xs />
 <@assertEquals expected="2003-04-05T06:07:08Z" actual=dateTime?dateIfUnknown?string.xs />

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-bi.ftl
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-bi.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-bi.ftl
index 5d60f71..8ece40d 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-bi.ftl
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-bi.ftl
@@ -16,7 +16,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign d = "2010-05-15 22:38:05:23 +0200"?datetime("yyyy-MM-dd HH:mm:ss:S Z")>
+<#assign d = "2010-05-15 22:38:05:23 +0200"?dateTime("yyyy-MM-dd HH:mm:ss:S Z")>
 <#setting timeZone="GMT+02">
 <@assertEquals actual=d?isoUtc expected="2010-05-15T20:38:05Z" />
 <@assertEquals actual=d?isoUtcMs expected="2010-05-15T20:38:05.023Z" />
@@ -69,7 +69,7 @@
 <@assertEquals actual=d?time?isoLocalMNZ expected="22:38" />
 <@assertEquals actual=d?time?isoLocalHNZ expected="22" />
 
-<#assign dStrange = "600-01-01 23:59:59:123 +0000"?datetime("yyyy-MM-dd HH:mm:ss:S Z")>
+<#assign dStrange = "600-01-01 23:59:59:123 +0000"?dateTime("yyyy-MM-dd HH:mm:ss:S Z")>
 <@assertEquals actual=dStrange?isoUtcMs expected="0600-01-03T23:59:59.123Z" />
 
 <#-- java.sql treatment -->
@@ -149,12 +149,12 @@
 <@assertEquals actual=d?isoUtc expected="2010-05-14" />
 
 <#setting timeZone="GMT+02:30">
-<#assign d = "2010-05-15"?datetime("yyyy-MM-dd")>
+<#assign d = "2010-05-15"?dateTime("yyyy-MM-dd")>
 <@assertEquals actual=d?isoLocal expected="2010-05-15T00:00:00+02:30" />
 
 <#setting timeZone="America/New_York">
-<@assertEquals actual="2010-05-09 20:00 +0000"?datetime("yyyy-MM-dd HH:mm Z")?isoLocal expected="2010-05-09T16:00:00-04:00" />
-<@assertEquals actual="2010-01-01 20:00 +0000"?datetime("yyyy-MM-dd HH:mm Z")?isoLocal expected="2010-01-01T15:00:00-05:00" />
+<@assertEquals actual="2010-05-09 20:00 +0000"?dateTime("yyyy-MM-dd HH:mm Z")?isoLocal expected="2010-05-09T16:00:00-04:00" />
+<@assertEquals actual="2010-01-01 20:00 +0000"?dateTime("yyyy-MM-dd HH:mm Z")?isoLocal expected="2010-01-01T15:00:00-05:00" />
 
 <@assertFails>${d?iso("no such zone")}</@>
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-like.ftl
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-like.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-like.ftl
index e4dd980..5691f82 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-like.ftl
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-iso-like.ftl
@@ -16,7 +16,7 @@
   specific language governing permissions and limitations
   under the License.
 -->
-<#assign d = "2010-05-15 22:38:05:23 +0200"?datetime("yyyy-MM-dd HH:mm:ss:S Z")>
+<#assign d = "2010-05-15 22:38:05:23 +0200"?dateTime("yyyy-MM-dd HH:mm:ss:S Z")>
 <#setting timeZone="GMT+02">
 <@assertEquals actual=d?string.xs  expected="2010-05-15T22:38:05.023+02:00" />
 <@assertEquals actual=d?string.iso expected="2010-05-15T22:38:05.023+02:00" />
@@ -92,7 +92,7 @@
 <@assertEquals actual=d?string.iso expected="2010-05-14" />
 
 <#setting timeZone="GMT+02:30">
-<#assign d = "2010-05-15"?datetime("yyyy-MM-dd")>
+<#assign d = "2010-05-15"?dateTime("yyyy-MM-dd")>
 <@assertEquals actual=d?string.xs  expected="2010-05-15T00:00:00+02:30" />
 <@assertEquals actual=d?string.iso expected="2010-05-15T00:00:00+02:30" />
 
@@ -103,7 +103,7 @@
 <@assertEquals actual=d?string.xs  expected="-1-05-13-05:00" />
 <@assertEquals actual=d?string.iso expected="0000-05-13" />
 
-<#assign dt = "2010-05-15T01:02:03"?datetime.xs>
+<#assign dt = "2010-05-15T01:02:03"?dateTime.xs>
 <#setting dateTimeFormat="xs">
 <@assertEquals actual=dt?string expected="2010-05-15T01:02:03-05:00" />
 <#setting dateTimeFormat="xs u">
@@ -146,8 +146,8 @@
 <#setting timeFormat="iso nz ms">
 <@assertEquals actual=t?string expected="01:02:03.000" />
 
-<@assertFails message="Use ?date, ?time, or ?datetime">${unknownDate?string.xs}</@>
-<@assertFails message="Use ?date, ?time, or ?datetime">${unknownDate?string.iso}</@>
+<@assertFails message="Use ?date, ?time, or ?dateTime">${unknownDate?string.xs}</@>
+<@assertFails message="Use ?date, ?time, or ?dateTime">${unknownDate?string.iso}</@>
 <@assertFails message="format string">${.now?string.xs_fz_nz}</@>
 <@assertFails message="format string">${.now?string.xs_u_fu}</@>
 <@assertFails message="format string">${.now?string.xs_s_ms}</@>

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-java.ftl
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-java.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-java.ftl
index 219f0a4..955be00 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-java.ftl
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateformat-java.ftl
@@ -20,7 +20,7 @@
 <#setting timeZone="GMT">
 <#setting dateTimeFormat="">
 ${date}
-${unknownDate?datetime}
+${unknownDate?dateTime}
 ${date?string}
 ${date?string[""]}
 ${date?string.short}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateparsing.ftl
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateparsing.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateparsing.ftl
index 63716cb..401371e 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateparsing.ftl
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/dateparsing.ftl
@@ -22,32 +22,32 @@
 <#setting dateFormat="G yyyy-MM-dd Z">
 <#setting timeFormat="HH:mm:ss.S Z">
 
-<@assertEquals expected="AD 1998-10-30 15:30:44.512 +0000" actual='AD 1998-10-30 19:30:44.512 +0400'?datetime?string />
+<@assertEquals expected="AD 1998-10-30 15:30:44.512 +0000" actual='AD 1998-10-30 19:30:44.512 +0400'?dateTime?string />
 <@assertEquals expected="AD 1998-10-29 +0000" actual='AD 1998-10-30 +0400'?date?string />
 <@assertEquals expected="15:30:44.512 +0000" actual='19:30:44.512 +0400'?time?string />
 
 <@assertEquals expected="AD 1998-10-30 15:30:44.512 +0000"
-               actual='10/30/1998 19:30:44:512 GMT+04:00'?datetime("MM/dd/yyyy HH:mm:ss:S z")?string />
+               actual='10/30/1998 19:30:44:512 GMT+04:00'?dateTime("MM/dd/yyyy HH:mm:ss:S z")?string />
 <@assertEquals expected="AD 1998-10-29 +0000"
                actual='10/30/1998 GMT+04:00'?date("MM/dd/yyyy z")?string />
 <@assertEquals expected="15:30:44.512 +0000"
                actual='19:30:44:512 GMT+04:00'?time("HH:mm:ss:S z")?string />
 
-<@assertEquals expected="AD 1998-10-30 15:30:44.512 +0000" actual='1998-10-30T19:30:44.512+04:00'?datetime.xs?string />
+<@assertEquals expected="AD 1998-10-30 15:30:44.512 +0000" actual='1998-10-30T19:30:44.512+04:00'?dateTime.xs?string />
 <@assertEquals expected="AD 1998-10-29 +0000" actual='1998-10-30+04:00'?date.xs?string />
 <@assertEquals expected="15:30:44.512 +0000" actual='19:30:44.512+04:00'?time.xs?string />
 
-<#assign gmtStr='1998-10-30T19:30:44.512'?datetime.xs?string />
+<#assign gmtStr='1998-10-30T19:30:44.512'?dateTime.xs?string />
 <#setting timeZone="GMT+01:00">
-<#assign gmt01Str='1998-10-30T19:30:44.512'?datetime.xs?string />
+<#assign gmt01Str='1998-10-30T19:30:44.512'?dateTime.xs?string />
 <#setting timeZone="default">
-<#assign defStr='1998-10-30T19:30:44.512'?datetime.xs?string />
+<#assign defStr='1998-10-30T19:30:44.512'?dateTime.xs?string />
 <@assert test = gmtStr != gmt01Str />
 <@assert test = defStr != gmtStr || defStr != gmt01Str />
 
 <#assign refDate = "AD 1998-10-30 +0000"?date>
 <#assign refTime = "15:30:44.512 +0000"?time>
-<#assign refDateTime = "AD 1998-10-30 15:30:44.512 +0000"?datetime>
+<#assign refDateTime = "AD 1998-10-30 15:30:44.512 +0000"?dateTime>
 <#setting timeZone="UTC">
 <#list ['xs', 'xs_nz', 'xs_fz', 'xs s', 'xs ms'] as format>
   <#setting dateFormat=format>
@@ -55,7 +55,7 @@
   <#setting dateTimeFormat=format>
   <@assertEquals expected=refDate actual="1998-10-30Z"?date />
   <@assertEquals expected=refTime actual="15:30:44.512Z"?time />
-  <@assertEquals expected=refDateTime actual="1998-10-30T15:30:44.512Z"?datetime />
+  <@assertEquals expected=refDateTime actual="1998-10-30T15:30:44.512Z"?dateTime />
 </#list>
 <#list ['iso', 'iso_nz', 'iso_fz', 'iso m'] as format>
   <#setting dateFormat=format>
@@ -65,20 +65,20 @@
   <@assertEquals expected=refDate actual="19981030"?date />
   <@assertEquals expected=refTime actual="15:30:44,512Z"?time />
   <@assertEquals expected=refTime actual="153044,512Z"?time />
-  <@assertEquals expected=refDateTime actual="1998-10-30T15:30:44,512Z"?datetime />
-  <@assertEquals expected=refDateTime actual="19981030T153044,512Z"?datetime />
+  <@assertEquals expected=refDateTime actual="1998-10-30T15:30:44,512Z"?dateTime />
+  <@assertEquals expected=refDateTime actual="19981030T153044,512Z"?dateTime />
 </#list>
 
 <#setting timeZone="GMT+01:00">
-<#assign refDateTime='1998-10-30T19:30:44.512'?datetime.xs />
-<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512"?datetime.xs />
-<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512"?datetime.iso />
-<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?datetime.xs_u />
-<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?datetime.iso_u />
+<#assign refDateTime='1998-10-30T19:30:44.512'?dateTime.xs />
+<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512"?dateTime.xs />
+<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512"?dateTime.iso />
+<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?dateTime.xs_u />
+<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?dateTime.iso_u />
 <#setting timeZone="UTC">
-<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?datetime.xs />
-<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?datetime.iso />
-<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01:00"?datetime.xs />
-<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01:00"?datetime.xs_u />
-<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01"?datetime.iso />
-<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01"?datetime.iso_u />
\ No newline at end of file
+<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?dateTime.xs />
+<@assertEquals expected=refDateTime actual="1998-10-30T18:30:44.512"?dateTime.iso />
+<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01:00"?dateTime.xs />
+<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01:00"?dateTime.xs_u />
+<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01"?dateTime.iso />
+<@assertEquals expected=refDateTime actual="1998-10-30T19:30:44.512+01"?dateTime.iso_u />
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/sequence-builtins.ftl
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/sequence-builtins.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/sequence-builtins.ftl
index dc1dbbb..ffda546 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/sequence-builtins.ftl
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/sequence-builtins.ftl
@@ -301,7 +301,7 @@ Sequence built-ins failing on date-type mismatch
 <@assertEquals actual=x?seqIndexOf('foo') expected=1 />
 <@assertEquals actual=x?seqIndexOf('1992-02-21'?date('yyyy-MM-dd')) expected=0 />
 <@assertFails message="dates of different types">
-  0 = ${x?seqIndexOf('1992-02-21 00:00:00'?datetime('yyyy-MM-dd HH:mm:ss'))}
+  0 = ${x?seqIndexOf('1992-02-21 00:00:00'?dateTime('yyyy-MM-dd HH:mm:ss'))}
 </@>
 
 Chunk

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/setting.ftl
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/setting.ftl b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/setting.ftl
index de60a84..0febdef 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/setting.ftl
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/templates/setting.ftl
@@ -37,9 +37,9 @@
 <@assertEquals expected='dtf' actual=.now?string />
 
 <#setting timeZone='GMT+00'>
-<#assign t1='2000'?datetime('yyyy')>
+<#assign t1='2000'?dateTime('yyyy')>
 <#setting timeZone='GMT+01'>
-<#assign t2='2000'?datetime('yyyy')>
+<#assign t2='2000'?dateTime('yyyy')>
 <@assertEquals expected=1000*60*60 actual=t1?long-t2?long />
 
 <#setting sqlDateAndTimeTimeZone='GMT+01'>

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
index 134f6fe..576b05a 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirSetting.java
@@ -67,8 +67,14 @@ final class ASTDirSetting extends ASTDirective {
                     sb.append(MessageUtil.FM3_SNAKE_CASE);
                     correctedKey = _StringUtil.snakeCaseToCamelCase(key);
                     if (!SETTING_NAMES.contains(correctedKey)) {
-                        correctedKey = null;
+                        if (key.equals("datetime_format")) {
+                            correctedKey = "dateTimeFormat";
+                        } else {
+                            correctedKey = null;
+                        }
                     }
+                } else if (key.equals("datetimeFormat")) {
+                    correctedKey = "dateTimeFormat";
                 } else {
                     correctedKey = null;
                 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
index a6b2b77..58b0127 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltIn.java
@@ -97,8 +97,8 @@ abstract class ASTExpBuiltIn extends ASTExpression implements Cloneable {
         putBI("contains", new BuiltInsForStringsBasic.containsBI());        
         putBI("date", new BuiltInsForMultipleTypes.dateBI(TemplateDateModel.DATE));
         putBI("dateIfUnknown", new BuiltInsForDates.dateType_if_unknownBI(TemplateDateModel.DATE));
-        putBI("datetime", new BuiltInsForMultipleTypes.dateBI(TemplateDateModel.DATETIME));
-        putBI("datetimeIfUnknown", new BuiltInsForDates.dateType_if_unknownBI(TemplateDateModel.DATETIME));
+        putBI("dateTime", new BuiltInsForMultipleTypes.dateBI(TemplateDateModel.DATE_TIME));
+        putBI("dateTimeIfUnknown", new BuiltInsForDates.dateType_if_unknownBI(TemplateDateModel.DATE_TIME));
         putBI("default", new BuiltInsForExistenceHandling.defaultBI());
         putBI("double", new doubleBI());
         putBI("endsWith", new BuiltInsForStringsBasic.ends_withBI());
@@ -133,7 +133,7 @@ abstract class ASTExpBuiltIn extends ASTExpression implements Cloneable {
         putBI("isFirst", new BuiltInsForLoopVariables.is_firstBI());
         putBI("isLast", new BuiltInsForLoopVariables.is_lastBI());
         putBI("isUnknownDateLike", new BuiltInsForMultipleTypes.is_dateOfTypeBI(TemplateDateModel.UNKNOWN));
-        putBI("isDatetime", new BuiltInsForMultipleTypes.is_dateOfTypeBI(TemplateDateModel.DATETIME));
+        putBI("isDatetime", new BuiltInsForMultipleTypes.is_dateOfTypeBI(TemplateDateModel.DATE_TIME));
         putBI("isDirective", new BuiltInsForMultipleTypes.is_directiveBI());
         putBI("isEnumerable", new BuiltInsForMultipleTypes.is_enumerableBI());
         putBI("isHashEx", new BuiltInsForMultipleTypes.is_hash_exBI());
@@ -240,7 +240,7 @@ abstract class ASTExpBuiltIn extends ASTExpression implements Cloneable {
         putBI("number", new BuiltInsForStringsMisc.numberBI());
         putBI("numberToDate", new number_to_dateBI(TemplateDateModel.DATE));
         putBI("numberToTime", new number_to_dateBI(TemplateDateModel.TIME));
-        putBI("numberToDatetime", new number_to_dateBI(TemplateDateModel.DATETIME));
+        putBI("numberToDatetime", new number_to_dateBI(TemplateDateModel.DATE_TIME));
         putBI("parent", new parentBI());
         putBI("previousSibling", new previousSiblingBI());
         putBI("nextSibling", new nextSiblingBI());
@@ -315,12 +315,20 @@ abstract class ASTExpBuiltIn extends ASTExpression implements Cloneable {
                         correctedKey = correctedKey.substring(0, correctedKey.length() - 2)
                                 + correctedKey.substring(correctedKey.length() - 2).toUpperCase();
                         if (!BUILT_INS_BY_NAME.containsKey(correctedKey)) {
-                            correctedKey = null;
+                            if (key.equals("datetime_if_unknown")) {
+                                correctedKey = "dateTimeIfUnknown";
+                            } else {
+                                correctedKey = null;
+                            }
                         }
                     } else {
                         correctedKey = null;
                     }
                 }
+            } else if (key.equals("datetime")) {
+                correctedKey = "dateTime";
+            } else if (key.equals("datetimeIfUnknown")) {
+                correctedKey = "dateTimeIfUnknown";
             } else {
                 correctedKey = null;
             }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
index f2b2537..f9439de 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpBuiltInVariable.java
@@ -192,7 +192,7 @@ final class ASTExpBuiltInVariable extends ASTExpression {
             return new SimpleScalar(env.getCurrentRecoveredErrorMessage());
         }
         if (name == NOW) {
-            return new SimpleDate(new Date(), TemplateDateModel.DATETIME);
+            return new SimpleDate(new Date(), TemplateDateModel.DATE_TIME);
         }
         if (name == VERSION) {
             return new SimpleScalar(Configuration.getVersion().toString());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMultipleTypes.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMultipleTypes.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMultipleTypes.java
index ab3df64..4566beb 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMultipleTypes.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMultipleTypes.java
@@ -210,8 +210,8 @@ class BuiltInsForMultipleTypes {
                 if (dateType == dtype) {
                     return model;
                 }
-                // unknown and datetime can be coerced into any date type
-                if (dtype == TemplateDateModel.UNKNOWN || dtype == TemplateDateModel.DATETIME) {
+                // unknown and dateTime can be coerced into any date type
+                if (dtype == TemplateDateModel.UNKNOWN || dtype == TemplateDateModel.DATE_TIME) {
                     return new SimpleDate(dmodel.getAsDate(), dateType);
                 }
                 throw new _MiscTemplateException(this,
@@ -576,7 +576,7 @@ class BuiltInsForMultipleTypes {
                             throw MessageUtil.newCantFormatDateException(defaultFormat, target, e, true);
                         } catch (TemplateException e2) {
                             // `e` should always be a TemplateModelException here, but to be sure: 
-                            throw _CoreAPI.ensureIsTemplateModelException("Failed to format date/time/datetime", e2); 
+                            throw _CoreAPI.ensureIsTemplateModelException("Failed to format date/time/dateTime", e2);
                         }
                     }
                 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
index e0f6118..93bac28 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
@@ -1526,7 +1526,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
         if (!dateTimeFormat.equals(prevDateTimeFormat)) {
             if (cachedTempDateFormatArray != null) {
                 for (int i = 0; i < CACHED_TDFS_LENGTH; i += CACHED_TDFS_ZONELESS_INPUT_OFFS) {
-                    cachedTempDateFormatArray[i + TemplateDateModel.DATETIME] = null;
+                    cachedTempDateFormatArray[i + TemplateDateModel.DATE_TIME] = null;
                 }
             }
         }
@@ -1602,7 +1602,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
     }
 
     /**
-     * Gets a {@link TemplateDateFormat} using the date/time/datetime format settings and the current locale and time
+     * Gets a {@link TemplateDateFormat} using the date/time/dateTime format settings and the current locale and time
      * zone. (The current locale is the locale returned by {@link #getLocale()}. The current time zone is
      * {@link #getTimeZone()} or {@link #getSQLDateAndTimeTimeZone()}).
      * 
@@ -1626,7 +1626,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * 
      * <p>
      * Note on performance: The result will be cached in the {@link Environment} instance. However, at least in 2.3.24
-     * the cached entries that depend on the current locale or the current time zone or the current date/time/datetime
+     * the cached entries that depend on the current locale or the current time zone or the current date/time/dateTime
      * format of the {@link Environment} will be lost when those settings are changed.
      * 
      * @param formatString
@@ -1788,7 +1788,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
                 settingName = MutableProcessingConfiguration.DATE_FORMAT_KEY;
                 settingValue = getDateFormat();
                 break;
-            case TemplateDateModel.DATETIME:
+            case TemplateDateModel.DATE_TIME:
                 settingName = MutableProcessingConfiguration.DATE_TIME_FORMAT_KEY;
                 settingValue = getDateTimeFormat();
                 break;
@@ -1799,7 +1799,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
             
             _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
                     "The value of the \"", settingName,
-                    "\" FreeMarker configuration setting is a malformed date/time/datetime format string: ",
+                    "\" FreeMarker configuration setting is a malformed date/time/dateTime format string: ",
                     new _DelayedJQuote(settingValue), ". Reason given: ",
                     e.getMessage());                    
             throw useTempModelExc ? new _TemplateModelException(e, desc) : new _MiscTemplateException(e, desc);
@@ -1821,7 +1821,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
             throw MessageUtil.newCantFormatUnknownTypeDateException(blamedDateSourceExp, e);
         } catch (TemplateValueFormatException e) {
             _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
-                    "Can't invoke date/time/datetime format based on format string ",
+                    "Can't invoke date/time/dateTime format based on format string ",
                     new _DelayedJQuote(formatString), ". Reason given: ",
                     e.getMessage())
                     .blame(blamedFormatterExp);
@@ -1830,7 +1830,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
     }
 
     /**
-     * Used to get the {@link TemplateDateFormat} according the date/time/datetime format settings, for the current
+     * Used to get the {@link TemplateDateFormat} according the date/time/dateTime format settings, for the current
      * locale and time zone. See {@link #getTemplateDateFormat(String, int, Locale, TimeZone, boolean)} for the meaning
      * of some of the parameters.
      */
@@ -1855,7 +1855,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
             case TemplateDateModel.DATE:
                 formatString = getDateFormat();
                 break;
-            case TemplateDateModel.DATETIME:
+            case TemplateDateModel.DATE_TIME:
                 formatString = getDateTimeFormat();
                 break;
             default:

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtil.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtil.java b/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtil.java
index 8a90159..8820f08 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtil.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtil.java
@@ -39,7 +39,7 @@ class MessageUtil {
               + "known if it's a date (no time part), time or date-time value.";
     
     static final String UNKNOWN_DATE_TYPE_ERROR_TIP =
-            "Use ?date, ?time, or ?datetime to tell FreeMarker the exact type.";
+            "Use ?date, ?time, or ?dateTime to tell FreeMarker the exact type.";
 
     static final Object[] UNKNOWN_DATE_TO_STRING_TIPS = {
             UNKNOWN_DATE_TYPE_ERROR_TIP,
@@ -291,7 +291,7 @@ class MessageUtil {
     static TemplateException newCantFormatDateException(TemplateDateFormat format, ASTExpression dataSrcExp,
                                                         TemplateValueFormatException e, boolean useTempModelExc) {
         _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
-                "Failed to format date/time/datetime with format ", new _DelayedJQuote(format.getDescription()), ": ",
+                "Failed to format date/time/dateTime with format ", new _DelayedJQuote(format.getDescription()), ": ",
                 e.getMessage())
                 .blame(dataSrcExp); 
         return useTempModelExc

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/ProcessingConfiguration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ProcessingConfiguration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ProcessingConfiguration.java
index 43cdf72..7e1a164 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ProcessingConfiguration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ProcessingConfiguration.java
@@ -269,7 +269,7 @@ public interface ProcessingConfiguration {
 
     /**
      * The format used to convert {@link java.util.Date}-s that are date-time (timestamp) values to string-s,
-     * also the format that {@code someString?datetime} will use to parse strings.
+     * also the format that {@code someString?dateTime} will use to parse strings.
      *
      * <p>The possible setting values are (the quotation marks aren't part of the value itself):
      *

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateDateModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateDateModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateDateModel.java
index ab85e97..024dc8e 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateDateModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateDateModel.java
@@ -53,12 +53,12 @@ public interface TemplateDateModel extends TemplateModel {
     /**
      * The date model represents a date-time value (also known as timestamp).
      */
-    int DATETIME = 3;
+    int DATE_TIME = 3;
     
     List TYPE_NAMES =
         Collections.unmodifiableList(
             Arrays.asList(
-                    "UNKNOWN", "TIME", "DATE", "DATETIME"));
+                    "UNKNOWN", "TIME", "DATE", "DATE_TIME"));
     /**
      * Returns the date value. The return value must not be {@code null}.
      */
@@ -66,7 +66,7 @@ public interface TemplateDateModel extends TemplateModel {
 
     /**
      * Returns the type of the date. It can be any of {@link #TIME}, 
-     * {@link #DATE}, or {@link #DATETIME}.
+     * {@link #DATE}, or {@link #DATE_TIME}.
      */
     int getDateType();
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleDate.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleDate.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleDate.java
index cf6e753..08a6d94 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleDate.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleDate.java
@@ -50,10 +50,10 @@ public class SimpleDate implements TemplateDateModel, Serializable {
     
     /**
      * Creates a new date model wrapping the specified time object and
-     * having DATETIME type.
+     * having DATE_TIME type.
      */
-    public SimpleDate(java.sql.Timestamp datetime) {
-        this(datetime, DATETIME);
+    public SimpleDate(java.sql.Timestamp dateTime) {
+        this(dateTime, DATE_TIME);
     }
     
     /**

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/util/FTLUtil.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/FTLUtil.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/FTLUtil.java
index 84d1c19..0752f1b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/FTLUtil.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/FTLUtil.java
@@ -803,7 +803,7 @@ public final class FTLUtil {
         }
 
         if (TemplateDateModel.class.isAssignableFrom(cl)) {
-            appendTypeName(sb, typeNamesAppended, "date_or_time_or_datetime");
+            appendTypeName(sb, typeNamesAppended, "date_or_time_or_dateTime");
         }
 
         if (TemplateBooleanModel.class.isAssignableFrom(cl)) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormat.java
index f5f8650..8e890f9 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormat.java
@@ -71,7 +71,7 @@ public abstract class TemplateDateFormat extends TemplateValueFormat {
     }
 
     /**
-     * Parsers a string to date/time/datetime, according to this format. Some format implementations may throw
+     * Parsers a string to date/time/dateTime, according to this format. Some format implementations may throw
      * {@link ParsingNotSupportedException} here.
      * 
      * @param s
@@ -79,8 +79,8 @@ public abstract class TemplateDateFormat extends TemplateValueFormat {
      * @param dateType
      *            The expected date type of the result. Not all {@link TemplateDateFormat}-s will care about this;
      *            though those who return a {@link TemplateDateModel} instead of {@link Date} often will. When strings
-     *            are parsed via {@code ?date}, {@code ?time}, or {@code ?datetime}, then this parameter is
-     *            {@link TemplateDateModel#DATE}, {@link TemplateDateModel#TIME}, or {@link TemplateDateModel#DATETIME},
+     *            are parsed via {@code ?date}, {@code ?time}, or {@code ?dateTime}, then this parameter is
+     *            {@link TemplateDateModel#DATE}, {@link TemplateDateModel#TIME}, or {@link TemplateDateModel#DATE_TIME},
      *            respectively. This parameter rarely if ever {@link TemplateDateModel#UNKNOWN}, but the implementation
      *            that cares about this parameter should be prepared for that. If nothing else, it should throw
      *            {@link UnknownDateTypeParsingUnsupportedException} then.
@@ -89,7 +89,7 @@ public abstract class TemplateDateFormat extends TemplateValueFormat {
      *         {@link Date}. {@link TemplateDateModel} is used if you have to attach some application-specific
      *         meta-information thats also extracted during {@link #formatToPlainText(TemplateDateModel)} (so if you format
      *         something and then parse it, you get back an equivalent result). It can't be {@code null}. Known issue
-     *         (at least in FTL 2): {@code ?date}/{@code ?time}/{@code ?datetime}, when not invoked as a method, can't
+     *         (at least in FTL 2): {@code ?date}/{@code ?time}/{@code ?dateTime}, when not invoked as a method, can't
      *         return the {@link TemplateDateModel}, only the {@link Date} from inside it, hence the additional
      *         application-specific meta-info will be lost.
      */

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormatFactory.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormatFactory.java
index c1bf79c..1e1da09 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormatFactory.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateDateFormatFactory.java
@@ -53,7 +53,7 @@ public abstract class TemplateDateFormatFactory extends TemplateValueFormatFacto
      *            {@code "1, 2"} (and {@code "@fooBar"} selects the factory). The format of this string is up to the
      *            {@link TemplateDateFormatFactory} implementation. Not {@code null}, often an empty string.
      * @param dateType
-     *            {@link TemplateDateModel#DATE}, {@link TemplateDateModel#TIME}, {@link TemplateDateModel#DATETIME} or
+     *            {@link TemplateDateModel#DATE}, {@link TemplateDateModel#TIME}, {@link TemplateDateModel#DATE_TIME} or
      *            {@link TemplateDateModel#UNKNOWN}. Supporting {@link TemplateDateModel#UNKNOWN} is not necessary, in
      *            which case the method should throw an {@link UnknownDateTypeFormattingUnsupportedException} exception.
      * @param locale

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/ISOLikeTemplateDateFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/ISOLikeTemplateDateFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/ISOLikeTemplateDateFormat.java
index 8790d00..b76e7a3 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/ISOLikeTemplateDateFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/ISOLikeTemplateDateFormat.java
@@ -216,7 +216,7 @@ abstract class ISOLikeTemplateDateFormat  extends TemplateDateFormat {
                 return parseDate(s, tz, calToDateConverter);
             } else if (dateType == TemplateDateModel.TIME) {
                 return parseTime(s, tz, calToDateConverter);
-            } else if (dateType == TemplateDateModel.DATETIME) {
+            } else if (dateType == TemplateDateModel.DATE_TIME) {
                 return parseDateTime(s, tz, calToDateConverter);
             } else {
                 throw new BugException("Unexpected date type: " + dateType);
@@ -246,7 +246,7 @@ abstract class ISOLikeTemplateDateFormat  extends TemplateDateFormat {
         switch (dateType) {
             case TemplateDateModel.DATE: return getDateDescription();
             case TemplateDateModel.TIME: return getTimeDescription();
-            case TemplateDateModel.DATETIME: return getDateTimeDescription();
+            case TemplateDateModel.DATE_TIME: return getDateTimeDescription();
             default: return "<error: wrong format dateType>";
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormatFactory.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormatFactory.java
index 9c94e82..ad84ba1 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormatFactory.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormatFactory.java
@@ -95,7 +95,7 @@ public class JavaTemplateDateFormatFactory extends TemplateDateFormatFactory {
                         jFormat = DateFormat.getDateInstance(tok1Style, cacheKey.locale);
                         break;
                     }
-                    case TemplateDateModel.DATETIME: {
+                    case TemplateDateModel.DATE_TIME: {
                         int tok2Style = tok.hasMoreTokens() ? parseDateStyleToken(tok.nextToken()) : tok1Style;
                         if (tok2Style != -1) {
                             jFormat = DateFormat.getDateTimeInstance(tok1Style, tok2Style, cacheKey.locale);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
index 37a5c7d..2a2dd04 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeModel.java
@@ -601,8 +601,8 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
                     || TemplateBooleanModel.class.isAssignableFrom(expectedClass)) {
                 return new Object[]{
                         "XML node values are always strings (text), that is, they can't be used as number, "
-                                + "date/time/datetime or boolean without explicit conversion (such as "
-                                + "someNode?number, someNode?datetime.xs, someNode?date.xs, someNode?time.xs, "
+                                + "date/time/dateTime or boolean without explicit conversion (such as "
+                                + "someNode?number, someNode?dateTime.xs, someNode?date.xs, someNode?time.xs, "
                                 + "someNode?boolean).",
                 };
             }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/TemplateConfigurationExamples.java
----------------------------------------------------------------------
diff --git a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/TemplateConfigurationExamples.java b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/TemplateConfigurationExamples.java
index 3ea518d..078e4db 100644
--- a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/TemplateConfigurationExamples.java
+++ b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/TemplateConfigurationExamples.java
@@ -170,7 +170,7 @@ public class TemplateConfigurationExamples extends TemplateTest {
         }
         setConfiguration(cfgB.build());
 
-        addTemplate("t.stats.html", "${ts?datetime} ${ts?date} ${ts?time}");
+        addTemplate("t.stats.html", "${ts?dateTime} ${ts?date} ${ts?time}");
         addTemplate("t.html", "");
         addTemplate("t.htm", "");
         addTemplate("t.xml", "");

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-manual/src/test/resources/org/apache/freemarker/manual/examples/CustomFormatsExample-alias1.ftlh
----------------------------------------------------------------------
diff --git a/freemarker-manual/src/test/resources/org/apache/freemarker/manual/examples/CustomFormatsExample-alias1.ftlh b/freemarker-manual/src/test/resources/org/apache/freemarker/manual/examples/CustomFormatsExample-alias1.ftlh
index fe9690c..c851df7 100644
--- a/freemarker-manual/src/test/resources/org/apache/freemarker/manual/examples/CustomFormatsExample-alias1.ftlh
+++ b/freemarker-manual/src/test/resources/org/apache/freemarker/manual/examples/CustomFormatsExample-alias1.ftlh
@@ -19,4 +19,4 @@
 ${p?string.@price}
 ${w?string.@weight}
 ${fd?string.@fileDate}
-${let?datetime?string.@logEventTime}
+${let?dateTime?string.@logEventTime}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/2af16e4f/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/attributes.ftl
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/attributes.ftl b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/attributes.ftl
index 8d2f8af..89e06ca 100644
--- a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/attributes.ftl
+++ b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/attributes.ftl
@@ -66,7 +66,7 @@ String: <@t.attributeInfo name='a' />
 Number: <@t.attributeInfo name='a' />
 <#global a = true>
 Boolean: <@t.attributeInfo name='a' />
-<#global a = '2014-12-20T18:19+02:00'?datetime.iso>
+<#global a = '2014-12-20T18:19+02:00'?dateTime.iso>
 Date-time: <@t.attributeInfo name='a' />
 <#global a = [1, 2, 3]>
 Sequence: <@t.attributeInfo name='a' />