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/08/19 23:36:35 UTC

[1/7] incubator-freemarker git commit: `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extend

Repository: incubator-freemarker
Updated Branches:
  refs/heads/3 f231e64fe -> d73da6da8


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
index 2fec9cc..1679412 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/ServletContextHashModel.java
@@ -22,10 +22,10 @@ package org.apache.freemarker.servlet;
 import javax.servlet.GenericServlet;
 import javax.servlet.ServletContext;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * TemplateHashModel wrapper for a ServletContext attributes.
@@ -43,7 +43,7 @@ public final class ServletContextHashModel implements TemplateHashModel {
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         return wrapper.wrap(servletctx.getAttribute(key));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
index 80f3f2b..438a622 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/FreeMarkerPageContext.java
@@ -46,10 +46,11 @@ import javax.servlet.jsp.PageContext;
 import javax.servlet.jsp.tagext.BodyContent;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.util.UndeclaredThrowableException;
@@ -72,7 +73,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
     private final ObjectWrapperAndUnwrapper wrapper;
     private JspWriter jspOut;
     
-    protected FreeMarkerPageContext() throws TemplateModelException {
+    protected FreeMarkerPageContext() throws TemplateException {
         environment = Environment.getCurrentEnvironment();
 
         TemplateModel appModel = environment.getGlobalVariable(
@@ -84,7 +85,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
         if (appModel instanceof ServletContextHashModel) {
             servlet = ((ServletContextHashModel) appModel).getServlet();
         } else {
-            throw new  TemplateModelException("Could not find an instance of " + 
+            throw new  TemplateException("Could not find an instance of " +
                     ServletContextHashModel.class.getName() + 
                     " in the data model under either the name " + 
                     FreemarkerServlet.KEY_APPLICATION_PRIVATE + " or " + 
@@ -105,7 +106,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
             ObjectWrapperAndUnwrapper ow = reqHash.getObjectWrapper();
             wrapper = (ObjectWrapperAndUnwrapper) ow;
         } else {
-            throw new  TemplateModelException("Could not find an instance of " + 
+            throw new  TemplateException("Could not find an instance of " +
                     HttpRequestHashModel.class.getName() + 
                     " in the data model under either the name " + 
                     FreemarkerServlet.KEY_REQUEST_PRIVATE + " or " + 
@@ -151,7 +152,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
                 try {
                     environment.setGlobalVariable(name, wrapper.wrap(value));
                     break;
-                } catch (TemplateModelException e) {
+                } catch (ObjectWrappingException e) {
                     throw new UndeclaredThrowableException(e);
                 }
             }
@@ -184,7 +185,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
             case PAGE_SCOPE: {
                 try {
                     return wrapper.unwrap(environment.getGlobalNamespace().get(name));
-                } catch (TemplateModelException e) {
+                } catch (TemplateException e) {
                     throw new UndeclaredThrowableException("Failed to unwrap FTL global variable", e);
                 }
             }
@@ -270,7 +271,7 @@ abstract class FreeMarkerPageContext extends PageContext implements TemplateMode
                 try {
                     return 
                         new TemplateHashModelExEnumeration(environment.getGlobalNamespace());
-                } catch (TemplateModelException e) {
+                } catch (TemplateException e) {
                     throw new UndeclaredThrowableException(e);
                 }
             }
@@ -434,7 +435,7 @@ public JspWriter pushBody(Writer w) {
     private static class TemplateHashModelExEnumeration implements Enumeration {
         private final TemplateModelIterator it;
             
-        private TemplateHashModelExEnumeration(TemplateHashModelEx hashEx) throws TemplateModelException {
+        private TemplateHashModelExEnumeration(TemplateHashModelEx hashEx) throws TemplateException {
             it = hashEx.keys().iterator();
         }
         
@@ -442,7 +443,7 @@ public JspWriter pushBody(Writer w) {
         public boolean hasMoreElements() {
             try {
                 return it.hasNext();
-            } catch (TemplateModelException tme) {
+            } catch (TemplateException tme) {
                 throw new UndeclaredThrowableException(tme);
             }
         }
@@ -451,7 +452,7 @@ public JspWriter pushBody(Writer w) {
         public Object nextElement() {
             try {
                 return ((TemplateScalarModel) it.next()).getAsString();
-            } catch (TemplateModelException tme) {
+            } catch (TemplateException tme) {
                 throw new UndeclaredThrowableException(tme);
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
index 057dd65..6d66094 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
@@ -38,10 +38,8 @@ import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedJQuote;
 import org.apache.freemarker.core._DelayedShortClassName;
 import org.apache.freemarker.core._ErrorDescriptionBuilder;
-import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelWithOriginName;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
@@ -92,7 +90,7 @@ abstract class JspTagModelBase implements TemplateModelWithOriginName {
                                     e);
                         }
                     } else {
-                        throw new TemplateModelException("Unknown property "
+                        throw new TemplateException("Unknown property "
                                 + _StringUtils.jQuote(paramName.toString())
                                 + " on instance of " + tagClass.getName());
                     }
@@ -124,25 +122,25 @@ abstract class JspTagModelBase implements TemplateModelWithOriginName {
                                     "<@my.box style=\"info\" message=\"Hello ${name}!\" width=200 />",
                                     ".");
                         }
-                        throw new _TemplateModelException(e, null, desc);
+                        throw new TemplateException(e, null, desc);
                     }
                 }
             }
         }
     }
 
-    protected final TemplateModelException toTemplateModelExceptionOrRethrow(Throwable e)
-            throws TemplateModelException {
+    protected final TemplateException toTemplateExceptionOrRethrow(Throwable e)
+            throws TemplateException {
         if (e instanceof RuntimeException && !isCommonRuntimeException((RuntimeException) e)) {
             throw (RuntimeException) e;
         }
-        if (e instanceof TemplateModelException) {
-            throw (TemplateModelException) e;
+        if (e instanceof TemplateException) {
+            throw (TemplateException) e;
         }
         if (e instanceof TemplateExceptionWrapperJspException) {
-            return (TemplateModelException) e.getCause();
+            return (TemplateException) e.getCause();
         }
-        return new _TemplateModelException(e,
+        return new TemplateException(e,
                 "Error while invoking the ", new _DelayedJQuote(tagName), " JSP custom tag; see cause exception");
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
index eaf8747..67e867e 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/PageContextFactory.java
@@ -22,8 +22,8 @@ package org.apache.freemarker.servlet.jsp;
 import javax.servlet.jsp.PageContext;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util.UndeclaredThrowableException;
 
 /**
@@ -45,7 +45,7 @@ class PageContextFactory {
         }
     }
 
-    static FreeMarkerPageContext getCurrentPageContext() throws TemplateModelException {
+    static FreeMarkerPageContext getCurrentPageContext() throws TemplateException {
         Environment env = Environment.getCurrentEnvironment();
         TemplateModel pageContextModel = env.getGlobalVariable(PageContext.PAGECONTEXT);
         if (pageContextModel instanceof FreeMarkerPageContext) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
index b4f4a15..01bbfa4 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
@@ -102,7 +102,7 @@ class SimpleTagDirectiveModel extends JspTagModelBase implements TemplateDirecti
                 pageContext.popWriter();
             }
         } catch (Exception e) {
-            throw toTemplateModelExceptionOrRethrow(e);
+            throw toTemplateExceptionOrRethrow(e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
index 15db96d..d5705c8 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
@@ -31,14 +31,13 @@ import javax.servlet.jsp.tagext.SimpleTag;
 import javax.servlet.jsp.tagext.Tag;
 import javax.servlet.jsp.tagext.TryCatchFinally;
 
+import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -82,7 +81,7 @@ class TagDirectiveModel extends JspTagModelBase implements TemplateDirectiveMode
                 // This is just a sanity check. If it were JDK 1.4-only,
                 // we'd use an assert.
                 if (out != pageContext.getOut()) {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                         "out != pageContext.getOut(). Out is " + 
                         out + " pageContext.getOut() is " +
                         pageContext.getOut());
@@ -112,7 +111,7 @@ class TagDirectiveModel extends JspTagModelBase implements TemplateDirectiveMode
                 bodyContent.close(); // Pops `topTag` and `writer`
             }
         } catch (Throwable e) {
-            throw toTemplateModelExceptionOrRethrow(e);
+            throw toTemplateExceptionOrRethrow(e);
         }
     }
 
@@ -159,7 +158,7 @@ class TagDirectiveModel extends JspTagModelBase implements TemplateDirectiveMode
         /**
          * @return Whether to execute the nested content (the body, with JSP terminology)
          */
-        private boolean doStartTag() throws TemplateModelException {
+        private boolean doStartTag() throws TemplateException {
             try {
                 int dst = tag.doStartTag();
                 switch(dst) {
@@ -180,7 +179,9 @@ class TagDirectiveModel extends JspTagModelBase implements TemplateDirectiveMode
                             btag.setBodyContent(this);
                             btag.doInitBody();
                         } else {
-                            throw new TemplateModelException("Can't buffer body since " + tag.getClass().getName() + " does not implement BodyTag.");
+                            throw new TemplateException(
+                                    "Can't buffer body since " + tag.getClass().getName()
+                                    + " does not implement BodyTag.");
                         }
                         // Intentional fall-through
                     }
@@ -188,18 +189,19 @@ class TagDirectiveModel extends JspTagModelBase implements TemplateDirectiveMode
                         return true;
                     }
                     default: {
-                        throw new RuntimeException("Illegal return value " + dst + " from " + tag.getClass().getName() + ".doStartTag()");
+                        throw new RuntimeException(
+                                "Illegal return value " + dst + " from " + tag.getClass().getName() + ".doStartTag()");
                     }
                 }
             } catch (Exception e) {
-                throw toTemplateModelExceptionOrRethrow(e);
+                throw toTemplateExceptionOrRethrow(e);
             }
         }
 
         /**
          * @return Whether to execute the nested content again (the body, with JSP terminology)
          */
-        private boolean doAfterBody() throws TemplateModelException {
+        private boolean doAfterBody() throws TemplateException {
             try {
                 if (isIterationTag) {
                     int dab = ((IterationTag) tag).doAfterBody();
@@ -210,13 +212,15 @@ class TagDirectiveModel extends JspTagModelBase implements TemplateDirectiveMode
                         case IterationTag.EVAL_BODY_AGAIN:
                             return true;
                         default:
-                            throw new TemplateModelException("Unexpected return value " + dab + "from " + tag.getClass().getName() + ".doAfterBody()");
+                            throw new TemplateException(
+                                    "Unexpected return value " + dab + "from " + tag.getClass().getName()
+                                    + ".doAfterBody()");
                     }
                 }
                 endEvaluation();
                 return false;
             } catch (Exception e) {
-                throw toTemplateModelExceptionOrRethrow(e);
+                throw toTemplateExceptionOrRethrow(e);
             }
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 6aaae12..d486772 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -63,12 +63,12 @@ import javax.xml.parsers.SAXParserFactory;
 
 import org.apache.freemarker.core.ConfigurationException;
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.util.BugException;
 import org.apache.freemarker.core.util.CommonBuilder;
@@ -236,7 +236,7 @@ public class TaglibFactory implements TemplateHashModel {
      *         {@link TemplateFunctionModel}, respectively.
      */
     @Override
-    public TemplateModel get(final String taglibUri) throws TemplateModelException {
+    public TemplateModel get(final String taglibUri) throws TemplateException {
         synchronized (lock) {
             {
                 final Taglib taglib = (Taglib) taglibs.get(taglibUri);
@@ -309,7 +309,7 @@ public class TaglibFactory implements TemplateHashModel {
                 }
             } catch (Exception e) {
                 String failedTLDsList = failedTldListAlreadyIncluded ? null : getFailedTLDsList();
-                throw new TemplateModelException(
+                throw new TemplateException(
                         "Error while looking for TLD file for " + _StringUtils.jQuoteNoXSS(taglibUri)
                         + "; see cause exception."
                         + (failedTLDsList == null
@@ -322,7 +322,7 @@ public class TaglibFactory implements TemplateHashModel {
             try {
                 return loadTaglib(tldLocation, normalizedTaglibUri);
             } catch (Exception e) {
-                throw new TemplateModelException("Error while loading tag library for URI "
+                throw new TemplateException("Error while loading tag library for URI "
                         + _StringUtils.jQuoteNoXSS(normalizedTaglibUri) + " from TLD location "
                         + _StringUtils.jQuoteNoXSS(tldLocation) + "; see cause exception.",
                         e);
@@ -914,7 +914,7 @@ public class TaglibFactory implements TemplateHashModel {
         try {
             reqHash = Environment.getCurrentEnvironment().getVariable(
                     FreemarkerServlet.KEY_REQUEST_PRIVATE);
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw new TaglibGettingException("Failed to get FreemarkerServlet request information", e);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java
index be9d58a..674fa56 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/_FreeMarkerPageContext21.java
@@ -31,7 +31,7 @@ import javax.servlet.jsp.el.ELException;
 import javax.servlet.jsp.el.ExpressionEvaluator;
 import javax.servlet.jsp.el.VariableResolver;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.util._ClassUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,7 +54,7 @@ public class _FreeMarkerPageContext21 extends FreeMarkerPageContext {
                 JspFactory.getDefaultFactory().getClass().getName());
     }
 
-    public _FreeMarkerPageContext21() throws TemplateModelException {
+    public _FreeMarkerPageContext21() throws TemplateException {
         super();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
index 5c0197c..1ce54ba 100644
--- a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
+++ b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/JspTestFreemarkerServlet.java
@@ -21,10 +21,9 @@ package org.apache.freemarker.servlet.jsp;
 
 import javax.servlet.ServletContext;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.servlet.FreemarkerServlet;
-import org.apache.freemarker.servlet.jsp.TaglibFactory;
 
 public class JspTestFreemarkerServlet extends FreemarkerServlet {
 
@@ -40,7 +39,7 @@ public class JspTestFreemarkerServlet extends FreemarkerServlet {
 
     @Override
     protected TaglibFactory createTaglibFactory(ObjectWrapper objectWrapper, ServletContext servletContext)
-            throws TemplateModelException {
+            throws TemplateException {
         final TaglibFactory taglibFactory = super.createTaglibFactory(objectWrapper, servletContext);
         taglibFactory.test_emulateNoUrlToFileConversions = emulateNoUrlToFileConversions;
         taglibFactory.test_emulateNoJarURLConnections = emulateNoJarURLConnections;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/customTags1.txt b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
index 492713a..b0da72f 100644
--- a/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
+++ b/freemarker-servlet/src/test/resources/org/apache/freemarker/servlet/jsp/webapps/basic/WEB-INF/expected/customTags1.txt
@@ -35,7 +35,7 @@ doFinally() called here
 
 <!-- Test abrupt execution -->
 doStartTag() called here
-doCatch() called here with class org.apache.freemarker.core._TemplateModelException: Error while invoking the "testtag" JSP custom tag; see cause exception
+doCatch() called here with class org.apache.freemarker.core.TemplateException: Error while invoking the "testtag" JSP custom tag; see cause exception
 doFinally() called here
 
 <!-- Test nested execution -->

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
----------------------------------------------------------------------
diff --git a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
index b5f62e7..a894a7d 100644
--- a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
+++ b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
@@ -22,15 +22,14 @@ package org.apache.freemarker.test.templateutil;
 import java.io.IOException;
 import java.io.Writer;
 
+import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.util.StringToIndexMap;
@@ -87,7 +86,7 @@ public class AssertEqualsDirective implements TemplateDirectiveModel {
         return false;
     }
 
-    private String tryUnwrap(TemplateModel value) throws TemplateModelException {
+    private String tryUnwrap(TemplateModel value) throws TemplateException {
         if (value == null) return "null";
             // This is the same order as comparison goes:
         else if (value instanceof TemplateNumberModel) return ((TemplateNumberModel) value).getAsNumber().toString();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
----------------------------------------------------------------------
diff --git a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
index 05a5cb0..e315ef6 100644
--- a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
+++ b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
@@ -23,13 +23,12 @@ import java.io.IOException;
 import java.io.Writer;
 import java.util.regex.Pattern;
 
+import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.util.StringToIndexMap;
@@ -146,7 +145,7 @@ public class AssertFailsDirective implements TemplateDirectiveModel {
     }
 
     private String getAsString(TemplateModel value, String paramName, Environment env)
-            throws BadParameterTypeException, TemplateModelException {
+            throws TemplateException {
         if (value == null) {
             return null;
         }
@@ -158,14 +157,13 @@ public class AssertFailsDirective implements TemplateDirectiveModel {
     }
 
     private Pattern getAsPattern(TemplateModel value, String paramName, Environment env)
-            throws TemplateModelException, BadParameterTypeException {
+            throws TemplateException {
         String s = getAsString(value, paramName, env);
         return s != null ? Pattern.compile(s, Pattern.CASE_INSENSITIVE) : null;
     }
 
-    private int getAsInt(TemplateModel value, int defaultValue, String paramName, Environment env) throws
-            BadParameterTypeException,
-            TemplateModelException {
+    private int getAsInt(TemplateModel value, int defaultValue, String paramName, Environment env)
+            throws TemplateException {
         if (value == null) {
             return defaultValue;
         }


[7/7] incubator-freemarker git commit: `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extend

Posted by dd...@apache.org.
`TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extends `TemplateException`). In FM2 it `TemplateModelException` has extended `TemplateException` and was thrown by `TemplateModel` methods. As it has turned out over time, some models call into FreeMarker functionality that can throw `TemplateException`, but the method of the model couldn't throw that as `TemplateModelException` is more specific. Now it can. Also it's not very useful in practice to catch `TemplateModelException` and the more generic `TemplateException` separately, so this simplification was made.


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

Branch: refs/heads/3
Commit: d73da6da8cf7be99db5836ff84e2e3a696e8ff62
Parents: f231e64
Author: ddekany <dd...@apache.org>
Authored: Sun Aug 20 01:25:57 2017 +0200
Committer: ddekany <dd...@apache.org>
Committed: Sun Aug 20 01:36:19 2017 +0200

----------------------------------------------------------------------
 FM3-CHANGE-LOG.txt                              |  10 +-
 .../freemarker/core/CoercionToTextualTest.java  |   3 +-
 .../freemarker/core/ConfigurationTest.java      |   3 +-
 .../apache/freemarker/core/DateFormatTest.java  |   3 +-
 .../freemarker/core/DirectiveCallPlaceTest.java |   3 +-
 .../freemarker/core/IteratorIssuesTest.java     |   3 +-
 .../core/NewBiObjectWrapperRestrictionTest.java |   4 +-
 .../freemarker/core/OutputFormatTest.java       |   9 +-
 .../freemarker/core/XHTMLOutputFormatTest.java  |   7 +-
 .../freemarker/core/XMLOutputFormatTest.java    |   7 +-
 .../impl/AbstractParallelIntrospectionTest.java |   7 +-
 .../CommonSupertypeForUnwrappingHintTest.java   |   4 +-
 .../DefaultObjectWrapperSingletonsTest.java     |  12 +-
 .../model/impl/DefaultObjectWrapperTest.java    |  40 +++---
 .../core/model/impl/EnumModelsTest.java         |   6 +-
 .../core/model/impl/ErrorMessagesTest.java      |  16 +--
 .../impl/FineTuneMethodAppearanceTest.java      |   6 +-
 .../impl/PrallelObjectIntrospectionTest.java    |   5 +-
 .../impl/PrallelStaticIntrospectionTest.java    |   4 +-
 .../model/impl/RestrictedObjectWrapperTest.java |  19 ++-
 .../core/model/impl/StaticModelsTest.java       |   8 +-
 .../impl/CombinedMarkupOutputFormatTest.java    |  20 +--
 .../outputformat/impl/HTMLOutputFormatTest.java |  12 +-
 .../outputformat/impl/RTFOutputFormatTest.java  |  12 +-
 .../templatesuite/models/AllTemplateModels.java |  30 ++---
 .../models/BooleanAndScalarModel.java           |   6 +-
 .../models/BooleanAndStringTemplateModel.java   |   6 +-
 .../core/templatesuite/models/BooleanList1.java |   4 +-
 .../core/templatesuite/models/BooleanList2.java |   4 +-
 .../templatesuite/models/ExceptionModel.java    |   6 +-
 .../models/HashAndScalarModel.java              |  20 +--
 .../core/templatesuite/models/Listables.java    |  11 +-
 .../core/templatesuite/models/MultiModel1.java  |   6 +-
 .../core/templatesuite/models/MultiModel4.java  |   4 +-
 .../core/templatesuite/models/MultiModel5.java  |   4 +-
 .../models/NumberAndStringModel.java            |   5 +-
 .../models/OverloadedConstructor.java           |   3 +-
 .../models/OverloadedMethods2.java              |  17 +--
 .../SimpleMapAndCollectionObjectWrapper.java    |   4 +-
 .../AppMetaTemplateDateFormatFactory.java       |   6 +-
 .../BaseNTemplateNumberFormatFactory.java       |   4 +-
 .../core/userpkg/CustomHTMLOutputFormat.java    |   3 +-
 .../core/userpkg/DummyOutputFormat.java         |   3 +-
 ...EpochMillisDivTemplateDateFormatFactory.java |   4 +-
 .../EpochMillisTemplateDateFormatFactory.java   |   4 +-
 .../HTMLISOTemplateDateFormatFactory.java       |   6 +-
 .../userpkg/HexTemplateNumberFormatFactory.java |   4 +-
 ...AndTZSensitiveTemplateDateFormatFactory.java |   7 +-
 ...aleSensitiveTemplateNumberFormatFactory.java |   4 +-
 .../userpkg/NameClashingDummyOutputFormat.java  |   4 +-
 .../PrintfGTemplateNumberFormatFactory.java     |   6 +-
 .../core/userpkg/SeldomEscapedOutputFormat.java |   3 +-
 .../core/userpkg/TestTemplateCallableModel.java |  12 +-
 .../core/valueformat/NumberFormatTest.java      |   5 +-
 .../core/templatesuite/expected/exception.txt   |   2 +-
 .../core/templatesuite/expected/exception2.txt  |   2 +-
 .../core/ASTDirCapturingAssignment.java         |   3 +-
 .../freemarker/core/ASTDirMacroOrFunction.java  |   5 +-
 .../freemarker/core/ASTDollarInterpolation.java |   1 -
 .../freemarker/core/ASTExpAddOrConcat.java      |  23 ++--
 .../freemarker/core/ASTExpBuiltInVariable.java  |   3 +-
 .../freemarker/core/ASTExpHashLiteral.java      |  11 +-
 .../freemarker/core/ASTExpNumberLiteral.java    |   2 +-
 .../apache/freemarker/core/ASTExpression.java   |   3 +-
 .../freemarker/core/BuiltInForHashEx.java       |   3 +-
 .../freemarker/core/BuiltInForMarkupOutput.java |   3 +-
 .../apache/freemarker/core/BuiltInForNode.java  |   3 +-
 .../freemarker/core/BuiltInForNodeEx.java       |   3 +-
 .../freemarker/core/BuiltInForNumber.java       |   3 +-
 .../freemarker/core/BuiltInsForHashes.java      |   5 +-
 .../core/BuiltInsForMarkupOutputs.java          |   3 +-
 .../core/BuiltInsForMultipleTypes.java          | 106 +++++----------
 .../freemarker/core/BuiltInsForNodes.java       |  21 ++-
 .../freemarker/core/BuiltInsForNumbers.java     |  31 +++--
 .../core/BuiltInsForOutputFormatRelated.java    |   2 +-
 .../freemarker/core/BuiltInsForSequences.java   |  21 ++-
 .../core/BuiltInsForStringsBasic.java           |  15 +--
 .../core/BuiltInsForStringsEncoding.java        |  24 ++--
 .../freemarker/core/BuiltInsForStringsMisc.java |   9 +-
 .../core/BuiltInsForStringsRegexp.java          |  33 ++---
 .../apache/freemarker/core/Configuration.java   |   4 +-
 .../org/apache/freemarker/core/Environment.java |  90 ++++++-------
 .../core/ListableRightUnboundedRangeModel.java  |   9 +-
 .../apache/freemarker/core/LocalContext.java    |   5 +-
 .../apache/freemarker/core/MessageUtils.java    |  17 +--
 .../freemarker/core/NativeCollectionEx.java     |   7 +-
 .../apache/freemarker/core/NativeHashEx2.java   |  21 ++-
 .../apache/freemarker/core/NativeSequence.java  |   5 +-
 .../core/NativeStringArraySequence.java         |   5 +-
 .../NativeStringCollectionCollectionEx.java     |   7 +-
 .../core/NativeStringListSequence.java          |   5 +-
 .../org/apache/freemarker/core/RangeModel.java  |   5 +-
 .../apache/freemarker/core/RegexpHelper.java    |  12 +-
 .../org/apache/freemarker/core/Template.java    |  18 ++-
 .../freemarker/core/TemplateException.java      |   8 +-
 .../org/apache/freemarker/core/_CoreAPI.java    |  15 ---
 .../org/apache/freemarker/core/_EvalUtils.java  |  39 +++---
 .../core/_ObjectBuilderSettingEvaluator.java    |   6 +-
 .../core/_TemplateModelException.java           | 133 -------------------
 .../freemarker/core/debug/DebugModel.java       |  26 ++--
 .../core/debug/RmiDebugModelImpl.java           |  24 ++--
 .../core/debug/RmiDebuggedEnvironmentImpl.java  |  22 +--
 .../core/model/EmptyCollectionExModel.java      |   8 +-
 .../freemarker/core/model/EmptyHashModel.java   |  14 +-
 .../core/model/EmptyIteratorModel.java          |   8 +-
 .../core/model/EmptyKeyValuePairIterator.java   |   6 +-
 .../core/model/EmptySequenceModel.java          |   6 +-
 .../core/model/GeneralPurposeNothing.java       |   6 +-
 .../freemarker/core/model/ObjectWrapper.java    |   2 +-
 .../core/model/ObjectWrapperAndUnwrapper.java   |  10 +-
 .../core/model/ObjectWrapperWithAPISupport.java |   2 +-
 .../core/model/ObjectWrappingException.java     |  37 ++++++
 .../core/model/TemplateBooleanModel.java        |   4 +-
 .../core/model/TemplateCollectionModel.java     |   6 +-
 .../core/model/TemplateCollectionModelEx.java   |   6 +-
 .../core/model/TemplateDateModel.java           |   4 +-
 .../core/model/TemplateHashModel.java           |   6 +-
 .../core/model/TemplateHashModelEx.java         |   7 +-
 .../core/model/TemplateHashModelEx2.java        |  14 +-
 .../core/model/TemplateModelException.java      | 113 ----------------
 .../core/model/TemplateModelIterator.java       |   8 +-
 .../core/model/TemplateModelWithAPISupport.java |   4 +-
 .../core/model/TemplateNodeModel.java           |  12 +-
 .../core/model/TemplateNodeModelEx.java         |   6 +-
 .../core/model/TemplateNumberModel.java         |   3 +-
 .../core/model/TemplateScalarModel.java         |   3 +-
 .../core/model/TemplateSequenceModel.java       |   6 +-
 .../core/model/WrappingTemplateModel.java       |   4 +-
 .../core/model/impl/ArgumentTypes.java          |   8 +-
 .../freemarker/core/model/impl/BeanModel.java   |  27 ++--
 .../model/impl/CallableMemberDescriptor.java    |   6 +-
 .../core/model/impl/ClassBasedModelFactory.java |  16 ++-
 .../core/model/impl/CollectionAdapter.java      |   8 +-
 .../core/model/impl/CollectionAndSequence.java  |  14 +-
 .../core/model/impl/DefaultArrayAdapter.java    |  42 +++---
 .../model/impl/DefaultEnumerationAdapter.java   |  16 +--
 .../core/model/impl/DefaultIterableAdapter.java |   6 +-
 .../core/model/impl/DefaultIteratorAdapter.java |  16 +--
 .../core/model/impl/DefaultListAdapter.java     |  10 +-
 .../core/model/impl/DefaultMapAdapter.java      |  15 +--
 .../impl/DefaultNonListCollectionAdapter.java   |   6 +-
 .../core/model/impl/DefaultObjectWrapper.java   |  63 +++++----
 .../DefaultUnassignableIteratorAdapter.java     |   8 +-
 .../freemarker/core/model/impl/HashAdapter.java |  14 +-
 .../model/impl/InvalidPropertyException.java    |   4 +-
 .../model/impl/MapKeyValuePairIterator.java     |   9 +-
 .../core/model/impl/MemberAndArguments.java     |   6 +-
 .../model/impl/OverloadedFixArgsMethods.java    |   6 +-
 .../model/impl/OverloadedJavaMethodModel.java   |   9 +-
 .../core/model/impl/OverloadedMethods.java      |   7 +-
 .../model/impl/OverloadedMethodsSubset.java     |   4 +-
 .../model/impl/OverloadedVarArgsMethods.java    |   8 +-
 .../ReflectionCallableMemberDescriptor.java     |   4 +-
 .../core/model/impl/ResourceBundleModel.java    |  13 +-
 .../model/impl/RestrictedObjectWrapper.java     |  11 +-
 .../core/model/impl/SequenceAdapter.java        |   6 +-
 .../core/model/impl/SimpleCollection.java       |  14 +-
 .../freemarker/core/model/impl/SimpleHash.java  |  13 +-
 .../core/model/impl/SimpleJavaMethodModel.java  |   5 +-
 .../core/model/impl/SimpleMethod.java           |  23 ++--
 .../core/model/impl/SimpleSequence.java         |   4 +-
 .../freemarker/core/model/impl/StaticModel.java |  18 +--
 .../core/model/impl/StaticModels.java           |   4 +-
 .../core/model/impl/_MethodUtils.java           |  15 +--
 .../freemarker/core/model/impl/_ModelAPI.java   |   6 +-
 .../outputformat/CommonMarkupOutputFormat.java  |  20 +--
 .../core/outputformat/MarkupOutputFormat.java   |  24 ++--
 .../impl/CombinedMarkupOutputFormat.java        |   8 +-
 .../outputformat/impl/HTMLOutputFormat.java     |   4 +-
 .../core/outputformat/impl/RTFOutputFormat.java |   4 +-
 .../outputformat/impl/XHTMLOutputFormat.java    |   4 +-
 .../core/outputformat/impl/XMLOutputFormat.java |   4 +-
 .../freemarker/core/util/CallableUtils.java     |  22 ++-
 .../apache/freemarker/core/util/DeepUnwrap.java |  14 +-
 .../core/valueformat/TemplateDateFormat.java    |   8 +-
 .../core/valueformat/TemplateFormatUtil.java    |  10 +-
 .../core/valueformat/TemplateNumberFormat.java  |   8 +-
 .../impl/ISOLikeTemplateDateFormat.java         |   4 +-
 .../impl/JavaTemplateDateFormat.java            |   4 +-
 .../impl/JavaTemplateNumberFormat.java          |   5 +-
 freemarker-core/src/main/javacc/FTL.jj          |  10 +-
 .../apache/freemarker/dom/DocumentModel.java    |   6 +-
 .../freemarker/dom/DocumentTypeModel.java       |  10 +-
 .../org/apache/freemarker/dom/ElementModel.java |  10 +-
 .../freemarker/dom/JaxenXPathSupport.java       |  13 +-
 .../apache/freemarker/dom/NodeListModel.java    |  16 +--
 .../org/apache/freemarker/dom/NodeModel.java    |  33 ++---
 .../dom/NodeQueryResultItemObjectWrapper.java   |   6 +-
 .../dom/SunInternalXalanXPathSupport.java       |  16 +--
 .../org/apache/freemarker/dom/XPathSupport.java |   4 +-
 .../freemarker/dom/XalanXPathSupport.java       |  16 +--
 .../BaseNTemplateNumberFormatFactory.java       |   4 +-
 .../UnitAwareTemplateNumberFormatFactory.java   |   4 +-
 .../examples/UnitAwareTemplateNumberModel.java  |   4 +-
 .../servlet/AllHttpScopesHashModel.java         |   4 +-
 .../freemarker/servlet/FreemarkerServlet.java   |  13 +-
 .../servlet/HttpRequestHashModel.java           |   4 +-
 .../servlet/HttpSessionHashModel.java           |  10 +-
 .../servlet/ServletContextHashModel.java        |   4 +-
 .../servlet/jsp/FreeMarkerPageContext.java      |  21 +--
 .../freemarker/servlet/jsp/JspTagModelBase.java |  18 ++-
 .../servlet/jsp/PageContextFactory.java         |   4 +-
 .../servlet/jsp/SimpleTagDirectiveModel.java    |   2 +-
 .../servlet/jsp/TagDirectiveModel.java          |  26 ++--
 .../freemarker/servlet/jsp/TaglibFactory.java   |  10 +-
 .../servlet/jsp/_FreeMarkerPageContext21.java   |   4 +-
 .../servlet/jsp/JspTestFreemarkerServlet.java   |   5 +-
 .../basic/WEB-INF/expected/customTags1.txt      |   2 +-
 .../templateutil/AssertEqualsDirective.java     |   5 +-
 .../test/templateutil/AssertFailsDirective.java |  12 +-
 210 files changed, 1090 insertions(+), 1369 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/FM3-CHANGE-LOG.txt
----------------------------------------------------------------------
diff --git a/FM3-CHANGE-LOG.txt b/FM3-CHANGE-LOG.txt
index 0c69572..8e08099 100644
--- a/FM3-CHANGE-LOG.txt
+++ b/FM3-CHANGE-LOG.txt
@@ -198,7 +198,7 @@ Major changes / features
     `TemplateDirectiveModel`, `TemplateTransformModel`). FM3 replaces them with only two new interfaces,
     `TemplateDirectiveModel` (differs from the interface with identical name in FM2) and `TemplateFunctionModel`.
     (These are both the subinterfaces of another new interface `TemplateCallableModel`.)
-  - All callable TempalteModel-s support passing parameters by position and by name, even in the same call
+  - All callable TemplateModel-s support passing parameters by position and by name, even in the same call
     (e.g., `<@heading "Some title" icon="foo.jpg" />`, `sum(1, 2, 3, abs=true)`)
   - `#macro` now produces a `TemplateDirectiveModel` and `#function` produces a `TemplateFunctionModel`. (Earlier, the
     product was just a generic `TemplateModel` that could only be invoked using internal API-s, and had capabilities
@@ -377,6 +377,14 @@ Core / Models and Object wrapping
   the common interface bith for wrapped Java methods and functions defined in the templates, or on any other ways.
   `OverloadedMethodsModel` and `SimpleMethodModel` were renamed to `OverloadJavaMethodModel` and  `SimpleJavaMethodModel`,
   which of course extend `TemplateFunctionModel`, but allow inocations without `Environment` parameter.
+- `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for
+  `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extends
+  `TemplateException`).
+  In FM2 it `TemplateModelException` has extended `TemplateException` and was thrown by `TemplateModel` methods. As it
+  has turned out over time, some models call into FreeMarker functionality that can throw `TemplateException`, but the
+  method of the model couldn't throw that as `TemplateModelException` is more specific. Now it can. Also it's not very
+  useful in practice to catch `TemplateModelException` and the more generic `TemplateException` separately, so this
+  simplification was made.
 
 Core / Template loading and caching
 ...................................

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 1a98373..ce6a319 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
@@ -23,7 +23,6 @@ import java.util.Collections;
 import java.util.Date;
 
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleDate;
 import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
 import org.apache.freemarker.core.userpkg.HTMLISOTemplateDateFormatFactory;
@@ -138,7 +137,7 @@ public class CoercionToTextualTest extends TemplateTest {
     }
 
     @Before
-    public void setup() throws TemplateModelException {
+    public void setup() throws TemplateException {
         addToDataModel("s", "abc");
         addToDataModel("n", 1500);
         addToDataModel("dt", TM);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
index dab1460..bd6c81d 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/ConfigurationTest.java
@@ -45,7 +45,6 @@ import java.util.Set;
 import java.util.TimeZone;
 import java.util.TreeSet;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.RestrictedObjectWrapper;
@@ -938,7 +937,7 @@ public class ConfigurationTest {
     private static class MyScalarModel implements TemplateScalarModel {
 
         @Override
-        public String getAsString() throws TemplateModelException {
+        public String getAsString() throws TemplateException {
             return "my";
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 b0ca6ad..3076919 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
@@ -30,7 +30,6 @@ import java.util.Locale;
 import java.util.TimeZone;
 
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleDate;
 import org.apache.freemarker.core.templateresolver.ConditionalTemplateConfigurationFactory;
 import org.apache.freemarker.core.templateresolver.FileNameGlobMatcher;
@@ -450,7 +449,7 @@ public class DateFormatTest extends TemplateTest {
         }
 
         @Override
-        public Date getAsDate() throws TemplateModelException {
+        public Date getAsDate() throws TemplateException {
             return date;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
index 25a05ac..471e13d 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
@@ -30,7 +30,6 @@ import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.util.CommonSupplier;
 import org.apache.freemarker.test.TemplateTest;
@@ -127,7 +126,7 @@ public class DirectiveCallPlaceTest extends TemplateTest {
 
                             });
                 } catch (CallPlaceCustomDataInitializationException e) {
-                    throw new TemplateModelException("Failed to pre-render nested content", e);
+                    throw new TemplateException("Failed to pre-render nested content", e);
                 }
             } else {
                 convertedText = convertBodyText(callPlace, env);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/IteratorIssuesTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/IteratorIssuesTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/IteratorIssuesTest.java
index 08fcee2..368ec9f 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/IteratorIssuesTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/IteratorIssuesTest.java
@@ -21,6 +21,7 @@ package org.apache.freemarker.core;
 import java.util.Arrays;
 import java.util.Iterator;
 
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.test.TemplateTest;
 import org.junit.Test;
@@ -48,7 +49,7 @@ public class IteratorIssuesTest extends TemplateTest {
     }
 
     @Test
-    public void testListAndHasContent() throws Exception {
+    public void testListAndHasContent() throws ObjectWrappingException {
         addToDataModel("it", OW.wrap(getAbcIt()));
         assertErrorContains(FTL_LIST_AND_HAS_CONTENT, "can be listed only once");
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
index a90e28b..0548e42 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
@@ -25,11 +25,11 @@ import java.util.Collection;
 import java.util.Map;
 
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelAdapter;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.SimpleDate;
 import org.apache.freemarker.core.model.impl.SimpleHash;
@@ -67,7 +67,7 @@ public class NewBiObjectWrapperRestrictionTest extends TemplateTest {
     public static class EntirelyCustomObjectWrapper implements ObjectWrapper {
 
         @Override
-        public TemplateModel wrap(Object obj) throws TemplateModelException {
+        public TemplateModel wrap(Object obj) throws ObjectWrappingException {
             if (obj == null) {
                 return null;
             }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
index 51a0070..279516f 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/OutputFormatTest.java
@@ -26,7 +26,6 @@ import java.io.StringWriter;
 import java.io.Writer;
 import java.util.Collections;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
 import org.apache.freemarker.core.outputformat.impl.PlainTextOutputFormat;
@@ -804,7 +803,7 @@ public class OutputFormatTest extends TemplateTest {
 
     private Configuration testAutoEscPolicy_createCfg(AutoEscapingPolicy autoEscPolicy,
             OutputFormat outpoutFormat)
-            throws TemplateModelException {
+            throws TemplateException {
         return createDefaultConfigurationBuilder()
                 .registeredCustomOutputFormats(ImmutableList.<OutputFormat>of(
                         SeldomEscapedOutputFormat.INSTANCE, DummyOutputFormat.INSTANCE))
@@ -989,7 +988,7 @@ public class OutputFormatTest extends TemplateTest {
         assertOutput("${m1?isMarkupOutput?c} ${m2?isMarkupOutput?c} ${s?isMarkupOutput?c}", "true true false");
     }
 
-    private TestConfigurationBuilder createDefaultConfigurationBuilder() throws TemplateModelException {
+    private TestConfigurationBuilder createDefaultConfigurationBuilder() throws TemplateException {
         return new TestConfigurationBuilder()
                 .templateConfigurations(
                         new ConditionalTemplateConfigurationFactory(
@@ -1001,7 +1000,7 @@ public class OutputFormatTest extends TemplateTest {
     }
 
     @Before
-    public void addCommonDataModelVariables() throws TemplateModelException {
+    public void addCommonDataModelVariables() throws TemplateException {
         addToDataModel("rtfPlain", RTFOutputFormat.INSTANCE.fromPlainTextByEscaping("\\par a & b"));
         addToDataModel("rtfMarkup", RTFOutputFormat.INSTANCE.fromMarkup("\\par c"));
         addToDataModel("htmlPlain", HTMLOutputFormat.INSTANCE.fromPlainTextByEscaping("a < {h'}"));
@@ -1011,7 +1010,7 @@ public class OutputFormatTest extends TemplateTest {
     }
 
     @Override
-    protected Configuration createDefaultConfiguration() throws TemplateModelException {
+    protected Configuration createDefaultConfiguration() throws TemplateException {
         return createDefaultConfigurationBuilder().build();
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/XHTMLOutputFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/XHTMLOutputFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/XHTMLOutputFormatTest.java
index 77951ed..6ba4418 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/XHTMLOutputFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/XHTMLOutputFormatTest.java
@@ -24,20 +24,19 @@ import static org.junit.Assert.*;
 import java.io.IOException;
 import java.io.StringWriter;
 
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.junit.Test; 
+import org.junit.Test;
 
 public class XHTMLOutputFormatTest {
     
     @Test
-    public void testOutputMO() throws TemplateModelException, IOException {
+    public void testOutputMO() throws TemplateException, IOException {
        StringWriter out = new StringWriter();
        INSTANCE.output(INSTANCE.fromPlainTextByEscaping("a'b"), out);
        assertEquals("a&#39;b", out.toString());
     }
     
     @Test
-    public void testOutputString() throws TemplateModelException, IOException {
+    public void testOutputString() throws TemplateException, IOException {
         StringWriter out = new StringWriter();
         INSTANCE.output("a'b", out);
         assertEquals("a&#39;b", out.toString());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/XMLOutputFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/XMLOutputFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/XMLOutputFormatTest.java
index 7e95e6d..8d4bbc1 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/XMLOutputFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/XMLOutputFormatTest.java
@@ -24,20 +24,19 @@ import static org.junit.Assert.*;
 import java.io.IOException;
 import java.io.StringWriter;
 
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.junit.Test; 
+import org.junit.Test;
 
 public class XMLOutputFormatTest {
     
     @Test
-    public void testOutputMO() throws TemplateModelException, IOException {
+    public void testOutputMO() throws TemplateException, IOException {
        StringWriter out = new StringWriter();
        INSTANCE.output(INSTANCE.fromPlainTextByEscaping("a'b"), out);
        assertEquals("a&apos;b", out.toString());
     }
     
     @Test
-    public void testOutputString() throws TemplateModelException, IOException {
+    public void testOutputString() throws TemplateException, IOException {
         StringWriter out = new StringWriter();
         INSTANCE.output("a'b", out);
         assertEquals("a&apos;b", out.toString());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/AbstractParallelIntrospectionTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/AbstractParallelIntrospectionTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/AbstractParallelIntrospectionTest.java
index 49d4009..f62587b 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/AbstractParallelIntrospectionTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/AbstractParallelIntrospectionTest.java
@@ -22,10 +22,9 @@ package org.apache.freemarker.core.model.impl;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.NonTemplateCallPlace;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
+import org.apache.freemarker.core.util.CallableUtils;
 
 import junit.framework.TestCase;
 
@@ -67,7 +66,7 @@ public abstract class AbstractParallelIntrospectionTest extends TestCase {
         }
     }
 
-    protected abstract TemplateHashModel getWrappedEntity(int objIdx) throws TemplateModelException;
+    protected abstract TemplateHashModel getWrappedEntity(int objIdx) throws TemplateException;
     
     protected final DefaultObjectWrapper getObjectWrapper() {
         return ow;
@@ -102,7 +101,7 @@ public abstract class AbstractParallelIntrospectionTest extends TestCase {
         }
 
         private void testProperty(TemplateHashModel h, int objIdx, int mIdx)
-                throws TemplateModelException, AssertionError {
+                throws TemplateException, AssertionError {
             TemplateNumberModel pv = (TemplateNumberModel) h.get("p" + mIdx);
             final int expected = objIdx * 1000 + mIdx;
             final int got = pv.getAsNumber().intValue();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java
index fb9a065..4201917 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/CommonSupertypeForUnwrappingHintTest.java
@@ -23,7 +23,6 @@ import java.io.Serializable;
 import java.util.List;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 import junit.framework.TestCase;
 
@@ -121,8 +120,7 @@ public class CommonSupertypeForUnwrappingHintTest extends TestCase {
         }
 
         @Override
-        MaybeEmptyMemberAndArguments getMemberAndArguments(TemplateModel[] tmArgs, DefaultObjectWrapper w) throws
-                TemplateModelException {
+        MaybeEmptyMemberAndArguments getMemberAndArguments(TemplateModel[] tmArgs, DefaultObjectWrapper w) {
             throw new RuntimeException("Not implemented in this dummy.");
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 dd7581c..faee8c0 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
@@ -29,10 +29,10 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.freemarker.core.Configuration;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.Version;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.test.TestUtils;
 
@@ -308,7 +308,7 @@ public class DefaultObjectWrapperSingletonsTest extends TestCase {
         assertTrue(hardReferences.size() != 0);  // just to save it from GC until this line        
     }
     
-    public void testClassInrospectorCache() throws TemplateModelException {
+    public void testClassInrospectorCache() throws TemplateException {
         assertFalse(new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
                 .usePrivateCaches(true).build().isClassIntrospectionCacheRestricted());
         assertTrue(new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
@@ -599,7 +599,7 @@ public class DefaultObjectWrapperSingletonsTest extends TestCase {
         
     }
 
-    private boolean exposesFields(DefaultObjectWrapper ow) throws TemplateModelException {
+    private boolean exposesFields(DefaultObjectWrapper ow) throws TemplateException {
         TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
         TemplateScalarModel r = (TemplateScalarModel) thm.get("foo");
         if (r == null) return false;
@@ -607,7 +607,7 @@ public class DefaultObjectWrapperSingletonsTest extends TestCase {
         return true;
     }
 
-    private boolean exposesProperties(DefaultObjectWrapper ow) throws TemplateModelException {
+    private boolean exposesProperties(DefaultObjectWrapper ow) throws TemplateException {
         TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
         TemplateScalarModel r = (TemplateScalarModel) thm.get("bar");
         if (r == null) return false;
@@ -615,12 +615,12 @@ public class DefaultObjectWrapperSingletonsTest extends TestCase {
         return true;
     }
 
-    private boolean exposesMethods(DefaultObjectWrapper ow) throws TemplateModelException {
+    private boolean exposesMethods(DefaultObjectWrapper ow) throws TemplateException {
         TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
         return thm.get("getBar") != null;
     }
 
-    private boolean exposesUnsafe(DefaultObjectWrapper ow) throws TemplateModelException {
+    private boolean exposesUnsafe(DefaultObjectWrapper ow) throws TemplateException {
         TemplateHashModel thm = (TemplateHashModel) ow.wrap(new C());
         return thm.get("wait") != null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java
index 0f9722e..e307cb2 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapperTest.java
@@ -45,17 +45,16 @@ import org.apache.freemarker.core.NonTemplateCallPlace;
 import org.apache.freemarker.core.Template;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.Version;
-import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core._CoreAPI;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateCollectionModelEx;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.TemplateNumberModel;
@@ -63,6 +62,7 @@ import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
+import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
@@ -276,7 +276,7 @@ public class DefaultObjectWrapperTest {
     }
 
     private void assertCollectionTMEquals(TemplateCollectionModel coll, Object... expectedItems)
-            throws TemplateModelException {
+            throws TemplateException {
         for (int i = 0; i < 2; i++) { // Run twice to check if we always get a new iterator
             int idx = 0;
             TemplateModelIterator it2 = null;
@@ -351,14 +351,14 @@ public class DefaultObjectWrapperTest {
             try {
                 it.next();
                 fail();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 assertThat(e.getMessage(), containsString("no more"));
             }
         }
     }
 
     @Test
-    public void testArrayAdapterTypes() throws TemplateModelException {
+    public void testArrayAdapterTypes() throws ObjectWrappingException {
         assertArrayAdapterClass("Object", OW.wrap(new Object[] {}));
         assertArrayAdapterClass("Object", OW.wrap(new String[] {}));
         assertArrayAdapterClass("byte", OW.wrap(new byte[] {}));
@@ -379,7 +379,7 @@ public class DefaultObjectWrapperTest {
 
     @SuppressWarnings("boxing")
     @Test
-    public void testArrayAdapters() throws TemplateModelException {
+    public void testArrayAdapters() throws TemplateException {
         {
             final String[] testArray = new String[] { "a", null, "c" };
 
@@ -504,7 +504,7 @@ public class DefaultObjectWrapperTest {
 
     @SuppressWarnings("boxing")
     @Test
-    public void testCollectionAdapterOutOfBounds() throws TemplateModelException {
+    public void testCollectionAdapterOutOfBounds() throws TemplateException {
         Set set = Collections.singleton(123);
 
         TemplateCollectionModelEx coll = (TemplateCollectionModelEx) OW.wrap(set);
@@ -521,14 +521,14 @@ public class DefaultObjectWrapperTest {
             try {
                 it.next();
                 fail();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 assertThat(e.getMessage(), containsStringIgnoringCase("no more"));
             }
         }
     }
 
     @Test
-    public void testCollectionAdapterAndNulls() throws TemplateModelException {
+    public void testCollectionAdapterAndNulls() throws TemplateException {
         Set set = new HashSet();
         set.add(null);
 
@@ -558,14 +558,14 @@ public class DefaultObjectWrapperTest {
         try {
             itIt.next();
             fail();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsStringIgnoringCase("no more"));
         }
 
         try {
             itIt2.hasNext();
             fail();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsString("can be listed only once"));
         }
 
@@ -573,7 +573,7 @@ public class DefaultObjectWrapperTest {
         try {
             itIt3.hasNext();
             fail();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsString("can be listed only once"));
         }
     }
@@ -592,7 +592,7 @@ public class DefaultObjectWrapperTest {
 
     @SuppressWarnings("boxing")
     @Test
-    public void testCharKeyFallback() throws TemplateModelException {
+    public void testCharKeyFallback() throws TemplateException {
         Map hashMapS = new HashMap<>();
         hashMapS.put("a", 1);
         Map sortedMapS = new TreeMap<>();
@@ -607,7 +607,7 @@ public class DefaultObjectWrapperTest {
         assertEquals(1, OW.unwrap(((TemplateHashModel) OW.wrap(sortedMapS)).get("a")));
         try {
             ((TemplateHashModel) OW.wrap(sortedMapC)).get("a");
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsStringIgnoringCase("String key"));
         }
         
@@ -616,7 +616,7 @@ public class DefaultObjectWrapperTest {
         assertNull(((TemplateHashModel) OW.wrap(sortedMapS)).get("b"));
         try {
             ((TemplateHashModel) OW.wrap(sortedMapC)).get("b");
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsStringIgnoringCase("String key"));
         }
     }
@@ -644,7 +644,7 @@ public class DefaultObjectWrapperTest {
             try {
                 iteratorTM.next();
                 fail();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 assertThat(e.getMessage(), containsStringIgnoringCase("no more"));
             }
         }
@@ -721,7 +721,7 @@ public class DefaultObjectWrapperTest {
         }
     }
 
-    private TemplateHashModel wrapWithExposureLevel(Object bean, int exposureLevel) throws TemplateModelException {
+    private TemplateHashModel wrapWithExposureLevel(Object bean, int exposureLevel) throws ObjectWrappingException {
         return (TemplateHashModel) new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
                 .exposureLevel(exposureLevel).build()
                 .wrap(bean);
@@ -851,7 +851,7 @@ public class DefaultObjectWrapperTest {
         }
         
         @Override
-        protected TemplateModel wrapGenericObject(final Object obj) throws TemplateModelException {
+        protected TemplateModel wrapGenericObject(final Object obj) throws ObjectWrappingException {
             if (obj instanceof Tupple) {
                 return new TuppleAdapter((Tupple<?, ?>) obj, this);
             }
@@ -872,12 +872,12 @@ public class DefaultObjectWrapperTest {
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return 2;
         }
         
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             switch (index) {
             case 0: return wrap(tupple.getE1());
             case 1: return wrap(tupple.getE2());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java
index 89b6ec5..a43ee29 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/EnumModelsTest.java
@@ -23,11 +23,11 @@ import static org.junit.Assert.*;
 
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.NonTemplateCallPlace;
-import org.apache.freemarker.core.util.CallableUtils;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
+import org.apache.freemarker.core.util.CallableUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -49,7 +49,7 @@ public class EnumModelsTest {
         try {
             enums.get("no.such.ClassExists");
             fail();
-        } catch (TemplateModelException ex) {
+        } catch (TemplateException ex) {
             assertTrue(ex.getCause() instanceof ClassNotFoundException);
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/ErrorMessagesTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/ErrorMessagesTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/ErrorMessagesTest.java
index 89b06be..e582a87 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/ErrorMessagesTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/ErrorMessagesTest.java
@@ -26,9 +26,9 @@ import java.util.Date;
 
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.NonTemplateCallPlace;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
 import org.apache.freemarker.core.outputformat.impl.TemplateHTMLOutputModel;
@@ -37,13 +37,13 @@ import org.junit.Test;
 public class ErrorMessagesTest {
 
     @Test
-    public void getterMessage() throws TemplateModelException {
+    public void getterMessage() throws TemplateException {
         DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
         TemplateHashModel thm= (TemplateHashModel) ow.wrap(new TestBean());
         
         try {
             thm.get("foo");
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             e.printStackTrace();
             final String msg = e.getMessage();
             assertThat(msg, containsString("\"foo\""));
@@ -64,7 +64,7 @@ public class ErrorMessagesTest {
             try {
                 m.execute(new TemplateModel[] { html }, NonTemplateCallPlace.INSTANCE);
                 fail();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 assertThat(e.getMessage(), allOf(
                         containsString("String"), containsString("convert"), containsString("markupOutput"),
                         containsString("Tip:"), containsString("?markupString")));
@@ -76,7 +76,7 @@ public class ErrorMessagesTest {
             try {
                 m.execute(new TemplateModel[] { html }, NonTemplateCallPlace.INSTANCE);
                 fail();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 assertThat(e.getMessage(), allOf(
                         containsString("Date"), containsString("convert"), containsString("markupOutput"),
                         not(containsString("?markupString"))));
@@ -88,7 +88,7 @@ public class ErrorMessagesTest {
             try {
                 m.execute(new TemplateModel[] { html }, NonTemplateCallPlace.INSTANCE);
                 fail();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 assertThat(e.getMessage(), allOf(
                         containsString("No compatible overloaded"),
                         containsString("String"), containsString("markupOutput"),
@@ -101,7 +101,7 @@ public class ErrorMessagesTest {
             try {
                 m.execute(new TemplateModel[] { html }, NonTemplateCallPlace.INSTANCE);
                 fail();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 assertThat(e.getMessage(), allOf(
                         containsString("No compatible overloaded"),
                         containsString("Integer"), containsString("markupOutput"),
@@ -161,7 +161,7 @@ public class ErrorMessagesTest {
             return s;
         }
 
-        public String mOverloaded4(TemplateHTMLOutputModel s) throws TemplateModelException {
+        public String mOverloaded4(TemplateHTMLOutputModel s) throws TemplateException {
             return s.getOutputFormat().getMarkupString(s);
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/FineTuneMethodAppearanceTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/FineTuneMethodAppearanceTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/FineTuneMethodAppearanceTest.java
index e5366f6..b1cf265 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/FineTuneMethodAppearanceTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/FineTuneMethodAppearanceTest.java
@@ -22,9 +22,9 @@ package org.apache.freemarker.core.model.impl;
 import static org.junit.Assert.*;
 
 import org.apache.freemarker.core.Configuration;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,7 +34,7 @@ import org.junit.runners.JUnit4;
 public class FineTuneMethodAppearanceTest {
 
     @Test
-    public void newWayOfConfiguring() throws TemplateModelException {
+    public void newWayOfConfiguring() throws TemplateException {
         DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0)
                 .methodAppearanceFineTuner(GetlessMethodsAsPropertyGettersRule.INSTANCE)
                 .exposeFields(true)
@@ -42,7 +42,7 @@ public class FineTuneMethodAppearanceTest {
         checkIfProperlyWrapped(ow.wrap(new C()));
     }
     
-    private void checkIfProperlyWrapped(TemplateModel tm) throws TemplateModelException {
+    private void checkIfProperlyWrapped(TemplateModel tm) throws TemplateException {
         TemplateHashModel thm = (TemplateHashModel) tm;
         assertEquals("v1", ((TemplateScalarModel) thm.get("v1")).getAsString());
         assertEquals("v2()", ((TemplateScalarModel) thm.get("v2")).getAsString());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelObjectIntrospectionTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelObjectIntrospectionTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelObjectIntrospectionTest.java
index 4f4c0a1..b432921 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelObjectIntrospectionTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelObjectIntrospectionTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.freemarker.core.model.impl;
 
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 public class PrallelObjectIntrospectionTest extends AbstractParallelIntrospectionTest {
 
@@ -34,8 +34,7 @@ public class PrallelObjectIntrospectionTest extends AbstractParallelIntrospectio
     }
     
     @Override
-    protected TemplateHashModel getWrappedEntity(int objIdx)
-    throws TemplateModelException {
+    protected TemplateHashModel getWrappedEntity(int objIdx) throws ObjectWrappingException {
         return (TemplateHashModel) getObjectWrapper().wrap(
                 ManyObjectsOfDifferentClasses.OBJECTS[objIdx]);
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelStaticIntrospectionTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelStaticIntrospectionTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelStaticIntrospectionTest.java
index 836d559..c56803d 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelStaticIntrospectionTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/PrallelStaticIntrospectionTest.java
@@ -19,8 +19,8 @@
 
 package org.apache.freemarker.core.model.impl;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 public class PrallelStaticIntrospectionTest extends AbstractParallelIntrospectionTest {
 
@@ -38,7 +38,7 @@ public class PrallelStaticIntrospectionTest extends AbstractParallelIntrospectio
     
     @Override
     protected TemplateHashModel getWrappedEntity(int clIdx)
-    throws TemplateModelException {
+    throws TemplateException {
         return (TemplateHashModel) getObjectWrapper().getStaticModels().get(
                 STATICS_CLASS_CONTAINER_CLASS_NAME + "$C"
                 + clIdx);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapperTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapperTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapperTest.java
index 1033340..4115cfb 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapperTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapperTest.java
@@ -39,12 +39,12 @@ import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateCollectionModelEx;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -58,7 +58,7 @@ import org.xml.sax.SAXException;
 public class RestrictedObjectWrapperTest {
 
     @Test
-    public void testBasics() throws TemplateModelException {
+    public void testBasics() throws TemplateException {
         PostConstruct.class.toString();
         RestrictedObjectWrapper ow = new RestrictedObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
         testCustomizationCommonPart(ow);
@@ -69,7 +69,7 @@ public class RestrictedObjectWrapperTest {
     }
 
     @SuppressWarnings("boxing")
-    private void testCustomizationCommonPart(RestrictedObjectWrapper ow) throws TemplateModelException {
+    private void testCustomizationCommonPart(RestrictedObjectWrapper ow) throws TemplateException {
         assertTrue(ow.wrap("x") instanceof SimpleScalar);
         assertTrue(ow.wrap(1.5) instanceof SimpleNumber);
         assertTrue(ow.wrap(new Date()) instanceof SimpleDate);
@@ -78,13 +78,13 @@ public class RestrictedObjectWrapperTest {
         try {
             ow.wrap(new TestBean());
             fail();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsStringIgnoringCase("type"));
         }
     }
 
     @Test
-    public void testDoesNotAllowAPIBuiltin() throws TemplateModelException {
+    public void testDoesNotAllowAPIBuiltin() throws TemplateException {
         RestrictedObjectWrapper sow = new RestrictedObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
 
         TemplateModelWithAPISupport map = (TemplateModelWithAPISupport) sow.wrap(new HashMap());
@@ -98,7 +98,7 @@ public class RestrictedObjectWrapperTest {
 
     @SuppressWarnings("boxing")
     @Test
-    public void testCanWrapBasicTypes() throws TemplateModelException {
+    public void testCanWrapBasicTypes() throws ObjectWrappingException {
         RestrictedObjectWrapper sow = new RestrictedObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
         assertTrue(sow.wrap("s") instanceof TemplateScalarModel);
         assertTrue(sow.wrap(1) instanceof TemplateNumberModel);
@@ -113,8 +113,7 @@ public class RestrictedObjectWrapperTest {
     }
 
     @Test
-    public void testWontWrapDOM() throws SAXException, IOException, ParserConfigurationException,
-            TemplateModelException {
+    public void testWontWrapDOM() throws SAXException, IOException, ParserConfigurationException, TemplateException {
         DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
         InputSource is = new InputSource();
         is.setCharacterStream(new StringReader("<doc><sub a='1' /></doc>"));
@@ -124,7 +123,7 @@ public class RestrictedObjectWrapperTest {
         try {
             sow.wrap(doc);
             fail();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsString("won't wrap"));
         }
     }
@@ -135,7 +134,7 @@ public class RestrictedObjectWrapperTest {
         try {
             sow.wrap(new File("/x"));
             fail();
-        } catch (TemplateModelException e) {
+        } catch (ObjectWrappingException e) {
             assertThat(e.getMessage(), containsString("won't wrap"));
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/StaticModelsTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/StaticModelsTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/StaticModelsTest.java
index 241b349..d561ed4 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/StaticModelsTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/model/impl/StaticModelsTest.java
@@ -24,11 +24,11 @@ import static org.junit.Assert.*;
 
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.NonTemplateCallPlace;
-import org.apache.freemarker.core.util.CallableUtils;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
+import org.apache.freemarker.core.util.CallableUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -48,14 +48,14 @@ public class StaticModelsTest {
         try {
             s.get("x");
             fail();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertThat(e.getMessage(), containsString("No such key"));
         }
         
         try {
             statics.get("no.such.ClassExists");
             fail();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             assertTrue(e.getCause() instanceof ClassNotFoundException);
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormatTest.java
index 19e45de..5e77ee8 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormatTest.java
@@ -23,7 +23,7 @@ import static org.junit.Assert.*;
 import java.io.IOException;
 import java.io.StringWriter;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
 import org.apache.freemarker.core.outputformat._OutputFormatTestAPI;
 import org.junit.Test; 
@@ -42,7 +42,7 @@ public class CombinedMarkupOutputFormatTest {
     }
     
     @Test
-    public void testOutputMO() throws TemplateModelException, IOException {
+    public void testOutputMO() throws TemplateException, IOException {
        StringWriter out = new StringWriter();
        
        HTML_RTF.output(HTML_RTF.fromMarkup("<pre>\\par Test "), out);
@@ -61,7 +61,7 @@ public class CombinedMarkupOutputFormatTest {
     }
 
     @Test
-    public void testOutputMO2() throws TemplateModelException, IOException {
+    public void testOutputMO2() throws TemplateException, IOException {
        StringWriter out = new StringWriter();
        
        XML_XML.output(XML_XML.fromMarkup("<pre>&lt;p&gt; Test "), out);
@@ -76,7 +76,7 @@ public class CombinedMarkupOutputFormatTest {
     }
 
     @Test
-    public void testOutputMO3() throws TemplateModelException, IOException {
+    public void testOutputMO3() throws TemplateException, IOException {
         MarkupOutputFormat outputFormat = new CombinedMarkupOutputFormat(
                 RTFOutputFormat.INSTANCE,
                 new CombinedMarkupOutputFormat(RTFOutputFormat.INSTANCE, RTFOutputFormat.INSTANCE));
@@ -92,7 +92,7 @@ public class CombinedMarkupOutputFormatTest {
     }
     
     @Test
-    public void testOutputString() throws TemplateModelException, IOException {
+    public void testOutputString() throws TemplateException, IOException {
         StringWriter out = new StringWriter();
         
         HTML_RTF.output("a", out);
@@ -103,7 +103,7 @@ public class CombinedMarkupOutputFormatTest {
     }
     
     @Test
-    public void testOutputString2() throws TemplateModelException, IOException {
+    public void testOutputString2() throws TemplateException, IOException {
         StringWriter out = new StringWriter();
         
         XML_XML.output("a", out);
@@ -114,7 +114,7 @@ public class CombinedMarkupOutputFormatTest {
     }
     
     @Test
-    public void testFromPlainTextByEscaping() throws TemplateModelException {
+    public void testFromPlainTextByEscaping() throws TemplateException {
         String plainText = "a\\b&c";
         TemplateCombinedMarkupOutputModel mo = HTML_RTF.fromPlainTextByEscaping(plainText);
         assertSame(plainText, _OutputFormatTestAPI.getPlainTextContent(mo));
@@ -122,7 +122,7 @@ public class CombinedMarkupOutputFormatTest {
     }
 
     @Test
-    public void testFromMarkup() throws TemplateModelException {
+    public void testFromMarkup() throws TemplateException {
         String markup = "a \\par <b>";
         TemplateCombinedMarkupOutputModel mo = HTML_RTF.fromMarkup(markup);
         assertSame(markup, _OutputFormatTestAPI.getMarkupContent(mo));
@@ -130,7 +130,7 @@ public class CombinedMarkupOutputFormatTest {
     }
     
     @Test
-    public void testGetMarkup() throws TemplateModelException {
+    public void testGetMarkup() throws TemplateException {
         {
             String markup = "a \\par <b>";
             TemplateCombinedMarkupOutputModel mo = HTML_RTF.fromMarkup(markup);
@@ -169,7 +169,7 @@ public class CombinedMarkupOutputFormatTest {
     }
     
     @Test
-    public void testEscaplePlainText() throws TemplateModelException {
+    public void testEscaplePlainText() throws TemplateException {
         assertEquals("", HTML_RTF.escapePlainText(""));
         assertEquals("a", HTML_RTF.escapePlainText("a"));
         assertEquals("\\{a\\\\b&amp;\\}", HTML_RTF.escapePlainText("{a\\b&}"));

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormatTest.java
index 2199179..709ca1d 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormatTest.java
@@ -24,7 +24,7 @@ import static org.junit.Assert.*;
 import java.io.IOException;
 import java.io.StringWriter;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 import org.apache.freemarker.core.outputformat._OutputFormatTestAPI;
 import org.junit.Test; 
@@ -35,7 +35,7 @@ import org.junit.Test;
 public class HTMLOutputFormatTest {
     
     @Test
-    public void testOutputMO() throws TemplateModelException, IOException {
+    public void testOutputMO() throws TemplateException, IOException {
        StringWriter out = new StringWriter();
        
        INSTANCE.output(INSTANCE.fromMarkup("<p>Test "), out);
@@ -57,7 +57,7 @@ public class HTMLOutputFormatTest {
     }
     
     @Test
-    public void testOutputString() throws TemplateModelException, IOException {
+    public void testOutputString() throws TemplateException, IOException {
         StringWriter out = new StringWriter();
         
         INSTANCE.output("a", out);
@@ -68,7 +68,7 @@ public class HTMLOutputFormatTest {
     }
     
     @Test
-    public void testFromPlainTextByEscaping() throws TemplateModelException {
+    public void testFromPlainTextByEscaping() throws TemplateException {
         String plainText = "a&b";
         TemplateHTMLOutputModel mo = INSTANCE.fromPlainTextByEscaping(plainText);
         assertSame(plainText, _OutputFormatTestAPI.getPlainTextContent(mo));
@@ -76,7 +76,7 @@ public class HTMLOutputFormatTest {
     }
 
     @Test
-    public void testFromMarkup() throws TemplateModelException {
+    public void testFromMarkup() throws TemplateException {
         String markup = "a&amp;b";
         TemplateHTMLOutputModel mo = INSTANCE.fromMarkup(markup);
         assertSame(markup, _OutputFormatTestAPI.getMarkupContent(mo));
@@ -84,7 +84,7 @@ public class HTMLOutputFormatTest {
     }
     
     @Test
-    public void testGetMarkup() throws TemplateModelException {
+    public void testGetMarkup() throws TemplateException {
         {
             String markup = "a&amp;b";
             TemplateHTMLOutputModel mo = INSTANCE.fromMarkup(markup);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormatTest.java
index 13563f5..69a0a41 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormatTest.java
@@ -24,14 +24,14 @@ import static org.junit.Assert.*;
 import java.io.IOException;
 import java.io.StringWriter;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat._OutputFormatTestAPI;
 import org.junit.Test; 
 
 public class RTFOutputFormatTest {
     
     @Test
-    public void testOutputMO() throws TemplateModelException, IOException {
+    public void testOutputMO() throws TemplateException, IOException {
        StringWriter out = new StringWriter();
        
        INSTANCE.output(INSTANCE.fromMarkup("\\par Test "), out);
@@ -50,7 +50,7 @@ public class RTFOutputFormatTest {
     }
     
     @Test
-    public void testOutputString() throws TemplateModelException, IOException {
+    public void testOutputString() throws TemplateException, IOException {
         StringWriter out = new StringWriter();
         
         INSTANCE.output("a", out);
@@ -61,7 +61,7 @@ public class RTFOutputFormatTest {
     }
     
     @Test
-    public void testFromPlainTextByEscaping() throws TemplateModelException {
+    public void testFromPlainTextByEscaping() throws TemplateException {
         String plainText = "a\\b";
         TemplateRTFOutputModel mo = INSTANCE.fromPlainTextByEscaping(plainText);
         assertSame(plainText, _OutputFormatTestAPI.getPlainTextContent(mo));
@@ -69,7 +69,7 @@ public class RTFOutputFormatTest {
     }
 
     @Test
-    public void testFromMarkup() throws TemplateModelException {
+    public void testFromMarkup() throws TemplateException {
         String markup = "a \\par b";
         TemplateRTFOutputModel mo = INSTANCE.fromMarkup(markup);
         assertSame(markup, _OutputFormatTestAPI.getMarkupContent(mo));
@@ -77,7 +77,7 @@ public class RTFOutputFormatTest {
     }
     
     @Test
-    public void testGetMarkup() throws TemplateModelException {
+    public void testGetMarkup() throws TemplateException {
         {
             String markup = "a \\par b";
             TemplateRTFOutputModel mo = INSTANCE.fromMarkup(markup);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 efde933..61b937b 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
@@ -21,12 +21,12 @@ package org.apache.freemarker.core.templatesuite.models;
 
 import java.util.Date;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -45,12 +45,12 @@ public class AllTemplateModels implements
     private final TemplateModelIterator EMPTY_ITERATOR = new TemplateModelIterator() {
 
         @Override
-        public TemplateModel next() throws TemplateModelException {
+        public TemplateModel next() throws TemplateException {
             return null;
         }
 
         @Override
-        public boolean hasNext() throws TemplateModelException {
+        public boolean hasNext() throws TemplateException {
             return false;
         }
         
@@ -59,53 +59,53 @@ public class AllTemplateModels implements
     private final TemplateCollectionModel EMPTY_COLLECTION = new TemplateCollectionModel() {
 
         @Override
-        public TemplateModelIterator iterator() throws TemplateModelException {
+        public TemplateModelIterator iterator() throws TemplateException {
             return EMPTY_ITERATOR;
         }
     };
     
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         return new SimpleScalar("value for key " + key);
     }
 
     @Override
-    public boolean isEmpty() throws TemplateModelException {
+    public boolean isEmpty() throws TemplateException {
         return true;
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return EMPTY_ITERATOR;
     }
 
     @Override
-    public TemplateModel get(int index) throws TemplateModelException {
+    public TemplateModel get(int index) throws TemplateException {
         return null;
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return 0;
     }
 
     @Override
-    public TemplateCollectionModel keys() throws TemplateModelException {
+    public TemplateCollectionModel keys() throws TemplateException {
         return EMPTY_COLLECTION;
     }
 
     @Override
-    public TemplateCollectionModel values() throws TemplateModelException {
+    public TemplateCollectionModel values() throws TemplateException {
         return EMPTY_COLLECTION;
     }
 
     @Override
-    public boolean getAsBoolean() throws TemplateModelException {
+    public boolean getAsBoolean() throws TemplateException {
         return true;
     }
 
     @Override
-    public Date getAsDate() throws TemplateModelException {
+    public Date getAsDate() throws TemplateException {
         return new Date(0);
     }
 
@@ -116,12 +116,12 @@ public class AllTemplateModels implements
 
     @Override
     @SuppressWarnings("boxing")
-    public Number getAsNumber() throws TemplateModelException {
+    public Number getAsNumber() throws TemplateException {
         return 1;
     }
 
     @Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() throws TemplateException {
         return "s";
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndScalarModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndScalarModel.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndScalarModel.java
index 12e5f3d..340fe61 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndScalarModel.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndScalarModel.java
@@ -19,8 +19,8 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 
 public class BooleanAndScalarModel implements TemplateBooleanModel, TemplateScalarModel {
@@ -28,12 +28,12 @@ public class BooleanAndScalarModel implements TemplateBooleanModel, TemplateScal
     public static final BooleanAndScalarModel INSTANCE = new BooleanAndScalarModel();
 
     @Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() throws TemplateException {
         return "s";
     }
 
     @Override
-    public boolean getAsBoolean() throws TemplateModelException {
+    public boolean getAsBoolean() throws TemplateException {
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndStringTemplateModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndStringTemplateModel.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndStringTemplateModel.java
index accf649..f424786 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndStringTemplateModel.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanAndStringTemplateModel.java
@@ -19,19 +19,19 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 
 public class BooleanAndStringTemplateModel implements TemplateBooleanModel, TemplateScalarModel {
 
     @Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() throws TemplateException {
         return "theStringValue";
     }
 
     @Override
-    public boolean getAsBoolean() throws TemplateModelException {
+    public boolean getAsBoolean() throws TemplateException {
         return true;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList1.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList1.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList1.java
index 5022f68..8f3c3fd 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList1.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList1.java
@@ -19,10 +19,10 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.SimpleSequence;
 
@@ -50,7 +50,7 @@ public class BooleanList1 implements TemplateSequenceModel {
      * @return the specified index in the list
      */
     @Override
-    public TemplateModel get(int i) throws TemplateModelException {
+    public TemplateModel get(int i) throws TemplateException {
         return cList.get(i);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList2.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList2.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList2.java
index 2d7667e..3911deb 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList2.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/BooleanList2.java
@@ -19,9 +19,9 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.SimpleSequence;
 
@@ -42,7 +42,7 @@ public class BooleanList2 implements TemplateSequenceModel {
      * @return the specified index in the list
      */
     @Override
-    public TemplateModel get(int i) throws TemplateModelException {
+    public TemplateModel get(int i) throws TemplateException {
         return cList.get(i);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/ExceptionModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/ExceptionModel.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/ExceptionModel.java
index 940579a..445c95e 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/ExceptionModel.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/ExceptionModel.java
@@ -19,7 +19,7 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 
 /**
@@ -33,7 +33,7 @@ public class ExceptionModel implements TemplateScalarModel {
      * @return the String value of this scalar.
      */
     @Override
-    public String getAsString () throws TemplateModelException {
-        throw new TemplateModelException( "Throwing from ExceptionModel!" );
+    public String getAsString () throws TemplateException {
+        throw new TemplateException( "Throwing from ExceptionModel!" );
     }
 }


[6/7] incubator-freemarker git commit: `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extend

Posted by dd...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndScalarModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndScalarModel.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndScalarModel.java
index a5869a2..37f93a5 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndScalarModel.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/HashAndScalarModel.java
@@ -19,10 +19,10 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -34,16 +34,16 @@ public class HashAndScalarModel implements TemplateHashModelEx, TemplateScalarMo
     private final TemplateCollectionModel EMPTY_COLLECTION = new TemplateCollectionModel() {
 
         @Override
-        public TemplateModelIterator iterator() throws TemplateModelException {
+        public TemplateModelIterator iterator() throws TemplateException {
             return new TemplateModelIterator() {
 
                 @Override
-                public TemplateModel next() throws TemplateModelException {
+                public TemplateModel next() throws TemplateException {
                     return null;
                 }
 
                 @Override
-                public boolean hasNext() throws TemplateModelException {
+                public boolean hasNext() throws TemplateException {
                     return false;
                 }
                 
@@ -52,32 +52,32 @@ public class HashAndScalarModel implements TemplateHashModelEx, TemplateScalarMo
     };
 
     @Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() throws TemplateException {
         return "scalarValue";
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         return new SimpleScalar("mapValue for " + key);
     }
 
     @Override
-    public boolean isEmpty() throws TemplateModelException {
+    public boolean isEmpty() throws TemplateException {
         return true;
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return 0;
     }
 
     @Override
-    public TemplateCollectionModel keys() throws TemplateModelException {
+    public TemplateCollectionModel keys() throws TemplateException {
         return EMPTY_COLLECTION;
     }
 
     @Override
-    public TemplateCollectionModel values() throws TemplateModelException {
+    public TemplateCollectionModel values() throws TemplateException {
         return EMPTY_COLLECTION;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java
index 55d06d5..700af44 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/Listables.java
@@ -29,12 +29,13 @@ import java.util.Set;
 import java.util.TreeSet;
 
 import org.apache.freemarker.core.Configuration;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
 import org.apache.freemarker.core.model.impl.DefaultMapAdapter;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
@@ -107,7 +108,7 @@ public class Listables {
         return Collections.<Integer>emptySet().iterator();
     }
     
-    public List<TemplateHashModelEx2> getHashEx2s() throws TemplateModelException {
+    public List<TemplateHashModelEx2> getHashEx2s() throws TemplateException {
         Map<Object, Object> map;
         map = new LinkedHashMap<>();
         map.put("k1", "v1");
@@ -120,7 +121,7 @@ public class Listables {
         return getMapsWrappedAsEx2(map);
     }
 
-    public List<? extends TemplateHashModelEx> getEmptyHashes() throws TemplateModelException {
+    public List<? extends TemplateHashModelEx> getEmptyHashes() throws ObjectWrappingException {
         List<TemplateHashModelEx> emptyMaps = new ArrayList<>();
         emptyMaps.addAll(getMapsWrappedAsEx2(Collections.emptyMap()));
         emptyMaps.add((TemplateHashModelEx) new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build()
@@ -131,7 +132,7 @@ public class Listables {
     /**
      * Returns the map wrapped on various ways.
      */
-    private List<TemplateHashModelEx2> getMapsWrappedAsEx2(Map<?, ?> map) throws TemplateModelException {
+    private List<TemplateHashModelEx2> getMapsWrappedAsEx2(Map<?, ?> map) throws ObjectWrappingException {
         List<TemplateHashModelEx2> maps = new ArrayList<>();
         
         DefaultObjectWrapper ow = new DefaultObjectWrapper.Builder(Configuration.VERSION_3_0_0).build();
@@ -156,7 +157,7 @@ public class Listables {
         }
         
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) throws TemplateException {
             return wrap(map.get(key));
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel1.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel1.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel1.java
index ce04928..4a0ac53 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel1.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel1.java
@@ -20,10 +20,10 @@
 package org.apache.freemarker.core.templatesuite.models;
 
 import org.apache.freemarker.core.Configuration;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
@@ -95,7 +95,7 @@ public class MultiModel1 implements TemplateHashModel,
      * @return the specified index in the list
      */
     @Override
-    public TemplateModel get(int i) throws TemplateModelException {
+    public TemplateModel get(int i) throws TemplateException {
         return m_cListModel.get( i );
     }
 
@@ -110,7 +110,7 @@ public class MultiModel1 implements TemplateHashModel,
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return m_cListModel.size();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel4.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel4.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel4.java
index a5fb8e5..30118d0 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel4.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel4.java
@@ -19,10 +19,10 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.apache.freemarker.core.model.impl.SimpleSequence;
@@ -42,7 +42,7 @@ public class MultiModel4 implements TemplateSequenceModel, TemplateHashModel {
      * @return the specified index in the list
      */
     @Override
-    public TemplateModel get(int i) throws TemplateModelException {
+    public TemplateModel get(int i) throws TemplateException {
         return m_cList.get( i );
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel5.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel5.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel5.java
index f08fb8c..e7f0a94 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel5.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/MultiModel5.java
@@ -19,10 +19,10 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.apache.freemarker.core.model.impl.SimpleSequence;
@@ -44,7 +44,7 @@ public class MultiModel5 implements TemplateSequenceModel, TemplateHashModel {
      * @return the specified index in the list
      */
     @Override
-    public TemplateModel get(int i) throws TemplateModelException {
+    public TemplateModel get(int i) throws TemplateException {
         return m_cList.get( i );
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/NumberAndStringModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/NumberAndStringModel.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/NumberAndStringModel.java
index cc4eec1..aae9abd 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/NumberAndStringModel.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/NumberAndStringModel.java
@@ -19,7 +19,6 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 
@@ -34,13 +33,13 @@ public class NumberAndStringModel implements TemplateNumberModel,
 	}
 
 	@Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() {
 		return s;
 	}
 
 	@Override
     @SuppressWarnings("boxing")
-    public Number getAsNumber() throws TemplateModelException {
+    public Number getAsNumber() {
 		return s.length();
 	}
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedConstructor.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedConstructor.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedConstructor.java
index f8da268..c442cfb 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedConstructor.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedConstructor.java
@@ -19,7 +19,6 @@
 
 package org.apache.freemarker.core.templatesuite.models;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 
 public class OverloadedConstructor implements TemplateScalarModel {
@@ -39,7 +38,7 @@ public class OverloadedConstructor implements TemplateScalarModel {
     }
     
     @Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() {
         return value;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedMethods2.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedMethods2.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedMethods2.java
index 495a72e..4e12135 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedMethods2.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/OverloadedMethods2.java
@@ -30,11 +30,12 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
 import org.apache.freemarker.core.model.impl.RationalNumber;
@@ -873,7 +874,7 @@ public class OverloadedMethods2 {
         return listList;
     }
 
-    public List getJavaStringSequenceList() throws TemplateModelException {
+    public List getJavaStringSequenceList() throws ObjectWrappingException {
         ObjectWrapper ow = Environment.getCurrentEnvironment().getObjectWrapper();
         
         List listList = new ArrayList();
@@ -1027,7 +1028,7 @@ public class OverloadedMethods2 {
         }
 
         @Override
-        public Number getAsNumber() throws TemplateModelException {
+        public Number getAsNumber() throws TemplateException {
             return Integer.valueOf(122);
         }
         
@@ -1036,7 +1037,7 @@ public class OverloadedMethods2 {
     private static class MyWrapperNumberModel implements TemplateNumberModel, WrapperTemplateModel {
 
         @Override
-        public Number getAsNumber() throws TemplateModelException {
+        public Number getAsNumber() throws TemplateException {
             return Integer.valueOf(122);
         }
 
@@ -1055,7 +1056,7 @@ public class OverloadedMethods2 {
         }
 
         @Override
-        public boolean getAsBoolean() throws TemplateModelException {
+        public boolean getAsBoolean() throws TemplateException {
             return true;
         }
         
@@ -1069,7 +1070,7 @@ public class OverloadedMethods2 {
         }
 
         @Override
-        public boolean getAsBoolean() throws TemplateModelException {
+        public boolean getAsBoolean() throws TemplateException {
             return false;
         }
         
@@ -1087,7 +1088,7 @@ public class OverloadedMethods2 {
         }
 
         @Override
-        public boolean getAsBoolean() throws TemplateModelException {
+        public boolean getAsBoolean() throws TemplateException {
             return false;
         }
         
@@ -1101,7 +1102,7 @@ public class OverloadedMethods2 {
         }
 
         @Override
-        public boolean getAsBoolean() throws TemplateModelException {
+        public boolean getAsBoolean() throws TemplateException {
             return true;
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/SimpleMapAndCollectionObjectWrapper.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/SimpleMapAndCollectionObjectWrapper.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/SimpleMapAndCollectionObjectWrapper.java
index 7992b1e..8c8dd76 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/SimpleMapAndCollectionObjectWrapper.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/templatesuite/models/SimpleMapAndCollectionObjectWrapper.java
@@ -23,8 +23,8 @@ import java.util.Collection;
 import java.util.Map;
 
 import org.apache.freemarker.core.Version;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.SimpleHash;
 import org.apache.freemarker.core.model.impl.SimpleSequence;
@@ -40,7 +40,7 @@ public class SimpleMapAndCollectionObjectWrapper extends DefaultObjectWrapper {
     }
 
     @Override
-    public TemplateModel wrap(Object obj) throws TemplateModelException {
+    public TemplateModel wrap(Object obj) throws ObjectWrappingException {
         if (obj == null) {
             return super.wrap(null);
         }        

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/AppMetaTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/AppMetaTemplateDateFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/AppMetaTemplateDateFormatFactory.java
index 1d69dd8..02fb904 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/AppMetaTemplateDateFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/AppMetaTemplateDateFormatFactory.java
@@ -23,8 +23,8 @@ import java.util.Locale;
 import java.util.TimeZone;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.valueformat.InvalidFormatParametersException;
 import org.apache.freemarker.core.valueformat.TemplateDateFormat;
 import org.apache.freemarker.core.valueformat.TemplateDateFormatFactory;
@@ -56,7 +56,7 @@ public class AppMetaTemplateDateFormatFactory extends TemplateDateFormatFactory
         
         @Override
         public String formatToPlainText(TemplateDateModel dateModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             String result = String.valueOf(TemplateFormatUtil.getNonNullDate(dateModel).getTime());
             if (dateModel instanceof AppMetaTemplateDateModel) {
                 result += "/" + ((AppMetaTemplateDateModel) dateModel).getAppMeta(); 
@@ -111,7 +111,7 @@ public class AppMetaTemplateDateFormatFactory extends TemplateDateFormatFactory
         }
 
         @Override
-        public Date getAsDate() throws TemplateModelException {
+        public Date getAsDate() throws TemplateException {
             return date;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/BaseNTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/BaseNTemplateNumberFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/BaseNTemplateNumberFormatFactory.java
index aa5d4db..e1a8a78 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/BaseNTemplateNumberFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/BaseNTemplateNumberFormatFactory.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.userpkg;
 import java.util.Locale;
 
 import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.util._NumberUtils;
 import org.apache.freemarker.core.util._StringUtils;
@@ -98,7 +98,7 @@ public class BaseNTemplateNumberFormatFactory extends TemplateNumberFormatFactor
         
         @Override
         public String formatToPlainText(TemplateNumberModel numberModel)
-                throws TemplateModelException, TemplateValueFormatException {
+                throws TemplateException, TemplateValueFormatException {
             Number n = TemplateFormatUtil.getNonNullNumber(numberModel);
             try {
                 return Integer.toString(_NumberUtils.toIntExact(n), base);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/CustomHTMLOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/CustomHTMLOutputFormat.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/CustomHTMLOutputFormat.java
index a8576bd..a2396f6 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/CustomHTMLOutputFormat.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/CustomHTMLOutputFormat.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core.userpkg;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 import org.apache.freemarker.core.util._StringUtils;
 
@@ -47,7 +46,7 @@ public final class CustomHTMLOutputFormat extends CommonMarkupOutputFormat<Custo
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException {
         // This is lazy - don't do it in reality.
         out.write(escapePlainText(textToEsc));
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/DummyOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/DummyOutputFormat.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/DummyOutputFormat.java
index f368969..edafa0e 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/DummyOutputFormat.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/DummyOutputFormat.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core.userpkg;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 
 public class DummyOutputFormat extends CommonMarkupOutputFormat<TemplateDummyOutputModel> {
@@ -43,7 +42,7 @@ public class DummyOutputFormat extends CommonMarkupOutputFormat<TemplateDummyOut
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException {
         out.write(escapePlainText(textToEsc));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisDivTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisDivTemplateDateFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisDivTemplateDateFormatFactory.java
index be06442..9a84d1f 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisDivTemplateDateFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisDivTemplateDateFormatFactory.java
@@ -23,8 +23,8 @@ import java.util.Locale;
 import java.util.TimeZone;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util._StringUtils;
 import org.apache.freemarker.core.valueformat.InvalidFormatParametersException;
 import org.apache.freemarker.core.valueformat.TemplateDateFormat;
@@ -69,7 +69,7 @@ public class EpochMillisDivTemplateDateFormatFactory extends TemplateDateFormatF
         
         @Override
         public String formatToPlainText(TemplateDateModel dateModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             return String.valueOf(TemplateFormatUtil.getNonNullDate(dateModel).getTime() / divisor);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisTemplateDateFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisTemplateDateFormatFactory.java
index 9f27095..c2fefef 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisTemplateDateFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/EpochMillisTemplateDateFormatFactory.java
@@ -23,8 +23,8 @@ import java.util.Locale;
 import java.util.TimeZone;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.valueformat.InvalidFormatParametersException;
 import org.apache.freemarker.core.valueformat.TemplateDateFormat;
 import org.apache.freemarker.core.valueformat.TemplateDateFormatFactory;
@@ -59,7 +59,7 @@ public class EpochMillisTemplateDateFormatFactory extends TemplateDateFormatFact
         
         @Override
         public String formatToPlainText(TemplateDateModel dateModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             return String.valueOf(TemplateFormatUtil.getNonNullDate(dateModel).getTime());
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HTMLISOTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HTMLISOTemplateDateFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HTMLISOTemplateDateFormatFactory.java
index 83e349f..7431526 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HTMLISOTemplateDateFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HTMLISOTemplateDateFormatFactory.java
@@ -23,8 +23,8 @@ import java.util.Locale;
 import java.util.TimeZone;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
 import org.apache.freemarker.core.util._DateUtils;
 import org.apache.freemarker.core.util._DateUtils.CalendarFieldsToDateConverter;
@@ -65,7 +65,7 @@ public class HTMLISOTemplateDateFormatFactory extends TemplateDateFormatFactory
         
         @Override
         public String formatToPlainText(TemplateDateModel dateModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             if (calendarFactory == null) {
                 calendarFactory = new _DateUtils.TrivialDateToISO8601CalendarFactory();
             }
@@ -98,7 +98,7 @@ public class HTMLISOTemplateDateFormatFactory extends TemplateDateFormatFactory
         }
 
         @Override
-        public Object format(TemplateDateModel dateModel) throws TemplateValueFormatException, TemplateModelException {
+        public Object format(TemplateDateModel dateModel) throws TemplateValueFormatException, TemplateException {
             return HTMLOutputFormat.INSTANCE.fromMarkup(
                     formatToPlainText(dateModel).replace("T", "<span class='T'>T</span>"));
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HexTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HexTemplateNumberFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HexTemplateNumberFormatFactory.java
index c1f34b4..6627b18 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HexTemplateNumberFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/HexTemplateNumberFormatFactory.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.userpkg;
 import java.util.Locale;
 
 import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.util._NumberUtils;
 import org.apache.freemarker.core.valueformat.InvalidFormatParametersException;
@@ -53,7 +53,7 @@ public class HexTemplateNumberFormatFactory extends TemplateNumberFormatFactory
         
         @Override
         public String formatToPlainText(TemplateNumberModel numberModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             Number n = TemplateFormatUtil.getNonNullNumber(numberModel);
             try {
                 return Integer.toHexString(_NumberUtils.toIntExact(n));

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocAndTZSensitiveTemplateDateFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocAndTZSensitiveTemplateDateFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocAndTZSensitiveTemplateDateFormatFactory.java
index 42b0401..378c3b0 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocAndTZSensitiveTemplateDateFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocAndTZSensitiveTemplateDateFormatFactory.java
@@ -23,8 +23,8 @@ import java.util.Locale;
 import java.util.TimeZone;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.valueformat.InvalidFormatParametersException;
 import org.apache.freemarker.core.valueformat.TemplateDateFormat;
 import org.apache.freemarker.core.valueformat.TemplateDateFormatFactory;
@@ -60,8 +60,9 @@ public class LocAndTZSensitiveTemplateDateFormatFactory extends TemplateDateForm
 
         @Override
         public String formatToPlainText(TemplateDateModel dateModel)
-                throws UnformattableValueException, TemplateModelException {
-            return String.valueOf(TemplateFormatUtil.getNonNullDate(dateModel).getTime() + "@" + locale + ":" + timeZone.getID());
+                throws UnformattableValueException, TemplateException {
+            return String.valueOf(
+                    TemplateFormatUtil.getNonNullDate(dateModel).getTime() + "@" + locale + ":" + timeZone.getID());
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocaleSensitiveTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocaleSensitiveTemplateNumberFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocaleSensitiveTemplateNumberFormatFactory.java
index dc3dae0..f8ee607 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocaleSensitiveTemplateNumberFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/LocaleSensitiveTemplateNumberFormatFactory.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.userpkg;
 import java.util.Locale;
 
 import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.valueformat.InvalidFormatParametersException;
 import org.apache.freemarker.core.valueformat.TemplateFormatUtil;
@@ -54,7 +54,7 @@ public class LocaleSensitiveTemplateNumberFormatFactory extends TemplateNumberFo
         
         @Override
         public String formatToPlainText(TemplateNumberModel numberModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             Number n = numberModel.getAsNumber();
             try {
                 return n + "_" + locale;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/NameClashingDummyOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/NameClashingDummyOutputFormat.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/NameClashingDummyOutputFormat.java
index dd26156..33d466e 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/NameClashingDummyOutputFormat.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/NameClashingDummyOutputFormat.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.userpkg;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 
 public class NameClashingDummyOutputFormat extends CommonMarkupOutputFormat<TemplateDummyOutputModel> {
@@ -43,7 +43,7 @@ public class NameClashingDummyOutputFormat extends CommonMarkupOutputFormat<Temp
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException, TemplateException {
         out.write(escapePlainText(textToEsc));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/PrintfGTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/PrintfGTemplateNumberFormatFactory.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/PrintfGTemplateNumberFormatFactory.java
index 7be09f7..c0fe6be 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/PrintfGTemplateNumberFormatFactory.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/PrintfGTemplateNumberFormatFactory.java
@@ -23,7 +23,7 @@ import java.math.BigInteger;
 import java.util.Locale;
 
 import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
 import org.apache.freemarker.core.util._StringUtils;
@@ -76,7 +76,7 @@ public class PrintfGTemplateNumberFormatFactory extends TemplateNumberFormatFact
         
         @Override
         public String formatToPlainText(TemplateNumberModel numberModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             final Number n = TemplateFormatUtil.getNonNullNumber(numberModel);
             
             // printf %G only accepts Double, BigDecimal and Float 
@@ -98,7 +98,7 @@ public class PrintfGTemplateNumberFormatFactory extends TemplateNumberFormatFact
 
         @Override
         public Object format(TemplateNumberModel numberModel)
-                throws UnformattableValueException, TemplateModelException {
+                throws UnformattableValueException, TemplateException {
             String strResult = formatToPlainText(numberModel);
             
             int expIdx = strResult.indexOf('E');

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/SeldomEscapedOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/SeldomEscapedOutputFormat.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/SeldomEscapedOutputFormat.java
index b8cab13..ccb63e4 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/SeldomEscapedOutputFormat.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/SeldomEscapedOutputFormat.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core.userpkg;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 
 public class SeldomEscapedOutputFormat extends CommonMarkupOutputFormat<TemplateSeldomEscapedOutputModel> {
@@ -43,7 +42,7 @@ public class SeldomEscapedOutputFormat extends CommonMarkupOutputFormat<Template
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException {
         out.write(escapePlainText(textToEsc));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/TestTemplateCallableModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/TestTemplateCallableModel.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/TestTemplateCallableModel.java
index 6b36cf8..b6bf7e5 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/TestTemplateCallableModel.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/userpkg/TestTemplateCallableModel.java
@@ -22,9 +22,9 @@ package org.apache.freemarker.core.userpkg;
 import java.io.IOException;
 import java.io.Writer;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateCallableModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
@@ -33,12 +33,12 @@ import org.apache.freemarker.core.util._StringUtils;
 
 public abstract class TestTemplateCallableModel implements TemplateCallableModel {
 
-    protected void printParam(String name, Object value, StringBuilder sb) throws TemplateModelException {
+    protected void printParam(String name, Object value, StringBuilder sb) throws TemplateException {
         printParam(name, value, sb, false);
     }
 
     protected void printParam(String name, Object value, StringBuilder sb, boolean first)
-            throws TemplateModelException {
+            throws TemplateException {
         if (!first) {
             sb.append(", ");
         }
@@ -47,18 +47,18 @@ public abstract class TestTemplateCallableModel implements TemplateCallableModel
         printValue(value, sb);
     }
 
-    protected void printParam(String name, Object value, Writer out) throws IOException, TemplateModelException {
+    protected void printParam(String name, Object value, Writer out) throws IOException, TemplateException {
         printParam(name, value, out, false);
     }
 
     protected void printParam(String name, Object value, Writer out, boolean first)
-            throws IOException, TemplateModelException {
+            throws IOException, TemplateException {
         StringBuilder sb = new StringBuilder();
         printParam(name, value, sb, first);
         out.write(sb.toString());
     }
 
-    private void printValue(Object value, StringBuilder sb) throws TemplateModelException {
+    private void printValue(Object value, StringBuilder sb) throws TemplateException {
         if (value == null) {
             sb.append("null");
         } else if (value instanceof TemplateNumberModel) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/java/org/apache/freemarker/core/valueformat/NumberFormatTest.java
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/java/org/apache/freemarker/core/valueformat/NumberFormatTest.java b/freemarker-core-test/src/test/java/org/apache/freemarker/core/valueformat/NumberFormatTest.java
index 685ce5a..3868493 100644
--- a/freemarker-core-test/src/test/java/org/apache/freemarker/core/valueformat/NumberFormatTest.java
+++ b/freemarker-core-test/src/test/java/org/apache/freemarker/core/valueformat/NumberFormatTest.java
@@ -29,16 +29,15 @@ import java.util.Collections;
 import java.util.Locale;
 import java.util.Map;
 
+import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.Template;
 import org.apache.freemarker.core.TemplateConfiguration;
 import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
 import org.apache.freemarker.core.templateresolver.ConditionalTemplateConfigurationFactory;
@@ -367,7 +366,7 @@ public class NumberFormatTest extends TemplateTest {
         }
 
         @Override
-        public Number getAsNumber() throws TemplateModelException {
+        public Number getAsNumber() throws TemplateException {
             return number;
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception.txt
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception.txt b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception.txt
index 0ea4395..e9a834f 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception.txt
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception.txt
@@ -25,7 +25,7 @@
 <p>A simple test follows:</p>
 
 <p>Hello, world! <br />
-freemarker.template.TemplateModelException: Throwing from ExceptionModel!
+freemarker.template.TemplateException: Throwing from ExceptionModel!
 	at freemarker.test.templatesuite.models.ExceptionModel.getAsString(ExceptionModel.java:57)
 	at freemarker.template.compiler.Expression.getStringValue(Expression.java:65)
 	at freemarker.template.compiler.DollarVariable.process(DollarVariable.java:62)

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception2.txt
----------------------------------------------------------------------
diff --git a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception2.txt b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception2.txt
index bf441d3..664ce56 100644
--- a/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception2.txt
+++ b/freemarker-core-test/src/test/resources/org/apache/freemarker/core/templatesuite/expected/exception2.txt
@@ -25,7 +25,7 @@
 <p>A simple test follows:</p>
 
 <p>Hello, world! <br />
-<!-- Template Error: Couldn't get value of variable test: Couldn't read string value of test: freemarker.template.TemplateModelException: Throwing from ExceptionModel!
+<!-- Template Error: Couldn't get value of variable test: Couldn't read string value of test: freemarker.template.TemplateException: Throwing from ExceptionModel!
 	at freemarker.test.templatesuite.models.ExceptionModel.getAsString(ExceptionModel.java:42)
 	at freemarker.template.expression.Variable.getValue(Variable.java:69)
 	at freemarker.template.instruction.VariableInstruction.process(VariableInstruction.java:55)

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
index 77fc8fa..d99a71d 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirCapturingAssignment.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.io.StringWriter;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
 import org.apache.freemarker.core.util.BugException;
@@ -75,7 +74,7 @@ final class ASTDirCapturingAssignment extends ASTDirective {
         return null;
     }
 
-    private TemplateModel capturedStringToModel(String s) throws TemplateModelException {
+    private TemplateModel capturedStringToModel(String s) throws TemplateException {
         return markupOutputFormat == null ? new SimpleScalar(s) : markupOutputFormat.fromMarkup(s);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirMacroOrFunction.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirMacroOrFunction.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirMacroOrFunction.java
index 344f86f..645aff4 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirMacroOrFunction.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDirMacroOrFunction.java
@@ -25,7 +25,6 @@ import java.util.List;
 
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.util.StringToIndexMap;
 import org.apache.freemarker.core.util._StringUtils;
@@ -272,7 +271,7 @@ final class ASTDirMacroOrFunction extends ASTDirective implements TemplateModel
          * or null if it doesn't exist.
          */ 
         @Override
-        public TemplateModel getLocalVariable(String name) throws TemplateModelException {
+        public TemplateModel getLocalVariable(String name) throws TemplateException {
              return localVars.get(name);
         }
 
@@ -288,7 +287,7 @@ final class ASTDirMacroOrFunction extends ASTDirective implements TemplateModel
         }
 
         @Override
-        public Collection<String> getLocalVariableNames() throws TemplateModelException {
+        public Collection<String> getLocalVariableNames() throws TemplateException {
             HashSet<String> result = new HashSet<>();
             for (TemplateModelIterator it = localVars.keys().iterator(); it.hasNext(); ) {
                 result.add(it.next().toString());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDollarInterpolation.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDollarInterpolation.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDollarInterpolation.java
index 46a46d2..80d7f6a 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDollarInterpolation.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTDollarInterpolation.java
@@ -23,7 +23,6 @@ import java.io.IOException;
 import java.io.Writer;
 
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.util.TemplateLanguageUtils;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java
index 79081e8..6667dd3 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpAddOrConcat.java
@@ -28,7 +28,6 @@ import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -119,7 +118,7 @@ final class ASTExpAddOrConcat extends ASTExpression {
     }
 
     private static TemplateModel _eval_concatenateHashes(TemplateModel leftModel, TemplateModel rightModel)
-            throws TemplateModelException {
+            throws TemplateException {
         if (leftModel instanceof TemplateHashModelEx && rightModel instanceof TemplateHashModelEx) {
             TemplateHashModelEx leftModelEx = (TemplateHashModelEx) leftModel;
             TemplateHashModelEx rightModelEx = (TemplateHashModelEx) rightModel;
@@ -193,13 +192,13 @@ final class ASTExpAddOrConcat extends ASTExpression {
 
         @Override
         public int size()
-        throws TemplateModelException {
+        throws TemplateException {
             return left.size() + right.size();
         }
 
         @Override
         public TemplateModel get(int i)
-        throws TemplateModelException {
+        throws TemplateException {
             int ls = left.size();
             return i < ls ? left.get(i) : right.get(i - ls);
         }
@@ -217,14 +216,14 @@ final class ASTExpAddOrConcat extends ASTExpression {
         
         @Override
         public TemplateModel get(String key)
-        throws TemplateModelException {
+        throws TemplateException {
             TemplateModel model = right.get(key);
             return (model != null) ? model : left.get(key);
         }
 
         @Override
         public boolean isEmpty()
-        throws TemplateModelException {
+        throws TemplateException {
             return left.isEmpty() && right.isEmpty();
         }
     }
@@ -241,27 +240,27 @@ final class ASTExpAddOrConcat extends ASTExpression {
         }
         
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             initKeys();
             return size;
         }
 
         @Override
         public TemplateCollectionModel keys()
-        throws TemplateModelException {
+        throws TemplateException {
             initKeys();
             return keys;
         }
 
         @Override
         public TemplateCollectionModel values()
-        throws TemplateModelException {
+        throws TemplateException {
             initValues();
             return values;
         }
 
         private void initKeys()
-        throws TemplateModelException {
+        throws TemplateException {
             if (keys == null) {
                 HashSet keySet = new HashSet();
                 NativeSequence keySeq = new NativeSequence(32);
@@ -273,7 +272,7 @@ final class ASTExpAddOrConcat extends ASTExpression {
         }
 
         private static void addKeys(Set set, NativeSequence keySeq, TemplateHashModelEx hash)
-        throws TemplateModelException {
+        throws TemplateException {
             TemplateModelIterator it = hash.keys().iterator();
             while (it.hasNext()) {
                 TemplateScalarModel tsm = (TemplateScalarModel) it.next();
@@ -286,7 +285,7 @@ final class ASTExpAddOrConcat extends ASTExpression {
         }        
 
         private void initValues()
-        throws TemplateModelException {
+        throws TemplateException {
             if (values == null) {
                 NativeSequence seq = new NativeSequence(size());
                 // Note: size() invokes initKeys() if needed.

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 b32fdb3..e8a115c 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
@@ -26,7 +26,6 @@ import java.util.Set;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleDate;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.apache.freemarker.core.util._SortedArraySet;
@@ -235,7 +234,7 @@ final class ASTExpBuiltInVariable extends ASTExpression {
         }
         
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) throws TemplateException {
             return env.getVariable(key);
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java
index 463110e..f188631 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpHashLiteral.java
@@ -27,7 +27,6 @@ import java.util.ListIterator;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.impl.CollectionAndSequence;
 
@@ -160,29 +159,29 @@ final class ASTExpHashLiteral extends ASTExpression {
         }
 
         @Override
-        public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
+        public KeyValuePairIterator keyValuePairIterator() throws TemplateException {
             return new KeyValuePairIterator() {
                 private final TemplateModelIterator keyIterator = keys().iterator();
                 private final TemplateModelIterator valueIterator = values().iterator();
 
                 @Override
-                public boolean hasNext() throws TemplateModelException {
+                public boolean hasNext() throws TemplateException {
                     return keyIterator.hasNext();
                 }
 
                 @Override
-                public KeyValuePair next() throws TemplateModelException {
+                public KeyValuePair next() throws TemplateException {
                     return new KeyValuePair() {
                         private final TemplateModel key = keyIterator.next();
                         private final TemplateModel value = valueIterator.next();
 
                         @Override
-                        public TemplateModel getKey() throws TemplateModelException {
+                        public TemplateModel getKey() throws TemplateException {
                             return key;
                         }
 
                         @Override
-                        public TemplateModel getValue() throws TemplateModelException {
+                        public TemplateModel getValue() throws TemplateException {
                             return value;
                         }
                         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpNumberLiteral.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpNumberLiteral.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpNumberLiteral.java
index eccb446..a61629d 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpNumberLiteral.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpNumberLiteral.java
@@ -41,7 +41,7 @@ final class ASTExpNumberLiteral extends ASTExpression implements TemplateNumberM
 
     @Override
     public String evalAndCoerceToPlainText(Environment env) throws TemplateException {
-        return env.formatNumberToPlainText(this, this, false);
+        return env.formatNumberToPlainText(this, this);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpression.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpression.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpression.java
index 0994685..fcd199c 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpression.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ASTExpression.java
@@ -25,7 +25,6 @@ import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
@@ -175,7 +174,7 @@ abstract class ASTExpression extends ASTNode {
     protected abstract ASTExpression deepCloneWithIdentifierReplaced_inner(
             String replacedIdentifier, ASTExpression replacement, ReplacemenetState replacementState);
 
-    static boolean isEmpty(TemplateModel model) throws TemplateModelException {
+    static boolean isEmpty(TemplateModel model) throws TemplateException {
         if (model instanceof BeanModel) {
             return ((BeanModel) model).isEmpty();
         } else if (model instanceof TemplateSequenceModel) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForHashEx.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForHashEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForHashEx.java
index 1988f5e..b5efa95 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForHashEx.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForHashEx.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 abstract class BuiltInForHashEx extends ASTExpBuiltIn {
 
@@ -35,7 +34,7 @@ abstract class BuiltInForHashEx extends ASTExpBuiltIn {
     }
     
     abstract TemplateModel calculateResult(TemplateHashModelEx hashExModel, Environment env)
-            throws TemplateModelException, InvalidReferenceException;
+            throws TemplateException, InvalidReferenceException;
     
     protected InvalidReferenceException newNullPropertyException(
             String propertyName, TemplateModel tm, Environment env) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForMarkupOutput.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForMarkupOutput.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForMarkupOutput.java
index 384e491..c6650dc 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForMarkupOutput.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForMarkupOutput.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 abstract class BuiltInForMarkupOutput extends ASTExpBuiltIn {
     
@@ -35,6 +34,6 @@ abstract class BuiltInForMarkupOutput extends ASTExpBuiltIn {
         return calculateResult((TemplateMarkupOutputModel) model);
     }
     
-    protected abstract TemplateModel calculateResult(TemplateMarkupOutputModel model) throws TemplateModelException;
+    protected abstract TemplateModel calculateResult(TemplateMarkupOutputModel model) throws TemplateException;
     
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNode.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNode.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNode.java
index afe7111..7ebdd1d 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNode.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNode.java
@@ -20,7 +20,6 @@
 package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNodeModel;
 
 abstract class BuiltInForNode extends ASTExpBuiltIn {
@@ -36,6 +35,6 @@ abstract class BuiltInForNode extends ASTExpBuiltIn {
         }
     }
 
-    abstract TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException;
+    abstract TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException;
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNodeEx.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNodeEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNodeEx.java
index 67d0383..f737fd9 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNodeEx.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNodeEx.java
@@ -19,7 +19,6 @@
 package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNodeModelEx;
 
 abstract class BuiltInForNodeEx extends ASTExpBuiltIn {
@@ -33,5 +32,5 @@ abstract class BuiltInForNodeEx extends ASTExpBuiltIn {
         }
     }
     abstract TemplateModel calculateResult(TemplateNodeModelEx nodeModel, Environment env)
-            throws TemplateModelException;
+            throws TemplateException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNumber.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNumber.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNumber.java
index 02954f0..f4d0701 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNumber.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInForNumber.java
@@ -20,7 +20,6 @@
 package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 abstract class BuiltInForNumber extends ASTExpBuiltIn {
     @Override
@@ -31,5 +30,5 @@ abstract class BuiltInForNumber extends ASTExpBuiltIn {
     }
     
     abstract TemplateModel calculateResult(Number num, TemplateModel model)
-    throws TemplateModelException;
+    throws TemplateException;
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForHashes.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForHashes.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForHashes.java
index 8baa9cc..e87bd77 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForHashes.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForHashes.java
@@ -22,7 +22,6 @@ package org.apache.freemarker.core;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.CollectionAndSequence;
 
@@ -35,7 +34,7 @@ class BuiltInsForHashes {
 
         @Override
         TemplateModel calculateResult(TemplateHashModelEx hashExModel, Environment env)
-                throws TemplateModelException, InvalidReferenceException {
+                throws TemplateException, InvalidReferenceException {
             TemplateCollectionModel keys = hashExModel.keys();
             if (keys == null) throw newNullPropertyException("keys", hashExModel, env);
             return keys instanceof TemplateSequenceModel ? keys : new CollectionAndSequence(keys);
@@ -46,7 +45,7 @@ class BuiltInsForHashes {
     static class valuesBI extends BuiltInForHashEx {
         @Override
         TemplateModel calculateResult(TemplateHashModelEx hashExModel, Environment env)
-                throws TemplateModelException, InvalidReferenceException {
+                throws TemplateException, InvalidReferenceException {
             TemplateCollectionModel values = hashExModel.values();
             if (values == null) throw newNullPropertyException("values", hashExModel, env);
             return values instanceof TemplateSequenceModel ? values : new CollectionAndSequence(values);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMarkupOutputs.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMarkupOutputs.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMarkupOutputs.java
index f895526..7d3c20e 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMarkupOutputs.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForMarkupOutputs.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 
 /**
@@ -32,7 +31,7 @@ class BuiltInsForMarkupOutputs {
     static class markup_stringBI extends BuiltInForMarkupOutput {
 
         @Override
-        protected TemplateModel calculateResult(TemplateMarkupOutputModel model) throws TemplateModelException {
+        protected TemplateModel calculateResult(TemplateMarkupOutputModel model) throws TemplateException {
             return new SimpleScalar(model.getOutputFormat().getMarkupString(model));
         }
         

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 048d633..6335777 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
@@ -19,7 +19,7 @@
 
 package org.apache.freemarker.core;
 
-import static org.apache.freemarker.core.util.CallableUtils.getOptionalStringArgument;
+import static org.apache.freemarker.core.util.CallableUtils.*;
 
 import java.util.Date;
 
@@ -34,7 +34,6 @@ import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.TemplateNodeModel;
 import org.apache.freemarker.core.model.TemplateNumberModel;
@@ -73,7 +72,7 @@ class BuiltInsForMultipleTypes {
         }
 
         @Override
-        protected TemplateModel formatNumber(Environment env, TemplateModel model) throws TemplateModelException {
+        protected TemplateModel formatNumber(Environment env, TemplateModel model) throws TemplateException {
             Number num = _EvalUtils.modelToNumber((TemplateNumberModel) model, target);
             if (num instanceof Integer || num instanceof Long) {
                 // Accelerate these fairly common cases
@@ -120,7 +119,7 @@ class BuiltInsForMultipleTypes {
             DateParser(String text, Environment env) throws TemplateException {
                 this.text = text;
                 this.env = env;
-                defaultFormat = env.getTemplateDateFormat(dateType, Date.class, target, false);
+                defaultFormat = env.getTemplateDateFormat(dateType, Date.class, target);
             }
 
             @Override
@@ -136,30 +135,25 @@ class BuiltInsForMultipleTypes {
             }
 
             @Override
-            public TemplateModel get(String pattern) throws TemplateModelException {
-                TemplateDateFormat format;
-                try {
-                    format = env.getTemplateDateFormat(pattern, dateType, Date.class, target, dateBI.this, true);
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to get format", e); 
-                }
+            public TemplateModel get(String pattern) throws TemplateException {
+                TemplateDateFormat format = env.getTemplateDateFormat(
+                        pattern, dateType, Date.class, target, dateBI.this);
                 return toTemplateDateModel(parse(format));
             }
 
-            private TemplateDateModel toTemplateDateModel(Object date) throws _TemplateModelException {
+            private TemplateDateModel toTemplateDateModel(Object date) throws TemplateException {
                 if (date instanceof Date) {
                     return new SimpleDate((Date) date, dateType);
                 } else {
                     TemplateDateModel tm = (TemplateDateModel) date;
                     if (tm.getDateType() != dateType) {
-                        throw new _TemplateModelException("The result of the parsing was of the wrong date type.");
+                        throw new TemplateException("The result of the parsing was of the wrong date type.");
                     }
                     return tm;
                 }
             }
 
-            private TemplateDateModel getAsDateModel() throws TemplateModelException {
+            private TemplateDateModel getAsDateModel() throws TemplateException {
                 if (cachedValue == null) {
                     cachedValue = toTemplateDateModel(parse(defaultFormat));
                 }
@@ -167,7 +161,7 @@ class BuiltInsForMultipleTypes {
             }
             
             @Override
-            public Date getAsDate() throws TemplateModelException {
+            public Date getAsDate() throws TemplateException {
                 return getAsDateModel().getAsDate();
             }
     
@@ -182,11 +176,11 @@ class BuiltInsForMultipleTypes {
             }
     
             private Object parse(TemplateDateFormat df)
-            throws TemplateModelException {
+            throws TemplateException {
                 try {
                     return df.parse(text, dateType);
                 } catch (TemplateValueFormatException e) {
-                    throw new _TemplateModelException(e,
+                    throw new TemplateException(e,
                             "The string doesn't match the expected date/time/date-time format. "
                             + "The string to parse was: ", new _DelayedJQuote(text), ". ",
                             "The expected format was: ", new _DelayedJQuote(df.getDescription()), ".",
@@ -492,16 +486,12 @@ class BuiltInsForMultipleTypes {
             }
 
             @Override
-            public String getAsString() throws TemplateModelException {
+            public String getAsString() throws TemplateException {
                 // Boolean should have come first... but that change would be non-BC. 
                 if (bool instanceof TemplateScalarModel) {
                     return ((TemplateScalarModel) bool).getAsString();
                 } else {
-                    try {
-                        return env.formatBoolean(bool.getAsBoolean(), true);
-                    } catch (TemplateException e) {
-                        throw new TemplateModelException(e);
-                    }
+                    return env.formatBoolean(bool.getAsBoolean(), true);
                 }
             }
         }
@@ -522,7 +512,7 @@ class BuiltInsForMultipleTypes {
                 defaultFormat = dateType == TemplateDateModel.UNKNOWN
                         ? null  // Lazy unknown type error in getAsString()
                         : env.getTemplateDateFormat(
-                                dateType, _EvalUtils.modelToDate(dateModel, target).getClass(), target, true);
+                                dateType, _EvalUtils.modelToDate(dateModel, target).getClass(), target);
             }
 
             @Override
@@ -537,24 +527,17 @@ class BuiltInsForMultipleTypes {
             }
 
             @Override
-            public TemplateModel get(String key)
-            throws TemplateModelException {
+            public TemplateModel get(String key) throws TemplateException {
                 return formatWith(key);
             }
 
-            private TemplateModel formatWith(String key)
-            throws TemplateModelException {
-                try {
-                    return new SimpleScalar(env.formatDateToPlainText(dateModel, key, target, stringBI.this, true));
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to format value", e); 
-                }
+            private TemplateModel formatWith(String key) throws TemplateException {
+                return new SimpleScalar(env.formatDateToPlainText(dateModel, key, target, stringBI.this));
             }
             
             @Override
             public String getAsString()
-            throws TemplateModelException {
+            throws TemplateException {
                 if (cachedValue == null) {
                     if (defaultFormat == null) {
                         if (dateModel.getDateType() == TemplateDateModel.UNKNOWN) {
@@ -566,12 +549,7 @@ class BuiltInsForMultipleTypes {
                     try {
                         cachedValue = _EvalUtils.assertFormatResultNotNull(defaultFormat.formatToPlainText(dateModel));
                     } catch (TemplateValueFormatException e) {
-                        try {
-                            throw MessageUtils.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 MessageUtils.newCantFormatDateException(defaultFormat, target, e);
                     }
                 }
                 return cachedValue;
@@ -597,12 +575,7 @@ class BuiltInsForMultipleTypes {
                 // As we format lazily, we need a snapshot of the format inputs:
                 this.numberModel = numberModel;
                 number = _EvalUtils.modelToNumber(numberModel, target);  // for BackwardCompatibleTemplateNumberFormat-s
-                try {
-                    defaultFormat = env.getTemplateNumberFormat(stringBI.this, true);
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to get default number format", e); 
-                }
+                defaultFormat = env.getTemplateNumberFormat(stringBI.this);
             }
 
             @Override
@@ -617,35 +590,18 @@ class BuiltInsForMultipleTypes {
             }
 
             @Override
-            public TemplateModel get(String key) throws TemplateModelException {
-                TemplateNumberFormat format;
-                try {
-                    format = env.getTemplateNumberFormat(key, stringBI.this, true);
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to get number format", e); 
-                }
-                
-                String result;
-                try {
-                    result = env.formatNumberToPlainText(numberModel, format, target, true);
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to format number", e); 
-                }
-                
+            public TemplateModel get(String key) throws TemplateException {
+                TemplateNumberFormat format = env.getTemplateNumberFormat(key, stringBI.this);
+
+                String result = env.formatNumberToPlainText(numberModel, format, target);
+
                 return new SimpleScalar(result);
             }
             
             @Override
-            public String getAsString() throws TemplateModelException {
+            public String getAsString() throws TemplateException {
                 if (cachedValue == null) {
-                    try {
-                        cachedValue = env.formatNumberToPlainText(numberModel, defaultFormat, target, true);
-                    } catch (TemplateException e) {
-                        // `e` should always be a TemplateModelException here, but to be sure: 
-                        throw _CoreAPI.ensureIsTemplateModelException("Failed to format number", e); 
-                    }
+                    cachedValue = env.formatNumberToPlainText(numberModel, defaultFormat, target);
                 }
                 return cachedValue;
             }
@@ -660,9 +616,7 @@ class BuiltInsForMultipleTypes {
         TemplateModel _eval(Environment env) throws TemplateException {
             TemplateModel model = target.eval(env);
             if (model instanceof TemplateNumberModel) {
-                TemplateNumberModel numberModel = (TemplateNumberModel) model;
-                Number num = _EvalUtils.modelToNumber(numberModel, target);
-                return new NumberFormatter(numberModel, env);
+                return new NumberFormatter((TemplateNumberModel) model, env);
             } else if (model instanceof TemplateDateModel) {
                 TemplateDateModel dm = (TemplateDateModel) model;
                 return new DateFormatter(dm, env);
@@ -706,7 +660,7 @@ class BuiltInsForMultipleTypes {
             }
         }
     
-        protected abstract TemplateModel formatNumber(Environment env, TemplateModel model) throws TemplateModelException;
+        protected abstract TemplateModel formatNumber(Environment env, TemplateModel model) throws TemplateException;
         
     }
 



[2/7] incubator-freemarker git commit: `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extend

Posted by dd...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModels.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModels.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModels.java
index 15b45bc..a7b0b84 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModels.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModels.java
@@ -19,8 +19,8 @@
 
 package org.apache.freemarker.core.model.impl;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * Utility class for instantiating {@link StaticModel} instances from
@@ -37,7 +37,7 @@ class StaticModels extends ClassBasedModelFactory {
 
     @Override
     protected TemplateModel createModel(Class clazz) 
-    throws TemplateModelException {
+    throws TemplateException {
         return new StaticModel(clazz, getWrapper());
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_MethodUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_MethodUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_MethodUtils.java
index cec556f..1deaa95 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_MethodUtils.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_MethodUtils.java
@@ -26,10 +26,9 @@ import java.lang.reflect.Modifier;
 import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedConversionToString;
 import org.apache.freemarker.core._DelayedJQuote;
-import org.apache.freemarker.core._TemplateModelException;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util.BugException;
 import org.apache.freemarker.core.util._ClassUtils;
 
@@ -247,8 +246,8 @@ public final class _MethodUtils {
         return new Object[] { "Java ", isConstructor ? "constructor " : "method ", new _DelayedJQuote(member) };
     }
 
-    static TemplateModelException newInvocationTemplateModelException(Object object, Member member, Throwable e) {
-        return newInvocationTemplateModelException(
+    static TemplateException newInvocationTemplateException(Object object, Member member, Throwable e) {
+        return newInvocationTemplateException(
                 object,
                 member,
                 (member.getModifiers() & Modifier.STATIC) != 0,
@@ -256,8 +255,8 @@ public final class _MethodUtils {
                 e);
     }
 
-    static TemplateModelException newInvocationTemplateModelException(Object object, CallableMemberDescriptor callableMemberDescriptor, Throwable e) {
-        return newInvocationTemplateModelException(
+    static TemplateException newInvocationTemplateException(Object object, CallableMemberDescriptor callableMemberDescriptor, Throwable e) {
+        return newInvocationTemplateException(
                 object,
                 new _DelayedConversionToString(callableMemberDescriptor) {
                     @Override
@@ -270,7 +269,7 @@ public final class _MethodUtils {
                 e);
     }
     
-    private static TemplateModelException newInvocationTemplateModelException(
+    private static TemplateException newInvocationTemplateException(
             Object parentObject, Object member, boolean isStatic, boolean isConstructor, Throwable e) {
         while (e instanceof InvocationTargetException) {
             Throwable cause = ((InvocationTargetException) e).getTargetException();
@@ -281,7 +280,7 @@ public final class _MethodUtils {
             }
         }
 
-        return new _TemplateModelException(e,
+        return new TemplateException(e,
                 invocationErrorMessageStart(member, isConstructor),
                 " threw an exception",
                 isStatic || isConstructor ? "" : new Object[] {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_ModelAPI.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_ModelAPI.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_ModelAPI.java
index 1cb23d1..6c21ee8 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_ModelAPI.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/_ModelAPI.java
@@ -25,7 +25,7 @@ import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.util._CollectionUtils;
 
 /**
@@ -39,7 +39,7 @@ public class _ModelAPI {
     
     public static Object newInstance(Class<?> pClass, Object[] args, DefaultObjectWrapper ow)
             throws NoSuchMethodException, IllegalArgumentException, InstantiationException,
-            IllegalAccessException, InvocationTargetException, TemplateModelException {
+            IllegalAccessException, InvocationTargetException, TemplateException {
         return newInstance(getConstructorDescriptor(pClass, args), args, ow);
     }
     
@@ -90,7 +90,7 @@ public class _ModelAPI {
     
     private static Object newInstance(CallableMemberDescriptor constrDesc, Object[] args, DefaultObjectWrapper ow)
             throws InstantiationException, IllegalAccessException, InvocationTargetException, IllegalArgumentException,
-            TemplateModelException {
+            TemplateException {
         if (args == null) args = _CollectionUtils.EMPTY_OBJECT_ARRAY;
         
         final Object[] packedArgs;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/CommonMarkupOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/CommonMarkupOutputFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/CommonMarkupOutputFormat.java
index d4341ef..337d37b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/CommonMarkupOutputFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/CommonMarkupOutputFormat.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.outputformat;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 
 /**
  * Common superclass for implementing {@link MarkupOutputFormat}-s that use a {@link CommonTemplateMarkupOutputModel}
@@ -35,17 +35,17 @@ public abstract class CommonMarkupOutputFormat<MO extends CommonTemplateMarkupOu
     }
     
     @Override
-    public final MO fromPlainTextByEscaping(String textToEsc) throws TemplateModelException {
+    public final MO fromPlainTextByEscaping(String textToEsc) throws TemplateException {
         return newTemplateMarkupOutputModel(textToEsc, null);
     }
 
     @Override
-    public final MO fromMarkup(String markupText) throws TemplateModelException {
+    public final MO fromMarkup(String markupText) throws TemplateException {
         return newTemplateMarkupOutputModel(null, markupText);
     }
 
     @Override
-    public final void output(MO mo, Writer out) throws IOException, TemplateModelException {
+    public final void output(MO mo, Writer out) throws IOException, TemplateException {
         String mc = mo.getMarkupContent();
         if (mc != null) {
             out.write(mc);
@@ -55,15 +55,15 @@ public abstract class CommonMarkupOutputFormat<MO extends CommonTemplateMarkupOu
     }
 
     @Override
-    public abstract void output(String textToEsc, Writer out) throws IOException, TemplateModelException;
+    public abstract void output(String textToEsc, Writer out) throws IOException, TemplateException;
     
     @Override
-    public final String getSourcePlainText(MO mo) throws TemplateModelException {
+    public final String getSourcePlainText(MO mo) throws TemplateException {
         return mo.getPlainTextContent();
     }
 
     @Override
-    public final String getMarkupString(MO mo) throws TemplateModelException {
+    public final String getMarkupString(MO mo) throws TemplateException {
         String mc = mo.getMarkupContent();
         if (mc != null) {
             return mc;
@@ -75,7 +75,7 @@ public abstract class CommonMarkupOutputFormat<MO extends CommonTemplateMarkupOu
     }
     
     @Override
-    public final MO concat(MO mo1, MO mo2) throws TemplateModelException {
+    public final MO concat(MO mo1, MO mo2) throws TemplateException {
         String pc1 = mo1.getPlainTextContent();
         String mc1 = mo1.getMarkupContent();
         String pc2 = mo2.getPlainTextContent();
@@ -95,7 +95,7 @@ public abstract class CommonMarkupOutputFormat<MO extends CommonTemplateMarkupOu
     }
     
     @Override
-    public boolean isEmpty(MO mo) throws TemplateModelException {
+    public boolean isEmpty(MO mo) throws TemplateException {
         String s = mo.getPlainTextContent();
         if (s != null) {
             return s.length() == 0;
@@ -117,6 +117,6 @@ public abstract class CommonMarkupOutputFormat<MO extends CommonTemplateMarkupOu
      * Creates a new {@link CommonTemplateMarkupOutputModel} that's bound to this {@link OutputFormat} instance.
      */
     protected abstract MO newTemplateMarkupOutputModel(String plainTextContent, String markupContent)
-            throws TemplateModelException;
+            throws TemplateException;
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/MarkupOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/MarkupOutputFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/MarkupOutputFormat.java
index 8707a3c..77ba50c 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/MarkupOutputFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/MarkupOutputFormat.java
@@ -22,8 +22,8 @@ import java.io.IOException;
 import java.io.Writer;
 
 import org.apache.freemarker.core.Configuration;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.outputformat.impl.HTMLOutputFormat;
 import org.apache.freemarker.core.outputformat.impl.TemplateHTMLOutputModel;
 
@@ -59,28 +59,28 @@ public abstract class MarkupOutputFormat<MO extends TemplateMarkupOutputModel> e
      * @see #escapePlainText(String)
      * @see #getSourcePlainText(TemplateMarkupOutputModel)
      */
-    public abstract MO fromPlainTextByEscaping(String textToEsc) throws TemplateModelException;
+    public abstract MO fromPlainTextByEscaping(String textToEsc) throws TemplateException;
 
     /**
      * Wraps a {@link String} that's already markup to {@link TemplateMarkupOutputModel} interface, to indicate its
-     * format. This corresponds to {@code ?noEsc}. (This methods is allowed to throw {@link TemplateModelException} if
+     * format. This corresponds to {@code ?noEsc}. (This methods is allowed to throw {@link TemplateException} if
      * the parameter markup text is malformed, but it's unlikely that an implementation chooses to parse the parameter
      * until, and if ever, that becomes necessary.)
      * 
      * @see #getMarkupString(TemplateMarkupOutputModel)
      */
-    public abstract MO fromMarkup(String markupText) throws TemplateModelException;
+    public abstract MO fromMarkup(String markupText) throws TemplateException;
 
     /**
      * Prints the parameter model to the output.
      */
-    public abstract void output(MO mo, Writer out) throws IOException, TemplateModelException;
+    public abstract void output(MO mo, Writer out) throws IOException, TemplateException;
 
     /**
      * Equivalent to calling {@link #fromPlainTextByEscaping(String)} and then
      * {@link #output(TemplateMarkupOutputModel, Writer)}, but the implementation may uses a more efficient solution.
      */
-    public abstract void output(String textToEsc, Writer out) throws IOException, TemplateModelException;
+    public abstract void output(String textToEsc, Writer out) throws IOException, TemplateException;
     
     /**
      * If this {@link TemplateMarkupOutputModel} was created with {@link #fromPlainTextByEscaping(String)}, it returns
@@ -88,7 +88,7 @@ public abstract class MarkupOutputFormat<MO extends TemplateMarkupOutputModel> e
      * of markups, as if the source format can be converted to plain text without loss, then that just has to be
      * re-escaped with the target format to do the conversion.
      */
-    public abstract String getSourcePlainText(MO mo) throws TemplateModelException;
+    public abstract String getSourcePlainText(MO mo) throws TemplateException;
 
     /**
      * Returns the content as markup text; never {@code null}. If this {@link TemplateMarkupOutputModel} was created
@@ -96,31 +96,31 @@ public abstract class MarkupOutputFormat<MO extends TemplateMarkupOutputModel> e
      * as far as the returned markup means the same. If this {@link TemplateMarkupOutputModel} wasn't created
      * with {@link #fromMarkup(String)} and it doesn't yet have the markup, it has to generate the markup now.
      */
-    public abstract String getMarkupString(MO mo) throws TemplateModelException;
+    public abstract String getMarkupString(MO mo) throws TemplateException;
     
     /**
      * Returns a {@link TemplateMarkupOutputModel} that contains the content of both {@link TemplateMarkupOutputModel}
      * objects concatenated.
      */
-    public abstract MO concat(MO mo1, MO mo2) throws TemplateModelException;
+    public abstract MO concat(MO mo1, MO mo2) throws TemplateException;
     
     /**
      * Should give the same result as {@link #fromPlainTextByEscaping(String)} and then
      * {@link #getMarkupString(TemplateMarkupOutputModel)}, but the implementation may uses a more efficient solution.
      */
-    public abstract String escapePlainText(String plainTextContent) throws TemplateModelException;
+    public abstract String escapePlainText(String plainTextContent) throws TemplateException;
 
     /**
      * Returns if the markup is empty (0 length). This is used by at least {@code ?hasContent}.
      */
-    public abstract boolean isEmpty(MO mo) throws TemplateModelException;
+    public abstract boolean isEmpty(MO mo) throws TemplateException;
     
     /**
      * Tells if a string built-in that can't handle a {@link TemplateMarkupOutputModel} left hand operand can bypass
      * this object as is. A typical such case would be when a {@link TemplateHTMLOutputModel} of "HTML" format bypasses
      * {@code ?html}.
      */
-    public abstract boolean isLegacyBuiltInBypassed(String builtInName) throws TemplateModelException;
+    public abstract boolean isLegacyBuiltInBypassed(String builtInName) throws TemplateException;
     
     /**
      * Tells if by default auto-escaping should be on for this format. It should be {@code true} if you need to escape

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormat.java
index e3e1c51..4d0f060 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/CombinedMarkupOutputFormat.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.outputformat.impl;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
 
@@ -65,17 +65,17 @@ public final class CombinedMarkupOutputFormat extends CommonMarkupOutputFormat<T
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException, TemplateException {
         outer.output(inner.escapePlainText(textToEsc), out);
     }
 
     @Override
-    public String escapePlainText(String plainTextContent) throws TemplateModelException {
+    public String escapePlainText(String plainTextContent) throws TemplateException {
         return outer.escapePlainText(inner.escapePlainText(plainTextContent));
     }
 
     @Override
-    public boolean isLegacyBuiltInBypassed(String builtInName) throws TemplateModelException {
+    public boolean isLegacyBuiltInBypassed(String builtInName) throws TemplateException {
         return outer.isLegacyBuiltInBypassed(builtInName);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormat.java
index aafcc4e..1b9f367 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/HTMLOutputFormat.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.outputformat.impl;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.util._StringUtils;
@@ -53,7 +53,7 @@ public final class HTMLOutputFormat extends CommonMarkupOutputFormat<TemplateHTM
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException, TemplateException {
         _StringUtils.XHTMLEnc(textToEsc, out);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormat.java
index 1397af5..fad1293 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/RTFOutputFormat.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.outputformat.impl;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.util._StringUtils;
@@ -53,7 +53,7 @@ public final class RTFOutputFormat extends CommonMarkupOutputFormat<TemplateRTFO
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException, TemplateException {
         _StringUtils.RTFEnc(textToEsc, out);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XHTMLOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XHTMLOutputFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XHTMLOutputFormat.java
index 55a2748..fa61fa8 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XHTMLOutputFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XHTMLOutputFormat.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.outputformat.impl;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.util._StringUtils;
@@ -53,7 +53,7 @@ public final class XHTMLOutputFormat extends CommonMarkupOutputFormat<TemplateXH
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException, TemplateException {
         _StringUtils.XHTMLEnc(textToEsc, out);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XMLOutputFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XMLOutputFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XMLOutputFormat.java
index c129135..bb116d9 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XMLOutputFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/outputformat/impl/XMLOutputFormat.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.core.outputformat.impl;
 import java.io.IOException;
 import java.io.Writer;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.outputformat.CommonMarkupOutputFormat;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.util._StringUtils;
@@ -53,7 +53,7 @@ public final class XMLOutputFormat extends CommonMarkupOutputFormat<TemplateXMLO
     }
 
     @Override
-    public void output(String textToEsc, Writer out) throws IOException, TemplateModelException {
+    public void output(String textToEsc, Writer out) throws IOException, TemplateException {
         _StringUtils.XMLEnc(textToEsc, out);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/util/CallableUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/CallableUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/CallableUtils.java
index a208612..4f6dc5d 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/CallableUtils.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/CallableUtils.java
@@ -66,13 +66,31 @@ public final class CallableUtils {
         return newGenericExecuteException(callable, false, errorDescription);
     }
 
+    public static TemplateException newGenericExecuteException(
+            TemplateCallableModel callable, boolean calledAsFunction, String errorDescription) {
+        return newGenericExecuteException(callable, calledAsFunction, errorDescription, null);
+    }
+
+    /** Convenience method for calling {@link #newGenericExecuteException(TemplateCallableModel, boolean, String)}. */
+    public static TemplateException newGenericExecuteException(
+            TemplateFunctionModel callable, String errorDescription, Throwable cause) {
+        return newGenericExecuteException(callable, true, errorDescription, cause);
+    }
+
+    /** Convenience method for calling {@link #newGenericExecuteException(TemplateCallableModel, boolean, String)}. */
+    public static TemplateException newGenericExecuteException(
+            TemplateDirectiveModel callable, String errorDescription, Throwable cause) {
+        return newGenericExecuteException(callable, false, errorDescription, cause);
+    }
+
     /**
      * @param errorDescription Complete sentence describing the problem. This will be after
      *      {@code "When calling xxx: "}.
      */
     public static TemplateException newGenericExecuteException(
-            TemplateCallableModel callable, boolean calledAsFunction, String errorDescription) {
-        return new TemplateException(
+            TemplateCallableModel callable, boolean calledAsFunction, String errorDescription,
+            Throwable cause) {
+        return new TemplateException(cause,
                 _CallableUtils.getMessagePartWhenCallingSomethingColon(callable, calledAsFunction),
                 errorDescription);
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/util/DeepUnwrap.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/util/DeepUnwrap.java b/freemarker-core/src/main/java/org/apache/freemarker/core/util/DeepUnwrap.java
index b62be6f..599cdea 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/util/DeepUnwrap.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/util/DeepUnwrap.java
@@ -23,6 +23,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
@@ -30,7 +31,6 @@ import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -67,11 +67,11 @@ public class DeepUnwrap {
      *   <li>If the object implements {@link TemplateHashModelEx}, then a
      *       <code>java.util.HashMap</code> is constructed from the subvariables, and each
      *       subvariable is unwrapped with the rules described here (recursive unwrapping).
-     *   <li>Throw a <code>TemplateModelException</code>, because it doesn't know how to
+     *   <li>Throw a {@link TemplateException}, because it doesn't know how to
      *       unwrap the object.
      * </ol>
      */
-    public static Object unwrap(TemplateModel model) throws TemplateModelException {
+    public static Object unwrap(TemplateModel model) throws TemplateException {
         return unwrap(model, false);
     }
 
@@ -79,11 +79,11 @@ public class DeepUnwrap {
      * Same as {@link #unwrap(TemplateModel)}, but it doesn't throw exception 
      * if it doesn't know how to unwrap the model, but rather returns it as-is.
      */
-    public static Object permissiveUnwrap(TemplateModel model) throws TemplateModelException {
+    public static Object permissiveUnwrap(TemplateModel model) throws TemplateException {
         return unwrap(model, true);
     }
     
-    private static Object unwrap(TemplateModel model, boolean permissive) throws TemplateModelException {
+    private static Object unwrap(TemplateModel model, boolean permissive) throws TemplateException {
         Environment env = Environment.getCurrentEnvironment();
         TemplateModel nullModel = null;
         if (env != null) {
@@ -95,7 +95,7 @@ public class DeepUnwrap {
         return unwrap(model, nullModel, permissive);
     }
 
-    private static Object unwrap(TemplateModel model, TemplateModel nullModel, boolean permissive) throws TemplateModelException {
+    private static Object unwrap(TemplateModel model, TemplateModel nullModel, boolean permissive) throws TemplateException {
         if (model instanceof AdapterTemplateModel) {
             return ((AdapterTemplateModel) model).getAdaptedObject(OBJECT_CLASS);
         }
@@ -147,6 +147,6 @@ public class DeepUnwrap {
         if (permissive) {
             return model;
         }
-        throw new TemplateModelException("Cannot deep-unwrap model of type " + model.getClass().getName());
+        throw new TemplateException("Cannot deep-unwrap model of type " + model.getClass().getName());
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 8e890f9..584c25c 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
@@ -23,9 +23,9 @@ import java.text.DateFormat;
 import java.util.Date;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * Represents a date/time/dateTime format; used in templates for formatting and parsing with that format. This is
@@ -50,11 +50,11 @@ public abstract class TemplateDateFormat extends TemplateValueFormat {
      * @throws TemplateValueFormatException
      *             When a problem occurs during the formatting of the value. Notable subclass:
      *             {@link UnknownDateTypeFormattingUnsupportedException}
-     * @throws TemplateModelException
+     * @throws TemplateException
      *             Exception thrown by the {@code dateModel} object when calling its methods.
      */
     public abstract String formatToPlainText(TemplateDateModel dateModel)
-            throws TemplateValueFormatException, TemplateModelException;
+            throws TemplateValueFormatException, TemplateException;
 
     /**
      * Formats the model to markup instead of to plain text if the result markup will be more than just plain text
@@ -66,7 +66,7 @@ public abstract class TemplateDateFormat extends TemplateValueFormat {
      * 
      * @return A {@link String} or a {@link TemplateMarkupOutputModel}; not {@code null}.
      */
-    public Object format(TemplateDateModel dateModel) throws TemplateValueFormatException, TemplateModelException {
+    public Object format(TemplateDateModel dateModel) throws TemplateValueFormatException, TemplateException {
         return formatToPlainText(dateModel);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateFormatUtil.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateFormatUtil.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateFormatUtil.java
index a047e70..e75cc7f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateFormatUtil.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateFormatUtil.java
@@ -20,10 +20,10 @@ package org.apache.freemarker.core.valueformat;
 
 import java.util.Date;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._EvalUtils;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 
 /**
@@ -45,12 +45,12 @@ public final class TemplateFormatUtil {
 
     /**
      * Utility method to extract the {@link Number} from an {@link TemplateNumberModel}, and throws
-     * {@link TemplateModelException} with a standard error message if that's {@code null}. {@link TemplateNumberModel}
+     * {@link TemplateException} with a standard error message if that's {@code null}. {@link TemplateNumberModel}
      * that store {@code null} are in principle not allowed, and so are considered to be bugs in the
      * {@link ObjectWrapper} or {@link TemplateNumberModel} implementation.
      */
     public static Number getNonNullNumber(TemplateNumberModel numberModel)
-            throws TemplateModelException, UnformattableValueException {
+            throws TemplateException, UnformattableValueException {
         Number number = numberModel.getAsNumber();
         if (number == null) {
             throw _EvalUtils.newModelHasStoredNullException(Number.class, numberModel, null);
@@ -60,11 +60,11 @@ public final class TemplateFormatUtil {
 
     /**
      * Utility method to extract the {@link Date} from an {@link TemplateDateModel}, and throw
-     * {@link TemplateModelException} with a standard error message if that's {@code null}. {@link TemplateDateModel}
+     * {@link TemplateException} with a standard error message if that's {@code null}. {@link TemplateDateModel}
      * that store {@code null} are in principle not allowed, and so are considered to be bugs in the
      * {@link ObjectWrapper} or {@link TemplateNumberModel} implementation.
      */
-    public static Date getNonNullDate(TemplateDateModel dateModel) throws TemplateModelException {
+    public static Date getNonNullDate(TemplateDateModel dateModel) throws TemplateException {
         Date date = dateModel.getAsDate();
         if (date == null) {
             throw _EvalUtils.newModelHasStoredNullException(Date.class, dateModel, null);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateNumberFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateNumberFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateNumberFormat.java
index af4f9d7..25e7ad4 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateNumberFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/TemplateNumberFormat.java
@@ -21,10 +21,10 @@ package org.apache.freemarker.core.valueformat;
 import java.text.NumberFormat;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.arithmetic.ArithmeticEngine;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 
 /**
@@ -50,11 +50,11 @@ public abstract class TemplateNumberFormat extends TemplateValueFormat {
      * @throws TemplateValueFormatException
      *             If any problem occurs while parsing/getting the format. Notable subclass:
      *             {@link UnformattableValueException}.
-     * @throws TemplateModelException
+     * @throws TemplateException
      *             Exception thrown by the {@code dateModel} object when calling its methods.
      */
     public abstract String formatToPlainText(TemplateNumberModel numberModel)
-            throws TemplateValueFormatException, TemplateModelException;
+            throws TemplateValueFormatException, TemplateException;
 
     /**
      * Formats the model to markup instead of to plain text if the result markup will be more than just plain text
@@ -68,7 +68,7 @@ public abstract class TemplateNumberFormat extends TemplateValueFormat {
      * @return A {@link String} or a {@link TemplateMarkupOutputModel}; not {@code null}.
      */
     public Object format(TemplateNumberModel numberModel)
-            throws TemplateValueFormatException, TemplateModelException {
+            throws TemplateValueFormatException, TemplateException {
         return formatToPlainText(numberModel);
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 1598518..fe189f3 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
@@ -23,8 +23,8 @@ import java.util.Date;
 import java.util.TimeZone;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util.BugException;
 import org.apache.freemarker.core.util._DateUtils;
 import org.apache.freemarker.core.util._DateUtils.CalendarFieldsToDateConverter;
@@ -185,7 +185,7 @@ abstract class ISOLikeTemplateDateFormat  extends TemplateDateFormat {
     }
     
     @Override
-    public final String formatToPlainText(TemplateDateModel dateModel) throws TemplateModelException {
+    public final String formatToPlainText(TemplateDateModel dateModel) throws TemplateException {
         final Date date = TemplateFormatUtil.getNonNullDate(dateModel);
         return format(
                 date,

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormat.java
index e30c2e4..98af84b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateDateFormat.java
@@ -24,8 +24,8 @@ import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.valueformat.TemplateDateFormat;
 import org.apache.freemarker.core.valueformat.TemplateFormatUtil;
 import org.apache.freemarker.core.valueformat.UnparsableValueException;
@@ -42,7 +42,7 @@ class JavaTemplateDateFormat extends TemplateDateFormat {
     }
     
     @Override
-    public String formatToPlainText(TemplateDateModel dateModel) throws TemplateModelException {
+    public String formatToPlainText(TemplateDateModel dateModel) throws TemplateException {
         return javaDateFormat.format(TemplateFormatUtil.getNonNullDate(dateModel));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateNumberFormat.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateNumberFormat.java b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateNumberFormat.java
index e3cdea0..a425d32 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateNumberFormat.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/valueformat/impl/JavaTemplateNumberFormat.java
@@ -20,7 +20,7 @@ package org.apache.freemarker.core.valueformat.impl;
 
 import java.text.NumberFormat;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.valueformat.TemplateFormatUtil;
 import org.apache.freemarker.core.valueformat.TemplateNumberFormat;
@@ -37,7 +37,8 @@ final class JavaTemplateNumberFormat extends TemplateNumberFormat {
     }
 
     @Override
-    public String formatToPlainText(TemplateNumberModel numberModel) throws UnformattableValueException, TemplateModelException {
+    public String formatToPlainText(TemplateNumberModel numberModel) throws UnformattableValueException,
+            TemplateException {
         Number number = TemplateFormatUtil.getNonNullNumber(numberModel);
         try {
             return javaNumberFormat.format(number);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/javacc/FTL.jj
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/javacc/FTL.jj b/freemarker-core/src/main/javacc/FTL.jj
index 4a3295f..6d05ddd 100644
--- a/freemarker-core/src/main/javacc/FTL.jj
+++ b/freemarker-core/src/main/javacc/FTL.jj
@@ -361,7 +361,7 @@ public class FMParser {
         if (tm instanceof TemplateBooleanModel) {
             try {
                 return ((TemplateBooleanModel) tm).getAsBoolean();
-            } catch (TemplateModelException tme) {
+            } catch (TemplateException tme) {
             }
         }
         if (legacyCompat && tm instanceof TemplateScalarModel) {
@@ -3625,7 +3625,7 @@ ASTDirOutputFormat OutputFormat() :
         if (paramTM instanceof TemplateScalarModel) {
             try {
                 paramStr = ((TemplateScalarModel) paramTM).getAsString();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
 	            throw new ParseException(
 	                    "Could not evaluate expression (on parse-time): " + paramExp.getCanonicalForm()
 	                    + "\nUnderlying cause: " +  e,
@@ -4115,7 +4115,7 @@ void HeaderElement() :
                     if (value instanceof TemplateScalarModel) {
                         try {
                             vs = ((TemplateScalarModel) exp).getAsString();
-                        } catch (TemplateModelException tme) {}
+                        } catch (TemplateException tme) {}
                     }
                     if (template != null) {
                         if (ks.equalsIgnoreCase("encoding")) {
@@ -4190,7 +4190,7 @@ void HeaderElement() :
                                         throw new ParseException(iae.getMessage(), exp);
                                     }
                                 }
-                            } catch (TemplateModelException tme) {
+                            } catch (TemplateException tme) {
                             }
                         } else if (ks.equals("customSettings")) {
                             if (!(value instanceof TemplateHashModelEx)) {
@@ -4210,7 +4210,7 @@ void HeaderElement() :
                                         }
                                         template.setHeaderCustomSetting(attName, (Serializable) attValue);
                                 }
-                            } catch (TemplateModelException tme) {
+                            } catch (TemplateException tme) {
                             }
                         } else {
                             StringBuilder sb = new StringBuilder();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
index 5a6f581..3d6a379 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentModel.java
@@ -18,11 +18,11 @@
  */
  
 package org.apache.freemarker.dom;
- 
+
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.w3c.dom.Document;
 import org.w3c.dom.NodeList;
 
@@ -45,7 +45,7 @@ class DocumentModel extends NodeModel implements TemplateHashModel {
     }
     
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         if (key.equals("*")) {
             return getRootElement();
         } else if (key.equals("**")) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
index 3448f77..eb978fe 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/DocumentTypeModel.java
@@ -19,8 +19,8 @@
  
 package org.apache.freemarker.dom;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.w3c.dom.DocumentType;
 import org.w3c.dom.ProcessingInstruction;
@@ -35,13 +35,13 @@ class DocumentTypeModel extends NodeModel {
         return ((ProcessingInstruction) node).getData();
     }
     
-    public TemplateSequenceModel getChildren() throws TemplateModelException {
-        throw new TemplateModelException("entering the child nodes of a DTD node is not currently supported");
+    public TemplateSequenceModel getChildren() throws TemplateException {
+        throw new TemplateException("Entering the child nodes of a DTD node is not currently supported");
     }
     
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
-        throw new TemplateModelException("accessing properties of a DTD is not currently supported");
+    public TemplateModel get(String key) throws TemplateException {
+        throw new TemplateException("Accessing properties of a DTD is not currently supported");
     }
     
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
index 5e9de70..cfd0430 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/ElementModel.java
@@ -23,8 +23,8 @@ import java.util.Collections;
 
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.Template;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -57,7 +57,7 @@ class ElementModel extends NodeModel implements TemplateScalarModel {
      * The special key "/" returns the root document node associated with this element.
      */
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         if (key.equals("*")) {
             NodeListModel ns = new NodeListModel(this);
             TemplateSequenceModel children = getChildNodes();
@@ -128,7 +128,7 @@ class ElementModel extends NodeModel implements TemplateScalarModel {
     }
 
     @Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() throws TemplateException {
         NodeList nl = node.getChildNodes();
         String result = "";
         for (int i = 0; i < nl.getLength(); i++) {
@@ -139,7 +139,7 @@ class ElementModel extends NodeModel implements TemplateScalarModel {
                              + "\nThis element with name \""
                              + node.getNodeName()
                              + "\" has a child element named: " + child.getNodeName();
-                throw new TemplateModelException(msg);
+                throw new TemplateException(msg);
             } else if (nodeType == Node.TEXT_NODE || nodeType == Node.CDATA_SECTION_NODE) {
                 result += child.getNodeValue();
             }
@@ -203,7 +203,7 @@ class ElementModel extends NodeModel implements TemplateScalarModel {
         return result;
     }
     
-    private boolean isSignificantNode(Node node) throws TemplateModelException {
+    private boolean isSignificantNode(Node node) throws TemplateException {
         return (node.getNodeType() == Node.TEXT_NODE || node.getNodeType() == Node.CDATA_SECTION_NODE)
                 ? !isBlankXMLText(node.getTextContent())
                 : node.getNodeType() != Node.PROCESSING_INSTRUCTION_NODE && node.getNodeType() != Node.COMMENT_NODE;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/JaxenXPathSupport.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/JaxenXPathSupport.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/JaxenXPathSupport.java
index 3e52836..4b3fb2f 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/JaxenXPathSupport.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/JaxenXPathSupport.java
@@ -38,7 +38,6 @@ import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.util.UndeclaredThrowableException;
@@ -76,7 +75,7 @@ class JaxenXPathSupport implements XPathSupport {
     private final static ArrayList EMPTY_ARRAYLIST = new ArrayList();
 
     @Override
-    public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException {
+    public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateException {
         try {
             BaseXPath xpath;
             Map<String, BaseXPath> xpathCache = Environment.getCurrentEnvironmentNotNull().getCurrentTemplateNotNull()
@@ -100,12 +99,12 @@ class JaxenXPathSupport implements XPathSupport {
             return nlm;
         } catch (UndeclaredThrowableException e) {
             Throwable t  = e.getUndeclaredThrowable();
-            if (t instanceof TemplateModelException) {
-                throw (TemplateModelException) t;
+            if (t instanceof TemplateException) {
+                throw (TemplateException) t;
             }
             throw e;
-        } catch (JaxenException je) {
-            throw new TemplateModelException(je);
+        } catch (JaxenException e) {
+            throw new TemplateException(e);
         }
     }
 
@@ -141,7 +140,7 @@ class JaxenXPathSupport implements XPathSupport {
                 if (model instanceof TemplateBooleanModel) {
                     return Boolean.valueOf(((TemplateBooleanModel) model).getAsBoolean());
                 }
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 throw new UndeclaredThrowableException(e);
             }
             throw new UnresolvableException(

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
index ab7d701..3f60482 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeListModel.java
@@ -24,12 +24,12 @@ import java.util.List;
 
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNodeModel;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -84,7 +84,7 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
         this.contextNode = contextNode;
     }
     
-    NodeListModel filterByName(String name) throws TemplateModelException {
+    NodeListModel filterByName(String name) throws TemplateException {
         NodeListModel result = new NodeListModel(contextNode);
         int size = size();
         if (size == 0) {
@@ -108,7 +108,7 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
     }
     
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         if (size() == 1) {
             NodeModel nm = (NodeModel) get(0);
             return nm.get(key);
@@ -127,13 +127,13 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
             } else if (key.length() != 2 /* to allow "@@" to fall through */) {
                 // As @@... would cause exception in the XPath engine, we throw a nicer exception now. 
                 if (AtAtKey.containsKey(key)) {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "\"" + key + "\" is only applicable to a single XML node, but it was applied on "
                             + (size() != 0
                                     ? size() + " XML nodes (multiple matches)."
                                     : "an empty list of XML nodes (no matches)."));
                 } else {
-                    throw new TemplateModelException("Unsupported @@ key: " + key);
+                    throw new TemplateException("Unsupported @@ key: " + key);
                 }
             }
         }
@@ -164,13 +164,13 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
             Object context = (size() == 0) ? null : rawNodeList(); 
             return xps.executeQuery(context, key);
         } else {
-            throw new TemplateModelException(
+            throw new TemplateException(
                     "Can't try to resolve the XML query key, because no XPath support is available. "
                     + "This is either malformed or an XPath expression: " + key);
         }
     }
     
-    private List rawNodeList() throws TemplateModelException {
+    private List rawNodeList() throws TemplateException {
         int size = size();
         ArrayList al = new ArrayList(size);
         for (int i = 0; i < size; i++) {
@@ -179,7 +179,7 @@ class NodeListModel extends SimpleSequence implements TemplateHashModel, _Unexpe
         return al;
     }
     
-    XPathSupport getXPathSupport() throws TemplateModelException {
+    XPathSupport getXPathSupport() throws TemplateException {
         if (xpathSupport == null) {
             if (contextNode != null) {
                 xpathSupport = contextNode.getXPathSupport();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 2a2dd04..f6c4d38 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
@@ -27,13 +27,13 @@ import java.util.Map;
 import java.util.WeakHashMap;
 
 import org.apache.freemarker.core.Configuration;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNodeModel;
 import org.apache.freemarker.core.model.TemplateNodeModelEx;
 import org.apache.freemarker.core.model.TemplateNumberModel;
@@ -111,7 +111,7 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
     }
     
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         if (key.startsWith("@@")) {
             if (key.equals(AtAtKey.TEXT.getKey())) {
                 return new SimpleScalar(getText(node));
@@ -140,10 +140,10 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
             } else {
                 // As @@... would cause exception in the XPath engine, we throw a nicer exception now. 
                 if (AtAtKey.containsKey(key)) {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "\"" + key + "\" is not supported for an XML node of type \"" + getNodeType() + "\".");
                 } else {
-                    throw new TemplateModelException("Unsupported @@ key: " + key);
+                    throw new TemplateException("Unsupported @@ key: " + key);
                 }
             }
         } else {
@@ -151,7 +151,7 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
             if (xps != null) {
                 return xps.executeQuery(node, key);
             } else {
-                throw new TemplateModelException(
+                throw new TemplateException(
                         "Can't try to resolve the XML query key, because no XPath support is available. "
                         + "This is either malformed or an XPath expression: " + key);
             }
@@ -173,12 +173,12 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
     }
 
     @Override
-    public TemplateNodeModelEx getPreviousSibling() throws TemplateModelException {
+    public TemplateNodeModelEx getPreviousSibling() throws TemplateException {
         return wrap(node.getPreviousSibling());
     }
 
     @Override
-    public TemplateNodeModelEx getNextSibling() throws TemplateModelException {
+    public TemplateNodeModelEx getNextSibling() throws TemplateException {
         return wrap(node.getNextSibling());
     }
 
@@ -191,7 +191,7 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
     }
     
     @Override
-    public final String getNodeType() throws TemplateModelException {
+    public final String getNodeType() throws TemplateException {
         short nodeType = node.getNodeType();
         switch (nodeType) {
             case Node.ATTRIBUTE_NODE : return "attribute";
@@ -207,20 +207,7 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
             case Node.PROCESSING_INSTRUCTION_NODE : return "pi";
             case Node.TEXT_NODE : return "text";
         }
-        throw new TemplateModelException("Unknown node type: " + nodeType + ". This should be impossible!");
-    }
-    
-    public TemplateModel exec(List args) throws TemplateModelException {
-        if (args.size() != 1) {
-            throw new TemplateModelException("Expecting exactly one arguments");
-        }
-        String query = (String) args.get(0);
-        // Now, we try to behave as if this is an XPath expression
-        XPathSupport xps = getXPathSupport();
-        if (xps == null) {
-            throw new TemplateModelException("No XPath support available");
-        }
-        return xps.executeQuery(node, query);
+        throw new TemplateException("Unknown node type: " + nodeType + ". This should be impossible!");
     }
     
     /**
@@ -579,7 +566,7 @@ abstract public class NodeModel implements TemplateNodeModelEx, TemplateHashMode
     }
     
     
-    String getQualifiedName() throws TemplateModelException {
+    String getQualifiedName() throws TemplateException {
         return getNodeName();
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeQueryResultItemObjectWrapper.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeQueryResultItemObjectWrapper.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeQueryResultItemObjectWrapper.java
index e84e977..20a8662 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeQueryResultItemObjectWrapper.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/NodeQueryResultItemObjectWrapper.java
@@ -21,11 +21,11 @@ package org.apache.freemarker.dom;
 
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelAdapter;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
 import org.apache.freemarker.core.model.impl.SimpleDate;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
@@ -47,7 +47,7 @@ class NodeQueryResultItemObjectWrapper implements ObjectWrapper {
     }
 
     @Override
-    public TemplateModel wrap(Object obj) throws TemplateModelException {
+    public TemplateModel wrap(Object obj) throws ObjectWrappingException {
         if (obj instanceof NodeModel) {
             return (NodeModel) obj;
         }
@@ -85,7 +85,7 @@ class NodeQueryResultItemObjectWrapper implements ObjectWrapper {
                 }
                 return new SimpleDate((java.util.Date) obj, TemplateDateModel.UNKNOWN);
             }
-            throw new TemplateModelException("Don't know how to wrap a W3C DOM query result item of this type: "
+            throw new ObjectWrappingException("Don't know how to wrap a W3C DOM query result item of this type: "
                     + obj.getClass().getName());
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
index 991c93f..20fd66e 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/SunInternalXalanXPathSupport.java
@@ -25,9 +25,9 @@ import javax.xml.transform.TransformerException;
 
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.Template;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.w3c.dom.Node;
@@ -60,25 +60,25 @@ class SunInternalXalanXPathSupport implements XPathSupport {
             = "Cannot perform an XPath query against an empty node set." + ERRMSG_RECOMMEND_JAXEN;
     
     @Override
-    synchronized public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException {
+    synchronized public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateException {
         if (!(context instanceof Node)) {
             if (context != null) {
                 if (isNodeList(context)) {
                     int cnt = ((List) context).size();
                     if (cnt != 0) {
-                        throw new TemplateModelException(
+                        throw new TemplateException(
                                 "Cannot perform an XPath query against a node set of " + cnt
                                 + " nodes. Expecting a single node." + ERRMSG_RECOMMEND_JAXEN);
                     } else {
-                        throw new TemplateModelException(ERRMSG_EMPTY_NODE_SET);
+                        throw new TemplateException(ERRMSG_EMPTY_NODE_SET);
                     }
                 } else {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "Cannot perform an XPath query against a " + context.getClass().getName()
                             + ". Expecting a single org.w3c.dom.Node.");
                 }
             } else {
-                throw new TemplateModelException(ERRMSG_EMPTY_NODE_SET);
+                throw new TemplateException(ERRMSG_EMPTY_NODE_SET);
             }
         }
         Node node = (Node) context;
@@ -111,9 +111,9 @@ class SunInternalXalanXPathSupport implements XPathSupport {
             if (xresult instanceof XNumber) {
                 return new SimpleNumber(Double.valueOf(((XNumber) xresult).num()));
             }
-            throw new TemplateModelException("Cannot deal with type: " + xresult.getClass().getName());
+            throw new TemplateException("Cannot deal with type: " + xresult.getClass().getName());
         } catch (TransformerException te) {
-            throw new TemplateModelException(te);
+            throw new TemplateException(te);
         }
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/XPathSupport.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/XPathSupport.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/XPathSupport.java
index e94d391..b2f32fd 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/XPathSupport.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/XPathSupport.java
@@ -19,12 +19,12 @@
  
 package org.apache.freemarker.dom;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 public interface XPathSupport {
     
     // [2.4] Add argument to pass down the ObjectWrapper to use 
-    TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException;
+    TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateException;
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
----------------------------------------------------------------------
diff --git a/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java b/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
index 99a4249..67640d4 100644
--- a/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
+++ b/freemarker-dom/src/main/java/org/apache/freemarker/dom/XalanXPathSupport.java
@@ -25,9 +25,9 @@ import javax.xml.transform.TransformerException;
 
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.Template;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.apache.xml.utils.PrefixResolver;
@@ -60,25 +60,25 @@ class XalanXPathSupport implements XPathSupport {
             = "Cannot perform an XPath query against an empty node set."; /* " + ERRMSG_RECOMMEND_JAXEN;*/
     
     @Override
-    synchronized public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateModelException {
+    synchronized public TemplateModel executeQuery(Object context, String xpathQuery) throws TemplateException {
         if (!(context instanceof Node)) {
             if (context != null) {
                 if (isNodeList(context)) {
                     int cnt = ((List) context).size();
                     if (cnt != 0) {
-                        throw new TemplateModelException(
+                        throw new TemplateException(
                                 "Cannot perform an XPath query against a node set of " + cnt
                                 + " nodes. Expecting a single node."/* " + ERRMSG_RECOMMEND_JAXEN*/);
                     } else {
-                        throw new TemplateModelException(ERRMSG_EMPTY_NODE_SET);
+                        throw new TemplateException(ERRMSG_EMPTY_NODE_SET);
                     }
                 } else {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "Cannot perform an XPath query against a " + context.getClass().getName()
                             + ". Expecting a single org.w3c.dom.Node.");
                 }
             } else {
-                throw new TemplateModelException(ERRMSG_EMPTY_NODE_SET);
+                throw new TemplateException(ERRMSG_EMPTY_NODE_SET);
             }
         }
         Node node = (Node) context;
@@ -111,9 +111,9 @@ class XalanXPathSupport implements XPathSupport {
             if (xresult instanceof XNumber) {
                 return new SimpleNumber(Double.valueOf(((XNumber) xresult).num()));
             }
-            throw new TemplateModelException("Cannot deal with type: " + xresult.getClass().getName());
+            throw new TemplateException("Cannot deal with type: " + xresult.getClass().getName());
         } catch (TransformerException te) {
-            throw new TemplateModelException(te);
+            throw new TemplateException(te);
         }
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/BaseNTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/BaseNTemplateNumberFormatFactory.java b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/BaseNTemplateNumberFormatFactory.java
index a670b62..df15635 100644
--- a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/BaseNTemplateNumberFormatFactory.java
+++ b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/BaseNTemplateNumberFormatFactory.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.manual.examples;
 import java.util.Locale;
 
 import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.util._NumberUtils;
 import org.apache.freemarker.core.util._StringUtils;
@@ -98,7 +98,7 @@ public class BaseNTemplateNumberFormatFactory extends TemplateNumberFormatFactor
         
         @Override
         public String formatToPlainText(TemplateNumberModel numberModel)
-                throws TemplateModelException, TemplateValueFormatException {
+                throws TemplateException, TemplateValueFormatException {
             Number n = TemplateFormatUtil.getNonNullNumber(numberModel);
             try {
                 return Integer.toString(_NumberUtils.toIntExact(n), base);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberFormatFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberFormatFactory.java b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberFormatFactory.java
index 2b50654..dcc26bd 100644
--- a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberFormatFactory.java
+++ b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberFormatFactory.java
@@ -21,7 +21,7 @@ package org.apache.freemarker.manual.examples;
 import java.util.Locale;
 
 import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.valueformat.TemplateNumberFormat;
 import org.apache.freemarker.core.valueformat.TemplateNumberFormatFactory;
@@ -58,7 +58,7 @@ public class UnitAwareTemplateNumberFormatFactory extends TemplateNumberFormatFa
 
         @Override
         public String formatToPlainText(TemplateNumberModel numberModel)
-                throws TemplateModelException, TemplateValueFormatException {
+                throws TemplateException, TemplateValueFormatException {
             String innerResult = innerFormat.formatToPlainText(numberModel);
             return numberModel instanceof UnitAwareTemplateNumberModel
                     ? innerResult + " " + ((UnitAwareTemplateNumberModel) numberModel).getUnit()

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberModel.java
----------------------------------------------------------------------
diff --git a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberModel.java b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberModel.java
index 65105c6..b81f913 100644
--- a/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberModel.java
+++ b/freemarker-manual/src/test/java/org/apache/freemarker/manual/examples/UnitAwareTemplateNumberModel.java
@@ -18,7 +18,7 @@
  */
 package org.apache.freemarker.manual.examples;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 
 public class UnitAwareTemplateNumberModel implements TemplateNumberModel {
@@ -32,7 +32,7 @@ public class UnitAwareTemplateNumberModel implements TemplateNumberModel {
     }
 
     @Override
-    public Number getAsNumber() throws TemplateModelException {
+    public Number getAsNumber() throws TemplateException {
         return value;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
index 207f18a..819458a 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/AllHttpScopesHashModel.java
@@ -26,9 +26,9 @@ import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpSession;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleHash;
 
 /**
@@ -74,7 +74,7 @@ public class AllHttpScopesHashModel extends SimpleHash {
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         // Lookup in page scope
         TemplateModel model = super.get(key);
         if (model != null) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
index 2121720..1e484fc 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/FreemarkerServlet.java
@@ -53,7 +53,6 @@ import org.apache.freemarker.core.TemplateNotFoundException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleHash;
 import org.apache.freemarker.core.outputformat.OutputFormat;
 import org.apache.freemarker.core.outputformat.impl.UndefinedOutputFormat;
@@ -916,7 +915,7 @@ public class FreemarkerServlet extends HttpServlet {
     protected TemplateModel createModel(ObjectWrapperAndUnwrapper objectWrapper,
                                         ServletContext servletContext,
                                         final HttpServletRequest request,
-                                        final HttpServletResponse response) throws TemplateModelException {
+                                        final HttpServletResponse response) throws TemplateException {
         try {
             AllHttpScopesHashModel params = new AllHttpScopesHashModel(objectWrapper, servletContext, request);
 
@@ -984,9 +983,9 @@ public class FreemarkerServlet extends HttpServlet {
             params.putUnlistedModel(KEY_REQUEST_PARAMETERS, requestParametersModel);
             return params;
         } catch (ServletException e) {
-            throw new TemplateModelException(e);
+            throw new TemplateException(e);
         } catch (IOException e) {
-            throw new TemplateModelException(e);
+            throw new TemplateException(e);
         }
     }
 
@@ -997,7 +996,7 @@ public class FreemarkerServlet extends HttpServlet {
      */
     @SuppressWarnings("unchecked")
     protected TaglibFactory createTaglibFactory(ObjectWrapper objectWrapper, ServletContext servletContext)
-            throws TemplateModelException {
+            throws TemplateException {
 
         List<MetaInfTldSource> metaInfTldSourcesFromSysProp = null;
         try {
@@ -1006,7 +1005,7 @@ public class FreemarkerServlet extends HttpServlet {
                     ? TaglibFactory.parseMetaInfTldLocations(InitParamParser.parseCommaSeparatedList(prop))
                     : Collections.emptyList());
         } catch (ParseException e) {
-            throw new TemplateModelException(
+            throw new TemplateException(
                     "Failed to parse system property \"" + SYSTEM_PROPERTY_META_INF_TLD_SOURCES + "\"", e);
         }
 
@@ -1030,7 +1029,7 @@ public class FreemarkerServlet extends HttpServlet {
             classpathTldsFromSysProp = (prop != null) ? InitParamParser.parseCommaSeparatedList(prop)
                     : Collections.<String>emptyList();
         } catch (ParseException e) {
-            throw new TemplateModelException(
+            throw new TemplateException(
                     "Failed to parse system property \"" + SYSTEM_PROPERTY_CLASSPATH_TLDS + "\"", e);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
index a14bbc2..cb6ee96 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpRequestHashModel.java
@@ -25,12 +25,12 @@ import java.util.Enumeration;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleCollection;
 
 /**
@@ -57,7 +57,7 @@ public final class HttpRequestHashModel implements TemplateHashModelEx {
     }
     
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         return wrapper.wrap(request.getAttribute(key));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
index 469dc29..1a0ff52 100644
--- a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
+++ b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/HttpSessionHashModel.java
@@ -26,10 +26,10 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpSession;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * TemplateHashModel wrapper for a HttpSession attributes.
@@ -78,12 +78,12 @@ public final class HttpSessionHashModel implements TemplateHashModel, Serializab
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         checkSessionExistence();
         return wrapper.wrap(session != null ? session.getAttribute(key) : null);
     }
 
-    private void checkSessionExistence() throws TemplateModelException {
+    private void checkSessionExistence() throws TemplateException {
         if (session == null && request != null) {
             session = request.getSession(false);
             if (session != null && servlet != null) {
@@ -96,7 +96,7 @@ public final class HttpSessionHashModel implements TemplateHashModel, Serializab
                 } catch (RuntimeException e) {
                     throw e;
                 } catch (Exception e) {
-                    throw new TemplateModelException(e);
+                    throw new TemplateException(e);
                 }
             }
         }
@@ -108,7 +108,7 @@ public final class HttpSessionHashModel implements TemplateHashModel, Serializab
     }
 
     @Override
-    public boolean isEmpty() throws TemplateModelException {
+    public boolean isEmpty() throws TemplateException {
         checkSessionExistence();
         return session == null || !session.getAttributeNames().hasMoreElements();
     }



[4/7] incubator-freemarker git commit: `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extend

Posted by dd...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/_EvalUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_EvalUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_EvalUtils.java
index 17f6459..3e21a2b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/_EvalUtils.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/_EvalUtils.java
@@ -30,12 +30,12 @@ import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
 import org.apache.freemarker.core.util.BugException;
+import org.apache.freemarker.core.util._ClassUtils;
 import org.apache.freemarker.core.valueformat.TemplateDateFormat;
 import org.apache.freemarker.core.valueformat.TemplateNumberFormat;
 import org.apache.freemarker.core.valueformat.TemplateValueFormat;
@@ -60,7 +60,7 @@ public class _EvalUtils {
      * @param expr {@code null} is allowed, but may results in less helpful error messages
      */
     public static String modelToString(TemplateScalarModel model, ASTExpression expr)
-    throws TemplateModelException {
+    throws TemplateException {
         String value = model.getAsString();
         if (value == null) {
             throw newModelHasStoredNullException(String.class, model, expr);
@@ -72,7 +72,7 @@ public class _EvalUtils {
      * @param expr {@code null} is allowed, but may results in less helpful error messages
      */
     public static Number modelToNumber(TemplateNumberModel model, ASTExpression expr)
-        throws TemplateModelException {
+        throws TemplateException {
         Number value = model.getAsNumber();
         if (value == null) throw newModelHasStoredNullException(Number.class, model, expr);
         return value;
@@ -82,17 +82,20 @@ public class _EvalUtils {
      * @param expr {@code null} is allowed, but may results in less helpful error messages
      */
     public static Date modelToDate(TemplateDateModel model, ASTExpression expr)
-        throws TemplateModelException {
+        throws TemplateException {
         Date value = model.getAsDate();
         if (value == null) throw newModelHasStoredNullException(Date.class, model, expr);
         return value;
     }
     
     /** Signals the buggy case where we have a non-null model, but it wraps a null. */
-    public static TemplateModelException newModelHasStoredNullException(
-            Class expected, TemplateModel model, ASTExpression expr) {
-        return new _TemplateModelException(expr,
-                _TemplateModelException.modelHasStoredNullDescription(expected, model));
+    public static TemplateException newModelHasStoredNullException(
+            Class<?> expected, TemplateModel model, ASTExpression expr) {
+        return new TemplateException(expr,
+                "The FreeMarker value exists, but has nothing inside it; the TemplateModel object (class: ",
+                model.getClass().getName(), ") has returned a null",
+                (expected != null ? new Object[] { " instead of a ", _ClassUtils.getShortClassName(expected) } : ""),
+                ". This is possibly a bug in the non-FreeMarker code that builds the data-model.");
     }
 
     /**
@@ -355,19 +358,19 @@ public class _EvalUtils {
             throws TemplateException {
         if (tm instanceof TemplateNumberModel) {
             TemplateNumberModel tnm = (TemplateNumberModel) tm; 
-            TemplateNumberFormat format = env.getTemplateNumberFormat(exp, false);
+            TemplateNumberFormat format = env.getTemplateNumberFormat(exp);
             try {
                 return assertFormatResultNotNull(format.format(tnm));
             } catch (TemplateValueFormatException e) {
-                throw MessageUtils.newCantFormatNumberException(format, exp, e, false);
+                throw MessageUtils.newCantFormatNumberException(format, exp, e);
             }
         } else if (tm instanceof TemplateDateModel) {
             TemplateDateModel tdm = (TemplateDateModel) tm;
-            TemplateDateFormat format = env.getTemplateDateFormat(tdm, exp, false);
+            TemplateDateFormat format = env.getTemplateDateFormat(tdm, exp);
             try {
                 return assertFormatResultNotNull(format.format(tdm));
             } catch (TemplateValueFormatException e) {
-                throw MessageUtils.newCantFormatDateException(format, exp, e, false);
+                throw MessageUtils.newCantFormatDateException(format, exp, e);
             }
         } else if (tm instanceof TemplateMarkupOutputModel) {
             return tm;
@@ -390,19 +393,19 @@ public class _EvalUtils {
             throws TemplateException {
         if (tm instanceof TemplateNumberModel) {
             TemplateNumberModel tnm = (TemplateNumberModel) tm; 
-            TemplateNumberFormat format = env.getTemplateNumberFormat(exp, false);
+            TemplateNumberFormat format = env.getTemplateNumberFormat(exp);
             try {
                 return ensureFormatResultString(format.format(tnm), exp, env);
             } catch (TemplateValueFormatException e) {
-                throw MessageUtils.newCantFormatNumberException(format, exp, e, false);
+                throw MessageUtils.newCantFormatNumberException(format, exp, e);
             }
         } else if (tm instanceof TemplateDateModel) {
             TemplateDateModel tdm = (TemplateDateModel) tm;
-            TemplateDateFormat format = env.getTemplateDateFormat(tdm, exp, false);
+            TemplateDateFormat format = env.getTemplateDateFormat(tdm, exp);
             try {
                 return ensureFormatResultString(format.format(tdm), exp, env);
             } catch (TemplateValueFormatException e) {
-                throw MessageUtils.newCantFormatDateException(format, exp, e, false);
+                throw MessageUtils.newCantFormatDateException(format, exp, e);
             }
         } else { 
             return coerceModelToTextualCommon(tm, exp, seqTip, false, false, env);
@@ -421,9 +424,9 @@ public class _EvalUtils {
     static String coerceModelToPlainText(TemplateModel tm, ASTExpression exp, String seqTip,
             Environment env) throws TemplateException {
         if (tm instanceof TemplateNumberModel) {
-            return assertFormatResultNotNull(env.formatNumberToPlainText((TemplateNumberModel) tm, exp, false));
+            return assertFormatResultNotNull(env.formatNumberToPlainText((TemplateNumberModel) tm, exp));
         } else if (tm instanceof TemplateDateModel) {
-            return assertFormatResultNotNull(env.formatDateToPlainText((TemplateDateModel) tm, exp, false));
+            return assertFormatResultNotNull(env.formatDateToPlainText((TemplateDateModel) tm, exp));
         } else {
             return coerceModelToTextualCommon(tm, exp, seqTip, false, false, env);
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
index 7fcf25d..0039249 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
@@ -35,9 +35,9 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Properties;
 
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.JavaMethodModel;
 import org.apache.freemarker.core.model.impl.RestrictedObjectWrapper;
@@ -58,8 +58,8 @@ import org.apache.freemarker.core.templateresolver.OrMatcher;
 import org.apache.freemarker.core.templateresolver.PathGlobMatcher;
 import org.apache.freemarker.core.templateresolver.PathRegexMatcher;
 import org.apache.freemarker.core.util.BugException;
-import org.apache.freemarker.core.util.TemplateLanguageUtils;
 import org.apache.freemarker.core.util.GenericParseException;
+import org.apache.freemarker.core.util.TemplateLanguageUtils;
 import org.apache.freemarker.core.util._ClassUtils;
 import org.apache.freemarker.core.util._StringUtils;
 
@@ -997,7 +997,7 @@ public class _ObjectBuilderSettingEvaluator {
                 for (int i = 0; i < positionalParamValues.size(); i++) {
                     try {
                         tmArgs[i] = ow.wrap(positionalParamValues.get(i));
-                    } catch (TemplateModelException e) {
+                    } catch (ObjectWrappingException e) {
                         throw new _ObjectBuilderSettingEvaluationException("Failed to wrap arg #" + (i + 1), e);
                     }
                 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateModelException.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateModelException.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateModelException.java
deleted file mode 100644
index 10ad99f..0000000
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateModelException.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, 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.
- */
-
-package org.apache.freemarker.core;
-
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.util._ClassUtils;
-
-public class _TemplateModelException extends TemplateModelException {
-
-    // Note: On Java 5 we will use `String descPart1, Object... furtherDescParts` instead of `Object[] descriptionParts`
-    //       and `String description`. That's why these are at the end of the parameter list.
-    
-    // -----------------------------------------------------------------------------------------------------------------
-    // Permutation group:
-    
-    public _TemplateModelException(String description) {
-        super(description);
-    }
-
-    // -----------------------------------------------------------------------------------------------------------------
-    // Permutation group:
-
-    public _TemplateModelException(Throwable cause, String description) {
-        this(cause, null, description);
-    }
-
-    public _TemplateModelException(Environment env, String description) {
-        this((Throwable) null, env, description);
-    }
-    
-    public _TemplateModelException(Throwable cause, Environment env) {
-        this(cause, env, (String) null);
-    }
-
-    public _TemplateModelException(Throwable cause) {
-        this(cause, null, (String) null);
-    }
-    
-    public _TemplateModelException(Throwable cause, Environment env, String description) {
-        super(cause, env, description, true);
-    }
-
-    // -----------------------------------------------------------------------------------------------------------------
-    // Permutation group:
-    
-    public _TemplateModelException(_ErrorDescriptionBuilder description) {
-        this(null, description);
-    }
-
-    public _TemplateModelException(Environment env, _ErrorDescriptionBuilder description) {
-        this(null, env, description);
-    }
-
-    public _TemplateModelException(Throwable cause, Environment env, _ErrorDescriptionBuilder description) {
-        super(cause, env, description, true);
-    }
-
-    // -----------------------------------------------------------------------------------------------------------------
-    // Permutation group:
-    
-    public _TemplateModelException(Object... descriptionParts) {
-        this((Environment) null, descriptionParts);
-    }
-
-    public _TemplateModelException(Environment env, Object... descriptionParts) {
-        this((Throwable) null, env, descriptionParts);
-    }
-
-    public _TemplateModelException(Throwable cause, Object... descriptionParts) {
-        this(cause, null, descriptionParts);
-    }
-
-    public _TemplateModelException(Throwable cause, Environment env, Object... descriptionParts) {
-        super(cause, env, new _ErrorDescriptionBuilder(descriptionParts), true);
-    }
-
-    // -----------------------------------------------------------------------------------------------------------------
-    // Permutation group:
-    
-    public _TemplateModelException(ASTExpression blamed, Object... descriptionParts) {
-        this(blamed, null, descriptionParts);
-    }
-
-    public _TemplateModelException(ASTExpression blamed, Environment env, Object... descriptionParts) {
-        this(blamed, null, env, descriptionParts);
-    }
-
-    public _TemplateModelException(ASTExpression blamed, Throwable cause, Environment env, Object... descriptionParts) {
-        super(cause, env, new _ErrorDescriptionBuilder(descriptionParts).blame(blamed), true);
-    }
-
-    // -----------------------------------------------------------------------------------------------------------------
-    // Permutation group:
-    
-    public _TemplateModelException(ASTExpression blamed, String description) {
-        this(blamed, null, description);
-    }
-
-    public _TemplateModelException(ASTExpression blamed, Environment env, String description) {
-        this(blamed, null, env, description);
-    }
-
-    public _TemplateModelException(ASTExpression blamed, Throwable cause, Environment env, String description) {
-        super(cause, env, new _ErrorDescriptionBuilder(description).blame(blamed), true);
-    }
-
-    static Object[] modelHasStoredNullDescription(Class expected, TemplateModel model) {
-        return new Object[] {
-                "The FreeMarker value exists, but has nothing inside it; the TemplateModel object (class: ",
-                model.getClass().getName(), ") has returned a null",
-                (expected != null ? new Object[] { " instead of a ", _ClassUtils.getShortClassName(expected) } : ""),
-                ". This is possibly a bug in the non-FreeMarker code that builds the data-model." };
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
index 5f4c473..41d1742 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
@@ -23,7 +23,7 @@ import java.rmi.Remote;
 import java.rmi.RemoteException;
 import java.util.Date;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 
 /**
  * Represents the debugger-side mirror of a TemplateModel object, a Template
@@ -52,51 +52,51 @@ public interface DebugModel extends Remote {
     public static final int TYPE_CONFIGURATION = 8192;
     
     public String getAsString()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
         
     public Number getAsNumber()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
     
     public boolean getAsBoolean()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
     
     public Date getAsDate()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
     
     public int getDateType()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
         
     public int size()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
         
     public DebugModel get(int index)
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
     
     public DebugModel[] get(int fromIndex, int toIndex)
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
         
     public DebugModel get(String key)
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
         
     public DebugModel[] get(String[] keys)
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
     
     public DebugModel[] getCollection()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
 
     public String[] keys()
-    throws TemplateModelException,
+    throws TemplateException,
         RemoteException;
     
     public int getModelTypes()

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
index 20e9f50..01becc2 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
@@ -25,6 +25,7 @@ import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
@@ -33,7 +34,6 @@ import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -57,17 +57,17 @@ class RmiDebugModelImpl extends UnicastRemoteObject implements DebugModel {
         return (DebugModel) RmiDebuggedEnvironmentImpl.getCachedWrapperFor(tm);
     }
     @Override
-    public String getAsString() throws TemplateModelException {
+    public String getAsString() throws TemplateException {
         return ((TemplateScalarModel) model).getAsString();
     }
 
     @Override
-    public Number getAsNumber() throws TemplateModelException {
+    public Number getAsNumber() throws TemplateException {
         return ((TemplateNumberModel) model).getAsNumber();
     }
 
     @Override
-    public Date getAsDate() throws TemplateModelException {
+    public Date getAsDate() throws TemplateException {
         return ((TemplateDateModel) model).getAsDate();
     }
 
@@ -77,12 +77,12 @@ class RmiDebugModelImpl extends UnicastRemoteObject implements DebugModel {
     }
 
     @Override
-    public boolean getAsBoolean() throws TemplateModelException {
+    public boolean getAsBoolean() throws TemplateException {
         return ((TemplateBooleanModel) model).getAsBoolean();
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         if (model instanceof TemplateSequenceModel) {
             return ((TemplateSequenceModel) model).size();
         }
@@ -90,12 +90,12 @@ class RmiDebugModelImpl extends UnicastRemoteObject implements DebugModel {
     }
 
     @Override
-    public DebugModel get(int index) throws TemplateModelException, RemoteException {
+    public DebugModel get(int index) throws TemplateException, RemoteException {
         return getDebugModel(((TemplateSequenceModel) model).get(index));
     }
     
     @Override
-    public DebugModel[] get(int fromIndex, int toIndex) throws TemplateModelException, RemoteException {
+    public DebugModel[] get(int fromIndex, int toIndex) throws TemplateException, RemoteException {
         DebugModel[] dm = new DebugModel[toIndex - fromIndex];
         TemplateSequenceModel s = (TemplateSequenceModel) model;
         for (int i = fromIndex; i < toIndex; i++) {
@@ -105,7 +105,7 @@ class RmiDebugModelImpl extends UnicastRemoteObject implements DebugModel {
     }
 
     @Override
-    public DebugModel[] getCollection() throws TemplateModelException, RemoteException {
+    public DebugModel[] getCollection() throws TemplateException, RemoteException {
         List list = new ArrayList();
         TemplateModelIterator i = ((TemplateCollectionModel) model).iterator();
         while (i.hasNext()) {
@@ -115,12 +115,12 @@ class RmiDebugModelImpl extends UnicastRemoteObject implements DebugModel {
     }
     
     @Override
-    public DebugModel get(String key) throws TemplateModelException, RemoteException {
+    public DebugModel get(String key) throws TemplateException, RemoteException {
         return getDebugModel(((TemplateHashModel) model).get(key));
     }
     
     @Override
-    public DebugModel[] get(String[] keys) throws TemplateModelException, RemoteException {
+    public DebugModel[] get(String[] keys) throws TemplateException, RemoteException {
         DebugModel[] dm = new DebugModel[keys.length];
         TemplateHashModel h = (TemplateHashModel) model;
         for (int i = 0; i < keys.length; i++) {
@@ -130,7 +130,7 @@ class RmiDebugModelImpl extends UnicastRemoteObject implements DebugModel {
     }
 
     @Override
-    public String[] keys() throws TemplateModelException {
+    public String[] keys() throws TemplateException {
         TemplateHashModelEx h = (TemplateHashModelEx) model;
         List list = new ArrayList();
         TemplateModelIterator i = h.keys().iterator();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java
index f23186c..af0958a 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebuggedEnvironmentImpl.java
@@ -37,10 +37,10 @@ import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.MutableProcessingConfiguration;
 import org.apache.freemarker.core.ProcessingConfiguration;
 import org.apache.freemarker.core.Template;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.SimpleCollection;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -138,7 +138,7 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn
         }
 
         @Override
-        public TemplateCollectionModel values() throws TemplateModelException {
+        public TemplateCollectionModel values() throws TemplateException {
             Collection keys = keySet();
             List list = new ArrayList(keys.size());
             
@@ -184,7 +184,7 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn
         }
         
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) throws TemplateException {
             return null; // TODO
         }
 
@@ -216,7 +216,7 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn
         }
 
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) throws TemplateException {
             if ("sharedVariables".equals(key)) {
                 return sharedVariables; 
             } else {
@@ -242,12 +242,12 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn
         }
 
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) throws TemplateException {
             if ("configuration".equals(key)) {
                 try {
                     return (TemplateModel) getCachedWrapperFor(((Template) ProcessingConfiguration).getConfiguration());
                 } catch (RemoteException e) {
-                    throw new TemplateModelException(e);
+                    throw new TemplateException(e);
                 }
             }
             if ("name".equals(key)) {
@@ -273,13 +273,13 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn
             Collection keySet() {
                 try {
                     return ((Environment) ProcessingConfiguration).getKnownVariableNames();
-                } catch (TemplateModelException e) {
+                } catch (TemplateException e) {
                     throw new UndeclaredThrowableException(e);
                 }
             }
         
             @Override
-            public TemplateModel get(String key) throws TemplateModelException {
+            public TemplateModel get(String key) throws TemplateException {
                 return ((Environment) ProcessingConfiguration).getVariable(key);
             }
         };
@@ -294,7 +294,7 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn
         }
 
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) throws TemplateException {
             if ("currentNamespace".equals(key)) {
                 return ((Environment) ProcessingConfiguration).getCurrentNamespace();
             }
@@ -314,14 +314,14 @@ class RmiDebuggedEnvironmentImpl extends RmiDebugModelImpl implements DebuggedEn
                 try {
                     return (TemplateModel) getCachedWrapperFor(((Environment) ProcessingConfiguration).getMainTemplate());
                 } catch (RemoteException e) {
-                    throw new TemplateModelException(e);
+                    throw new TemplateException(e);
                 }
             }
             if ("currentTemplate".equals(key)) {
                 try {
                     return (TemplateModel) getCachedWrapperFor(((Environment) ProcessingConfiguration).getCurrentTemplate());
                 } catch (RemoteException e) {
-                    throw new TemplateModelException(e);
+                    throw new TemplateException(e);
                 }
             }
             return super.get(key);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionExModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionExModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionExModel.java
index 06f3366..34f8029 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionExModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyCollectionExModel.java
@@ -21,20 +21,22 @@ package org.apache.freemarker.core.model;
 
 import java.io.Serializable;
 
+import org.apache.freemarker.core.TemplateException;
+
 class EmptyCollectionExModel implements TemplateCollectionModelEx, Serializable {
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return 0;
     }
 
     @Override
-    public boolean isEmpty() throws TemplateModelException {
+    public boolean isEmpty() throws TemplateException {
         return true;
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return TemplateModelIterator.EMPTY_ITERATOR;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java
index a8aa2b7..0b32160 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyHashModel.java
@@ -21,35 +21,37 @@ package org.apache.freemarker.core.model;
 
 import java.io.Serializable;
 
+import org.apache.freemarker.core.TemplateException;
+
 class EmptyHashModel implements TemplateHashModelEx2, Serializable {
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return 0;
     }
 
     @Override
-    public TemplateCollectionModel keys() throws TemplateModelException {
+    public TemplateCollectionModel keys() throws TemplateException {
         return TemplateCollectionModel.EMPTY_COLLECTION;
     }
 
     @Override
-    public TemplateCollectionModel values() throws TemplateModelException {
+    public TemplateCollectionModel values() throws TemplateException {
         return TemplateCollectionModel.EMPTY_COLLECTION;
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         return null;
     }
 
     @Override
-    public boolean isEmpty() throws TemplateModelException {
+    public boolean isEmpty() throws TemplateException {
         return true;
     }
 
     @Override
-    public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
+    public KeyValuePairIterator keyValuePairIterator() throws TemplateException {
         return EmptyKeyValuePairIterator.EMPTY_KEY_VALUE_PAIR_ITERATOR;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIteratorModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIteratorModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIteratorModel.java
index be0f0ea..a0b47e7 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIteratorModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyIteratorModel.java
@@ -21,15 +21,17 @@ package org.apache.freemarker.core.model;
 
 import java.io.Serializable;
 
+import org.apache.freemarker.core.TemplateException;
+
 class EmptyIteratorModel implements TemplateModelIterator, Serializable {
 
     @Override
-    public TemplateModel next() throws TemplateModelException {
-        throw new TemplateModelException("The collection has no more elements.");
+    public TemplateModel next() throws TemplateException {
+        throw new TemplateException("The collection has no more elements.");
     }
 
     @Override
-    public boolean hasNext() throws TemplateModelException {
+    public boolean hasNext() {
         return false;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyKeyValuePairIterator.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyKeyValuePairIterator.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyKeyValuePairIterator.java
index 37073a3..83a0650 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyKeyValuePairIterator.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptyKeyValuePairIterator.java
@@ -21,15 +21,17 @@ package org.apache.freemarker.core.model;
 
 import java.util.NoSuchElementException;
 
+import org.apache.freemarker.core.TemplateException;
+
 class EmptyKeyValuePairIterator implements TemplateHashModelEx2.KeyValuePairIterator {
 
     @Override
-    public boolean hasNext() throws TemplateModelException {
+    public boolean hasNext() throws TemplateException {
         return false;
     }
 
     @Override
-    public TemplateHashModelEx2.KeyValuePair next() throws TemplateModelException {
+    public TemplateHashModelEx2.KeyValuePair next() throws TemplateException {
         throw new NoSuchElementException("Can't retrieve element from empty key-value pair iterator.");
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptySequenceModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptySequenceModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptySequenceModel.java
index 5f352af..b6a176e 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptySequenceModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/EmptySequenceModel.java
@@ -21,15 +21,17 @@ package org.apache.freemarker.core.model;
 
 import java.io.Serializable;
 
+import org.apache.freemarker.core.TemplateException;
+
 class EmptySequenceModel implements TemplateSequenceModel, Serializable {
 
     @Override
-    public TemplateModel get(int index) throws TemplateModelException {
+    public TemplateModel get(int index) throws TemplateException {
         return null;
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return 0;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
index ecd4ebb..6a25f09 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
@@ -63,8 +63,8 @@ implements TemplateBooleanModel, TemplateScalarModel, TemplateSequenceModel, Tem
     }
 
     @Override
-    public TemplateModel get(int i) throws TemplateModelException {
-        throw new TemplateModelException("Empty list");
+    public TemplateModel get(int i) throws TemplateException {
+        throw new TemplateException("Can't get item from an empty sequence.");
     }
 
     @Override
@@ -93,7 +93,7 @@ implements TemplateBooleanModel, TemplateScalarModel, TemplateSequenceModel, Tem
     }
 
     @Override
-    public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
+    public KeyValuePairIterator keyValuePairIterator() throws TemplateException {
         return EmptyKeyValuePairIterator.EMPTY_KEY_VALUE_PAIR_ITERATOR;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapper.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapper.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapper.java
index 42f09d8..ff251aa 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapper.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapper.java
@@ -54,6 +54,6 @@ public interface ObjectWrapper {
      *     restricts how it can be used, like, then it can't be used to wrap
      *     {@linkplain Configuration#getSharedVariables() shared variables}).
      */
-    TemplateModel wrap(Object obj) throws TemplateModelException;
+    TemplateModel wrap(Object obj) throws ObjectWrappingException;
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperAndUnwrapper.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperAndUnwrapper.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperAndUnwrapper.java
index 1161cca..fe13d02 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperAndUnwrapper.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperAndUnwrapper.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * <b>Experimental - subject to change:</b> Adds functionality to {@link ObjectWrapper} that creates a plain Java object
  * from a {@link TemplateModel}. This is usually implemented by {@link ObjectWrapper}-s and reverses
@@ -49,12 +51,12 @@ public interface ObjectWrapperAndUnwrapper extends ObjectWrapper {
      *         the template model. {@code null} must not be used to indicate an unwrapping failure. It must NOT be
      *         {@link #CANT_UNWRAP_TO_TARGET_CLASS}.
      * 
-     * @throws TemplateModelException
+     * @throws TemplateException
      *             If the unwrapping fails from any reason.
      * 
      * @see #tryUnwrapTo(TemplateModel, Class)
      */
-    Object unwrap(TemplateModel tm) throws TemplateModelException;
+    Object unwrap(TemplateModel tm) throws TemplateException;
 
     /**
      * Attempts to unwrap a {@link TemplateModel} to a plain Java object that's the instance of the given class (or is
@@ -71,12 +73,12 @@ public interface ObjectWrapperAndUnwrapper extends ObjectWrapper {
      *         result can be {@code null}). However, {@link #CANT_UNWRAP_TO_TARGET_CLASS} must not be returned if the
      *         {@code targetClass} parameter was {@code Object.class}.
      * 
-     * @throws TemplateModelException
+     * @throws TemplateException
      *             If the unwrapping fails for a reason than doesn't fit the meaning of the
      *             {@link #CANT_UNWRAP_TO_TARGET_CLASS} return value.
      * 
      * @see #unwrap(TemplateModel)
      */
-    Object tryUnwrapTo(TemplateModel tm, Class<?> targetClass) throws TemplateModelException;
+    Object tryUnwrapTo(TemplateModel tm, Class<?> targetClass) throws TemplateException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperWithAPISupport.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperWithAPISupport.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperWithAPISupport.java
index 22b1f63..2140204 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperWithAPISupport.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrapperWithAPISupport.java
@@ -37,6 +37,6 @@ public interface ObjectWrapperWithAPISupport extends ObjectWrapper {
      * 
      * @return The {@link TemplateModel} through which the API of the object can be accessed. Can't be {@code null}.
      */
-    TemplateHashModel wrapAsAPI(Object obj) throws TemplateModelException;
+    TemplateHashModel wrapAsAPI(Object obj) throws ObjectWrappingException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrappingException.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrappingException.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrappingException.java
new file mode 100644
index 0000000..3ed9c7e
--- /dev/null
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/ObjectWrappingException.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, 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.
+ */
+
+package org.apache.freemarker.core.model;
+
+import org.apache.freemarker.core.TemplateException;
+
+/**
+ * Thrown by {@link ObjectWrapper#wrap(Object)}.
+ */
+public class ObjectWrappingException extends TemplateException {
+
+    public ObjectWrappingException(String description, Throwable cause) {
+        super(description, cause);
+    }
+
+    public ObjectWrappingException(String description) {
+        super(description);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateBooleanModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateBooleanModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateBooleanModel.java
index 555e619..cf37ef2 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateBooleanModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateBooleanModel.java
@@ -21,6 +21,8 @@ package org.apache.freemarker.core.model;
 
 import java.io.Serializable;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * "boolean" template language data type; same as in Java; either {@code true} or {@code false}.
  * 
@@ -33,7 +35,7 @@ public interface TemplateBooleanModel extends TemplateModel, Serializable {
     /**
      * @return whether to interpret this object as true or false in a boolean context
      */
-    boolean getAsBoolean() throws TemplateModelException;
+    boolean getAsBoolean() throws TemplateException;
     
     /**
      * A singleton object to represent boolean false

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java
index 705f82a..d1db16c 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModel.java
@@ -21,6 +21,8 @@ package org.apache.freemarker.core.model;
 
 import java.util.Collection;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * "collection" template language data type: a collection of values that can be enumerated, but can't be or not meant to
  * be accessed by index or key. As such, this is not a super-interface of {@link TemplateSequenceModel}, and
@@ -30,7 +32,7 @@ import java.util.Collection;
  * 
  * <p>
  * The enumeration should be repeatable if that's possible with reasonable effort, otherwise a second enumeration
- * attempt is allowed to throw an {@link TemplateModelException}. Generally, the interface user Java code need not
+ * attempt is allowed to throw an {@link TemplateException}. Generally, the interface user Java code need not
  * handle that kind of exception, as in practice only the template author can handle it, by not listing such collections
  * twice.
  * 
@@ -45,6 +47,6 @@ public interface TemplateCollectionModel extends TemplateModel {
     /**
      * Retrieves a template model iterator that is used to iterate over the elements in this collection.
      */
-    TemplateModelIterator iterator() throws TemplateModelException;
+    TemplateModelIterator iterator() throws TemplateException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModelEx.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModelEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModelEx.java
index 2da95c1..730a267 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModelEx.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateCollectionModelEx.java
@@ -21,6 +21,8 @@ package org.apache.freemarker.core.model;
 
 import java.util.Collection;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * "extended collection" template language data type: Adds size/emptiness querybility and "contains" test to
  * {@link TemplateCollectionModel}. The added extra operations is provided by all Java {@link Collection}-s, and
@@ -32,12 +34,12 @@ public interface TemplateCollectionModelEx extends TemplateCollectionModel {
      * Returns the number items in this collection, or {@link Integer#MAX_VALUE}, if there are more than
      * {@link Integer#MAX_VALUE} items.
      */
-    int size() throws TemplateModelException;
+    int size() throws TemplateException;
 
     /**
      * Returns if the collection contains any elements. This differs from {@code size() != 0} only in that the exact
      * number of items need not be calculated.
      */
-    boolean isEmpty() throws TemplateModelException;
+    boolean isEmpty() throws TemplateException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 024dc8e..df5db95 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
@@ -24,6 +24,8 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.List;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * "date", "time" and "date-time" template language data types: corresponds to {@link java.util.Date}. Contrary to Java,
  * FreeMarker distinguishes date (no time part), time and date-time values.
@@ -62,7 +64,7 @@ public interface TemplateDateModel extends TemplateModel {
     /**
      * Returns the date value. The return value must not be {@code null}.
      */
-    Date getAsDate() throws TemplateModelException;
+    Date getAsDate() throws TemplateException;
 
     /**
      * Returns the type of the date. It can be any of {@link #TIME}, 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModel.java
index f60ce79..8125233 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModel.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * "hash" template language data type: an object that contains other objects accessible through string keys
  * (sub-variable names).
@@ -37,7 +39,7 @@ public interface TemplateHashModel extends TemplateModel {
      * @return the <tt>TemplateModel</tt> referred to by the key,
      * or null if not found.
      */
-    TemplateModel get(String key) throws TemplateModelException;
+    TemplateModel get(String key) throws TemplateException;
 
-    boolean isEmpty() throws TemplateModelException;
+    boolean isEmpty() throws TemplateException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java
index c95a21d..cd2c0ee 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx.java
@@ -19,6 +19,7 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.impl.SimpleHash;
 
 /**
@@ -34,18 +35,18 @@ public interface TemplateHashModelEx extends TemplateHashModel {
     /**
      * @return the number of key/value mappings in the hash.
      */
-    int size() throws TemplateModelException;
+    int size() throws TemplateException;
 
     /**
      * @return a collection containing the keys in the hash. Every element of 
      *      the returned collection must implement the {@link TemplateScalarModel}
      *      (as the keys of hashes are always strings).
      */
-    TemplateCollectionModel keys() throws TemplateModelException;
+    TemplateCollectionModel keys() throws TemplateException;
 
     /**
      * @return a collection containing the values in the hash. The elements of the
      * returned collection can be any kind of {@link TemplateModel}-s.
      */
-    TemplateCollectionModel values() throws TemplateModelException;
+    TemplateCollectionModel values() throws TemplateException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx2.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx2.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx2.java
index 6980c82..cf8cee4 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx2.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateHashModelEx2.java
@@ -21,6 +21,8 @@ package org.apache.freemarker.core.model;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * Adds key-value pair listing capability to {@link TemplateHashModelEx}. While in many cases that can also be achieved
  * with {@link #keys()} and then {@link #get(String)}, that has some problems. One is that {@link #get(String)} only
@@ -32,7 +34,7 @@ public interface TemplateHashModelEx2 extends TemplateHashModelEx {
     /**
      * @return The iterator that walks through the key-value pairs in the hash. Not {@code null}. 
      */
-    KeyValuePairIterator keyValuePairIterator() throws TemplateModelException;
+    KeyValuePairIterator keyValuePairIterator() throws TemplateException;
     
     /**
      * A key-value pair in a hash; used for {@link KeyValuePairIterator}.
@@ -42,17 +44,17 @@ public interface TemplateHashModelEx2 extends TemplateHashModelEx {
         /**
          * @return Any type of {@link TemplateModel}, maybe {@code null} (if the hash entry key is {@code null}).
          */
-        TemplateModel getKey() throws TemplateModelException;
+        TemplateModel getKey() throws TemplateException;
         
         /**
          * @return Any type of {@link TemplateModel}, maybe {@code null} (if the hash entry value is {@code null}).
          */
-        TemplateModel getValue() throws TemplateModelException;
+        TemplateModel getValue() throws TemplateException;
     }
     
     /**
      * Iterates over the key-value pairs in a hash. This is very similar to an {@link Iterator}, but has a fixed item
-     * type, can throw {@link TemplateModelException}-s, and has no {@code remove()} method. 
+     * type, can throw {@link TemplateException}-s, and has no {@code remove()} method.
      */
     interface KeyValuePairIterator {
 
@@ -61,7 +63,7 @@ public interface TemplateHashModelEx2 extends TemplateHashModelEx {
         /**
          * Similar to {@link Iterator#hasNext()}.
          */
-        boolean hasNext() throws TemplateModelException;
+        boolean hasNext() throws TemplateException;
         
         /**
          * Similar to {@link Iterator#next()}.
@@ -70,7 +72,7 @@ public interface TemplateHashModelEx2 extends TemplateHashModelEx {
          * 
          * @throws NoSuchElementException
          */
-        KeyValuePair next() throws TemplateModelException;
+        KeyValuePair next() throws TemplateException;
     }
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelException.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelException.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelException.java
deleted file mode 100644
index c9d6aa9..0000000
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelException.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, 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.
- */
-
-package org.apache.freemarker.core.model;
-
-import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core._ErrorDescriptionBuilder;
-
-/**
- * {@link ObjectWrapper}-s may throw this when wrapping/unwrapping fails, or {@link TemplateModel} methods throw this
- * if the requested data can't be retrieved. {@link TemplateCallableModel}-s should typically throw
- * {@link TemplateException} instead (like when a required argument is missing).
- */
-public class TemplateModelException extends TemplateException {
-
-    /**
-     * Constructs a <tt>TemplateModelException</tt> with no
-     * specified detail message.
-     */
-    public TemplateModelException() {
-        this(null, null);
-    }
-
-    /**
-     * Constructs a <tt>TemplateModelException</tt> with the
-     * specified detail message.
-     *
-     * @param description the detail message.
-     */
-    public TemplateModelException(String description) {
-        this(description, null);
-    }
-
-    /**
-     * The same as {@link #TemplateModelException(Throwable)}; it's exists only for binary
-     * backward-compatibility.
-     */
-    public TemplateModelException(Exception cause) {
-        this(null, cause);
-    }
-
-    /**
-     * Constructs a <tt>TemplateModelException</tt> with the given underlying
-     * Exception, but no detail message.
-     *
-     * @param cause the underlying {@link Exception} that caused this
-     * exception to be raised
-     */
-    public TemplateModelException(Throwable cause) {
-        this(null, cause);
-    }
-
-    
-    /**
-     * The same as {@link #TemplateModelException(String, Throwable)}; it's exists only for binary
-     * backward-compatibility.
-     */
-    public TemplateModelException(String description, Exception cause) {
-        super(description, cause, null);
-    }
-
-    /**
-     * Constructs a TemplateModelException with both a description of the error
-     * that occurred and the underlying Exception that caused this exception
-     * to be raised.
-     *
-     * @param description the description of the error that occurred
-     * @param cause the underlying {@link Exception} that caused this
-     * exception to be raised
-     */
-    public TemplateModelException(String description, Throwable cause) {
-        super(description, cause, null);
-    }
-
-    /**
-     * Don't use this; this is to be used internally by FreeMarker.
-     * @param preventAmbiguity its value is ignored; it's only to prevent constructor selection ambiguities for
-     *     backward-compatibility
-     */
-    protected TemplateModelException(Throwable cause, Environment env, String description,
-            boolean preventAmbiguity) {
-        super(description, cause, env);
-    }
-    
-    /**
-     * Don't use this; this is to be used internally by FreeMarker.
-     * @param preventAmbiguity its value is ignored; it's only to prevent constructor selection ambiguities for
-     *     backward-compatibility
-     */
-    protected TemplateModelException(
-            Throwable cause, Environment env, _ErrorDescriptionBuilder descriptionBuilder,
-            boolean preventAmbiguity) {
-        super(cause, env, null, descriptionBuilder);
-    }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelIterator.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelIterator.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelIterator.java
index 04c8de1..cd24cbb 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelIterator.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelIterator.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * Used to iterate over a set of template models <em>once</em>; usually returned from
  * {@link TemplateCollectionModel#iterator()}. Note that it's not a {@link TemplateModel}.
@@ -29,14 +31,14 @@ public interface TemplateModelIterator {
 
     /**
      * Returns the next model.
-     * @throws TemplateModelException if the next model can not be retrieved
+     * @throws TemplateException if the next model can not be retrieved
      *   (i.e. because the iterator is exhausted).
      */
-    TemplateModel next() throws TemplateModelException;
+    TemplateModel next() throws TemplateException;
 
     /**
      * @return whether there are any more items to iterate over.
      */
-    boolean hasNext() throws TemplateModelException;
+    boolean hasNext() throws TemplateException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelWithAPISupport.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelWithAPISupport.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelWithAPISupport.java
index 8ca2233..fbc0d00 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelWithAPISupport.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateModelWithAPISupport.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * <b>Experimental - subject to change:</b> A {@link TemplateModel} on which the {@code ?api} operation can be applied.
  * 
@@ -32,6 +34,6 @@ public interface TemplateModelWithAPISupport extends TemplateModel {
      * Returns the model that exposes the (Java) API of the value. This is usually implemented by delegating to
      * {@link ObjectWrapperWithAPISupport#wrapAsAPI(Object)}.
      */
-    TemplateModel getAPI() throws TemplateModelException;
+    TemplateModel getAPI() throws TemplateException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModel.java
index d5df64c..81a64b2 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModel.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * "node" template language data type: an object that is a node in a tree.
  * A tree of nodes can be recursively <em>visited</em> using the &lt;#visit...&gt; and &lt;#recurse...&gt;
@@ -37,14 +39,14 @@ public interface TemplateNodeModel extends TemplateModel {
      * @return the parent of this node or null, in which case
      * this node is the root of the tree.
      */
-    TemplateNodeModel getParentNode() throws TemplateModelException;
+    TemplateNodeModel getParentNode() throws TemplateException;
     
     /**
      * @return a sequence containing this node's children.
      * If the returned value is null or empty, this is essentially 
      * a leaf node.
      */
-    TemplateSequenceModel getChildNodes() throws TemplateModelException;
+    TemplateSequenceModel getChildNodes() throws TemplateException;
 
     /**
      * @return a String that is used to determine the processing
@@ -54,7 +56,7 @@ public interface TemplateNodeModel extends TemplateModel {
      * returns "@text" for text nodes, "@pi" for processing instructions,
      * and so on.
      */    
-    String getNodeName() throws TemplateModelException;
+    String getNodeName() throws TemplateException;
     
     /**
      * @return a String describing the <em>type</em> of node this is.
@@ -63,7 +65,7 @@ public interface TemplateNodeModel extends TemplateModel {
      * trees could return whatever it appropriate for that application. It
      * can be null, if you don't want to use node-types.
      */
-    String getNodeType() throws TemplateModelException;
+    String getNodeType() throws TemplateException;
     
     
     /**
@@ -72,5 +74,5 @@ public interface TemplateNodeModel extends TemplateModel {
      * not XML-related, it will almost certainly be null. Even 
      * for XML nodes, this will often be null.
      */
-    String getNodeNamespace() throws TemplateModelException;
+    String getNodeNamespace() throws TemplateException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModelEx.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModelEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModelEx.java
index 41d9d42..3ecad00 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModelEx.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNodeModelEx.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * A {@link TemplateNodeModel} that supports navigating to the previous and next sibling nodes.
  */
@@ -27,10 +29,10 @@ public interface TemplateNodeModelEx extends TemplateNodeModel {
     /**
      * @return The immediate previous sibling of this node, or {@code null} if there's no such node.
      */
-    TemplateNodeModelEx getPreviousSibling() throws TemplateModelException;
+    TemplateNodeModelEx getPreviousSibling() throws TemplateException;
 
     /**
      * @return The immediate next sibling of this node, or {@code null} if there's no such node.
      */
-    TemplateNodeModelEx getNextSibling() throws TemplateModelException;
+    TemplateNodeModelEx getNextSibling() throws TemplateException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNumberModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNumberModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNumberModel.java
index c1df97f..8e06bf1 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNumberModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateNumberModel.java
@@ -19,6 +19,7 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.arithmetic.ArithmeticEngine;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
 
@@ -42,6 +43,6 @@ public interface TemplateNumberModel extends TemplateModel {
      *
      * @return the {@link Number} instance associated with this number model.
      */
-    Number getAsNumber() throws TemplateModelException;
+    Number getAsNumber() throws TemplateException;
     
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateScalarModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateScalarModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateScalarModel.java
index b76a097..b34b21b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateScalarModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateScalarModel.java
@@ -19,6 +19,7 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 
 /**
@@ -40,6 +41,6 @@ public interface TemplateScalarModel extends TemplateModel {
      * Objects of this type should be immutable, that is, calling {@link #getAsString()} should always return the same
      * value as for the first time.
      */
-    String getAsString() throws TemplateModelException;
+    String getAsString() throws TemplateException;
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateSequenceModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateSequenceModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateSequenceModel.java
index 0533fcf..d9dc6c6 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateSequenceModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateSequenceModel.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core.model;
 
+import org.apache.freemarker.core.TemplateException;
+
 /**
  * "sequence" template language data type; an object that contains other objects accessible through an integer 0-based
  * index.
@@ -41,10 +43,10 @@ public interface TemplateSequenceModel extends TemplateModel {
      *         a bad index will not remain hidden, unless the default value for that case was also specified in the
      *         template.
      */
-    TemplateModel get(int index) throws TemplateModelException;
+    TemplateModel get(int index) throws TemplateException;
 
     /**
      * @return the number of items in the list.
      */
-    int size() throws TemplateModelException;
+    int size() throws TemplateException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/WrappingTemplateModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/WrappingTemplateModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/WrappingTemplateModel.java
index 206d9d4..d6254e9 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/WrappingTemplateModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/WrappingTemplateModel.java
@@ -52,10 +52,10 @@ abstract public class WrappingTemplateModel {
      * wrapper.
      * @param obj the object to wrap
      * @return the template model that wraps the object
-     * @throws TemplateModelException if the wrapper does not know how to
+     * @throws ObjectWrappingException if the wrapper does not know how to
      * wrap the passed object.
      */
-    protected final TemplateModel wrap(Object obj) throws TemplateModelException {
+    protected final TemplateModel wrap(Object obj) throws ObjectWrappingException {
             return objectWrapper.wrap(obj);
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ArgumentTypes.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ArgumentTypes.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ArgumentTypes.java
index cf05a09..20a2c14 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ArgumentTypes.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ArgumentTypes.java
@@ -24,8 +24,8 @@ import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util.BugException;
 import org.apache.freemarker.core.util._ClassUtils;
 
@@ -561,7 +561,7 @@ final class ArgumentTypes {
         }
 
         @Override
-        TemplateModel invokeMethod(DefaultObjectWrapper ow, Object obj, Object[] args) throws TemplateModelException,
+        TemplateModel invokeMethod(DefaultObjectWrapper ow, Object obj, Object[] args) throws TemplateException,
                 InvocationTargetException, IllegalAccessException {
             convertArgsToReflectionCompatible(ow, args);
             return callableMemberDesc.invokeMethod(ow, obj, args);
@@ -569,7 +569,7 @@ final class ArgumentTypes {
 
         @Override
         Object invokeConstructor(DefaultObjectWrapper ow, Object[] args) throws IllegalArgumentException,
-                InstantiationException, IllegalAccessException, InvocationTargetException, TemplateModelException {
+                InstantiationException, IllegalAccessException, InvocationTargetException, TemplateException {
             convertArgsToReflectionCompatible(ow, args);
             return callableMemberDesc.invokeConstructor(ow, args);
         }
@@ -604,7 +604,7 @@ final class ArgumentTypes {
             return callableMemberDesc.getName();
         }
 
-        private void convertArgsToReflectionCompatible(DefaultObjectWrapper ow, Object[] args) throws TemplateModelException {
+        private void convertArgsToReflectionCompatible(DefaultObjectWrapper ow, Object[] args) throws TemplateException {
             Class<?>[] paramTypes = callableMemberDesc.getParamTypes();
             int ln = paramTypes.length;
             for (int i = 0; i < ln; i++) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
index 0baf851..761122f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
@@ -32,15 +32,15 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.freemarker.core._DelayedTemplateLanguageTypeDescription;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedJQuote;
-import org.apache.freemarker.core._TemplateModelException;
+import org.apache.freemarker.core._DelayedTemplateLanguageTypeDescription;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -124,12 +124,12 @@ public class BeanModel
      * then <tt>non-void-return-type get(java.lang.Object)</tt>, or 
      * alternatively (if the wrapped object is a resource bundle) 
      * <tt>Object get(java.lang.String)</tt>.
-     * @throws TemplateModelException if there was no property nor method nor
+     * @throws TemplateException if there was no property nor method nor
      * a generic <tt>get</tt> method to invoke.
      */
     @Override
     public TemplateModel get(String key)
-        throws TemplateModelException {
+        throws TemplateException {
         Class<?> clazz = object.getClass();
         Map<Object, Object> classInfo = wrapper.getClassIntrospector().get(clazz);
         TemplateModel retval = null;
@@ -148,10 +148,10 @@ public class BeanModel
                 retval = wrapper.wrap(null);
             }
             return retval;
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw e;
         } catch (Exception e) {
-            throw new _TemplateModelException(e,
+            throw new TemplateException(e,
                     "An error has occurred when reading existing sub-variable ", new _DelayedJQuote(key),
                     "; see cause exception! The type of the containing value was: ",
                     new _DelayedTemplateLanguageTypeDescription(this)
@@ -168,7 +168,7 @@ public class BeanModel
     }
     
     private TemplateModel invokeThroughDescriptor(Object desc, Map<Object, Object> classInfo)
-            throws IllegalAccessException, InvocationTargetException, TemplateModelException {
+            throws IllegalAccessException, InvocationTargetException, TemplateException {
         // See if this particular instance has a cached implementation for the requested feature descriptor
         TemplateModel cachedModel;
         synchronized (this) {
@@ -227,7 +227,7 @@ public class BeanModel
 
     protected TemplateModel invokeGenericGet(Map/*<Object, Object>*/ classInfo, Class<?> clazz, String key)
             throws IllegalAccessException, InvocationTargetException,
-        TemplateModelException {
+        TemplateException {
         Method genericGet = (Method) classInfo.get(ClassIntrospector.GENERIC_GET_KEY);
         if (genericGet == null) {
             return UNKNOWN;
@@ -236,13 +236,12 @@ public class BeanModel
         return wrapper.invokeMethod(object, genericGet, new Object[] { key });
     }
 
-    protected TemplateModel wrap(Object obj)
-    throws TemplateModelException {
+    protected TemplateModel wrap(Object obj) throws ObjectWrappingException {
         return wrapper.getOuterIdentity().wrap(obj);
     }
     
     protected Object unwrap(TemplateModel model)
-    throws TemplateModelException {
+    throws TemplateException {
         return wrapper.unwrap(model);
     }
 
@@ -294,7 +293,7 @@ public class BeanModel
     }
 
     @Override
-    public TemplateCollectionModel values() throws TemplateModelException {
+    public TemplateCollectionModel values() throws TemplateException {
         List<Object> values = new ArrayList<>(size());
         TemplateModelIterator it = keys().iterator();
         while (it.hasNext()) {
@@ -320,7 +319,7 @@ public class BeanModel
     }
 
     @Override
-    public TemplateModel getAPI() throws TemplateModelException {
+    public TemplateModel getAPI() throws TemplateException {
         return wrapper.wrapAsAPI(object);
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CallableMemberDescriptor.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CallableMemberDescriptor.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CallableMemberDescriptor.java
index bbaf6bd..398a3f9 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CallableMemberDescriptor.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CallableMemberDescriptor.java
@@ -23,8 +23,8 @@ import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * Packs a {@link Method} or {@link Constructor} together with its parameter types. The actual
@@ -35,11 +35,11 @@ import org.apache.freemarker.core.model.TemplateModelException;
 abstract class CallableMemberDescriptor extends MaybeEmptyCallableMemberDescriptor {
 
     abstract TemplateModel invokeMethod(DefaultObjectWrapper ow, Object obj, Object[] args)
-            throws TemplateModelException, InvocationTargetException, IllegalAccessException;
+            throws TemplateException, InvocationTargetException, IllegalAccessException;
 
     abstract Object invokeConstructor(DefaultObjectWrapper ow, Object[] args)
             throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException,
-            TemplateModelException;
+            TemplateException;
     
     abstract String getDeclaration();
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ClassBasedModelFactory.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ClassBasedModelFactory.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ClassBasedModelFactory.java
index c866d65..ac055b4 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ClassBasedModelFactory.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ClassBasedModelFactory.java
@@ -24,9 +24,10 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core._DelayedJQuote;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util._ClassUtils;
 
 /**
@@ -43,19 +44,20 @@ abstract class ClassBasedModelFactory implements TemplateHashModel {
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         try {
             return getInternal(key);
         } catch (Exception e) {
-            if (e instanceof TemplateModelException) {
-                throw (TemplateModelException) e;
+            if (e instanceof TemplateException) {
+                throw (TemplateException) e;
             } else {
-                throw new TemplateModelException(e);
+                throw new TemplateException(e,
+                        "Failed to get valeu for key ", new _DelayedJQuote(key), "; see cause exception.");
             }
         }
     }
 
-    private TemplateModel getInternal(String key) throws TemplateModelException, ClassNotFoundException {
+    private TemplateModel getInternal(String key) throws TemplateException, ClassNotFoundException {
         {
             TemplateModel model = (TemplateModel) cache.get(key);
             if (model != null) return model;
@@ -139,7 +141,7 @@ abstract class ClassBasedModelFactory implements TemplateHashModel {
     }
     
     protected abstract TemplateModel createModel(Class clazz) 
-    throws TemplateModelException;
+    throws TemplateException;
     
     protected DefaultObjectWrapper getWrapper() {
         return wrapper;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAdapter.java
index e9860ab..10f2091 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAdapter.java
@@ -23,10 +23,10 @@ import java.util.AbstractCollection;
 import java.util.Collection;
 import java.util.Iterator;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelAdapter;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.util.UndeclaredThrowableException;
 
@@ -62,7 +62,7 @@ class CollectionAdapter extends AbstractCollection implements TemplateModelAdapt
                 public boolean hasNext() {
                     try {
                         return i.hasNext();
-                    } catch (TemplateModelException e) {
+                    } catch (TemplateException e) {
                         throw new UndeclaredThrowableException(e);
                     }
                 }
@@ -71,7 +71,7 @@ class CollectionAdapter extends AbstractCollection implements TemplateModelAdapt
                 public Object next() {
                     try {
                         return wrapper.unwrap(i.next());
-                    } catch (TemplateModelException e) {
+                    } catch (TemplateException e) {
                         throw new UndeclaredThrowableException(e);
                     }
                 }
@@ -81,7 +81,7 @@ class CollectionAdapter extends AbstractCollection implements TemplateModelAdapt
                     throw new UnsupportedOperationException();
                 }
             };
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw new UndeclaredThrowableException(e);
         }
     }



[3/7] incubator-freemarker git commit: `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extend

Posted by dd...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAndSequence.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAndSequence.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAndSequence.java
index 7979981..8a7970a 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAndSequence.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/CollectionAndSequence.java
@@ -21,10 +21,10 @@ package org.apache.freemarker.core.model.impl;
 
 import java.util.ArrayList;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateCollectionModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 
@@ -47,7 +47,7 @@ final public class CollectionAndSequence implements TemplateCollectionModel, Tem
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         if (collection != null) {
             return collection.iterator();
         } else {
@@ -56,7 +56,7 @@ final public class CollectionAndSequence implements TemplateCollectionModel, Tem
     }
 
     @Override
-    public TemplateModel get(int i) throws TemplateModelException {
+    public TemplateModel get(int i) throws TemplateException {
         if (sequence != null) {
             return sequence.get(i);
         } else {
@@ -66,7 +66,7 @@ final public class CollectionAndSequence implements TemplateCollectionModel, Tem
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         if (sequence != null) {
             return sequence.size();
         } else if (collection instanceof TemplateCollectionModelEx) {
@@ -77,7 +77,7 @@ final public class CollectionAndSequence implements TemplateCollectionModel, Tem
         }
     }
 
-    private void initSequence() throws TemplateModelException {
+    private void initSequence() throws TemplateException {
         if (data == null) {
             data = new ArrayList();
             TemplateModelIterator it = collection.iterator();
@@ -93,13 +93,13 @@ final public class CollectionAndSequence implements TemplateCollectionModel, Tem
         private final int size;
         private int index = 0;
 
-        SequenceIterator(TemplateSequenceModel sequence) throws TemplateModelException {
+        SequenceIterator(TemplateSequenceModel sequence) throws TemplateException {
             this.sequence = sequence;
             size = sequence.size();
             
         }
         @Override
-        public TemplateModel next() throws TemplateModelException {
+        public TemplateModel next() throws TemplateException {
             return sequence.get(index++);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultArrayAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultArrayAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultArrayAdapter.java
index b661fcc..0e15194 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultArrayAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultArrayAdapter.java
@@ -21,12 +21,12 @@ package org.apache.freemarker.core.model.impl;
 
 import java.lang.reflect.Array;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
@@ -117,12 +117,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(array[index]) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -143,12 +143,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Byte.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -169,12 +169,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Short.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -195,12 +195,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Integer.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -221,12 +221,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Long.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -247,12 +247,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Float.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -273,12 +273,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Double.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -299,12 +299,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Character.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -325,12 +325,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < array.length ? wrap(Boolean.valueOf(array[index])) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return array.length;
         }
 
@@ -356,12 +356,12 @@ public abstract class DefaultArrayAdapter extends WrappingTemplateModel implemen
         }
 
         @Override
-        public TemplateModel get(int index) throws TemplateModelException {
+        public TemplateModel get(int index) throws TemplateException {
             return index >= 0 && index < length ? wrap(Array.get(array, index)) : null;
         }
 
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             return length;
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java
index 2149f8c..af61102 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultEnumerationAdapter.java
@@ -22,12 +22,12 @@ package org.apache.freemarker.core.model.impl;
 import java.util.Enumeration;
 import java.util.Iterator;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
@@ -74,12 +74,12 @@ public class DefaultEnumerationAdapter extends WrappingTemplateModel implements
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return new SimpleTemplateModelIterator();
     }
 
     @Override
-    public TemplateModel getAPI() throws TemplateModelException {
+    public TemplateModel getAPI() throws TemplateException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(enumeration);
     }
 
@@ -91,7 +91,7 @@ public class DefaultEnumerationAdapter extends WrappingTemplateModel implements
         private boolean enumerationOwnedByMe;
 
         @Override
-        public TemplateModel next() throws TemplateModelException {
+        public TemplateModel next() throws TemplateException {
             if (!enumerationOwnedByMe) {
                 checkNotOwner();
                 enumerationOwnedBySomeone = true;
@@ -99,7 +99,7 @@ public class DefaultEnumerationAdapter extends WrappingTemplateModel implements
             }
 
             if (!enumeration.hasMoreElements()) {
-                throw new TemplateModelException("The collection has no more items.");
+                throw new TemplateException("The collection has no more items.");
             }
 
             Object value = enumeration.nextElement();
@@ -107,7 +107,7 @@ public class DefaultEnumerationAdapter extends WrappingTemplateModel implements
         }
 
         @Override
-        public boolean hasNext() throws TemplateModelException {
+        public boolean hasNext() throws TemplateException {
             // Calling hasNext may looks safe, but I have met sync. problems.
             if (!enumerationOwnedByMe) {
                 checkNotOwner();
@@ -116,9 +116,9 @@ public class DefaultEnumerationAdapter extends WrappingTemplateModel implements
             return enumeration.hasMoreElements();
         }
 
-        private void checkNotOwner() throws TemplateModelException {
+        private void checkNotOwner() throws TemplateException {
             if (enumerationOwnedBySomeone) {
-                throw new TemplateModelException(
+                throw new TemplateException(
                         "This collection value wraps a java.util.Enumeration, thus it can be listed only once.");
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIterableAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIterableAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIterableAdapter.java
index 1033a5f..e60a090 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIterableAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIterableAdapter.java
@@ -22,13 +22,13 @@ package org.apache.freemarker.core.model.impl;
 import java.util.Collection;
 import java.util.Iterator;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
@@ -69,7 +69,7 @@ public class DefaultIterableAdapter extends WrappingTemplateModel implements Tem
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return new DefaultUnassignableIteratorAdapter(iterable.iterator(), getObjectWrapper());
     }
 
@@ -84,7 +84,7 @@ public class DefaultIterableAdapter extends WrappingTemplateModel implements Tem
     }
 
     @Override
-    public TemplateModel getAPI() throws TemplateModelException {
+    public TemplateModel getAPI() throws TemplateException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(iterable);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java
index 8159f14..ea9af3f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultIteratorAdapter.java
@@ -21,12 +21,12 @@ package org.apache.freemarker.core.model.impl;
 
 import java.util.Iterator;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
@@ -82,12 +82,12 @@ public class DefaultIteratorAdapter extends WrappingTemplateModel implements Tem
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return new SimpleTemplateModelIterator();
     }
 
     @Override
-    public TemplateModel getAPI() throws TemplateModelException {
+    public TemplateModel getAPI() throws TemplateException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(iterator);
     }
 
@@ -99,7 +99,7 @@ public class DefaultIteratorAdapter extends WrappingTemplateModel implements Tem
         private boolean iteratorOwnedByMe;
 
         @Override
-        public TemplateModel next() throws TemplateModelException {
+        public TemplateModel next() throws TemplateException {
             if (!iteratorOwnedByMe) {
                 checkNotOwner();
                 iteratorOwnedBySomeone = true;
@@ -107,7 +107,7 @@ public class DefaultIteratorAdapter extends WrappingTemplateModel implements Tem
             }
 
             if (!iterator.hasNext()) {
-                throw new TemplateModelException("The collection has no more items.");
+                throw new TemplateException("The collection has no more items.");
             }
 
             Object value = iterator.next();
@@ -115,7 +115,7 @@ public class DefaultIteratorAdapter extends WrappingTemplateModel implements Tem
         }
 
         @Override
-        public boolean hasNext() throws TemplateModelException {
+        public boolean hasNext() throws TemplateException {
             // Calling hasNext may looks safe, but I have met sync. problems.
             if (!iteratorOwnedByMe) {
                 checkNotOwner();
@@ -124,9 +124,9 @@ public class DefaultIteratorAdapter extends WrappingTemplateModel implements Tem
             return iterator.hasNext();
         }
 
-        private void checkNotOwner() throws TemplateModelException {
+        private void checkNotOwner() throws TemplateException {
             if (iteratorOwnedBySomeone) {
-                throw new TemplateModelException(
+                throw new TemplateException(
                         "This collection value wraps a java.util.Iterator, thus it can be listed only once.");
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultListAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultListAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultListAdapter.java
index b90a343..80e76d8 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultListAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultListAdapter.java
@@ -22,13 +22,13 @@ package org.apache.freemarker.core.model.impl;
 import java.util.AbstractSequentialList;
 import java.util.List;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport;
 import org.apache.freemarker.core.model.RichObjectWrapper;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
@@ -79,12 +79,12 @@ public class DefaultListAdapter extends WrappingTemplateModel implements Templat
     }
 
     @Override
-    public TemplateModel get(int index) throws TemplateModelException {
+    public TemplateModel get(int index) throws TemplateException {
         return index >= 0 && index < list.size() ? wrap(list.get(index)) : null;
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return list.size();
     }
 
@@ -106,14 +106,14 @@ public class DefaultListAdapter extends WrappingTemplateModel implements Templat
         }
 
         @Override
-        public TemplateModelIterator iterator() throws TemplateModelException {
+        public TemplateModelIterator iterator() throws TemplateException {
             return new DefaultUnassignableIteratorAdapter(list.iterator(), getObjectWrapper());
         }
 
     }
 
     @Override
-    public TemplateModel getAPI() throws TemplateModelException {
+    public TemplateModel getAPI() throws TemplateException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(list);
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java
index 65f7cb4..832c675 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultMapAdapter.java
@@ -22,8 +22,8 @@ package org.apache.freemarker.core.model.impl;
 import java.util.Map;
 import java.util.SortedMap;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedJQuote;
-import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport;
@@ -31,7 +31,6 @@ import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
@@ -73,16 +72,16 @@ public class DefaultMapAdapter extends WrappingTemplateModel
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         Object val;
         try {
             val = map.get(key);
         } catch (ClassCastException e) {
-            throw new _TemplateModelException(e,
+            throw new TemplateException(e,
                     "ClassCastException while getting Map entry with String key ",
                     new _DelayedJQuote(key));
         } catch (NullPointerException e) {
-            throw new _TemplateModelException(e,
+            throw new TemplateException(e,
                     "NullPointerException while getting Map entry with String key ",
                     new _DelayedJQuote(key));
         }
@@ -103,11 +102,11 @@ public class DefaultMapAdapter extends WrappingTemplateModel
                         }
                     } 
                 } catch (ClassCastException e) {
-                    throw new _TemplateModelException(e,
+                    throw new TemplateException(e,
                                     "Class casting exception while getting Map entry with Character key ",
                                     new _DelayedJQuote(charKey));
                 } catch (NullPointerException e) {
-                    throw new _TemplateModelException(e,
+                    throw new TemplateException(e,
                                     "NullPointerException while getting Map entry with Character key ",
                                     new _DelayedJQuote(charKey));
                 }
@@ -160,7 +159,7 @@ public class DefaultMapAdapter extends WrappingTemplateModel
     }
 
     @Override
-    public TemplateModel getAPI() throws TemplateModelException {
+    public TemplateModel getAPI() throws TemplateException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(map);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultNonListCollectionAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultNonListCollectionAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultNonListCollectionAdapter.java
index 60b41f1..6f8a5f9 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultNonListCollectionAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultNonListCollectionAdapter.java
@@ -22,13 +22,13 @@ package org.apache.freemarker.core.model.impl;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.ObjectWrapperWithAPISupport;
 import org.apache.freemarker.core.model.TemplateCollectionModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
 import org.apache.freemarker.core.model.WrapperTemplateModel;
@@ -68,7 +68,7 @@ public class DefaultNonListCollectionAdapter extends WrappingTemplateModel imple
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return new DefaultUnassignableIteratorAdapter(collection.iterator(), getObjectWrapper());
     }
 
@@ -93,7 +93,7 @@ public class DefaultNonListCollectionAdapter extends WrappingTemplateModel imple
     }
 
     @Override
-    public TemplateModel getAPI() throws TemplateModelException {
+    public TemplateModel getAPI() throws TemplateException {
         return ((ObjectWrapperWithAPISupport) getObjectWrapper()).wrapAsAPI(collection);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
index 64b85a3..42e9e1a 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
@@ -45,14 +45,15 @@ import java.util.WeakHashMap;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Configuration;
 import org.apache.freemarker.core.NonTemplateCallPlace;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.Version;
 import org.apache.freemarker.core._CoreAPI;
-import org.apache.freemarker.core._DelayedTemplateLanguageTypeDescription;
 import org.apache.freemarker.core._DelayedShortClassName;
-import org.apache.freemarker.core._TemplateModelException;
+import org.apache.freemarker.core._DelayedTemplateLanguageTypeDescription;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.RichObjectWrapper;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
@@ -61,7 +62,6 @@ import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelAdapter;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
@@ -374,7 +374,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      * </ol>
      */
     @Override
-    public TemplateModel wrap(Object obj) throws TemplateModelException {
+    public TemplateModel wrap(Object obj) throws ObjectWrappingException {
         if (obj == null) {
             return null;
         }
@@ -475,7 +475,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      * override {@link #wrapSpecialObject(Object)}}, or don't subclass the {@link ObjectWrapper} at all, and
      * just set the {@link ExtendableBuilder#getExtensions() extensions} configuration setting of it.
      */
-    protected TemplateModel wrapGenericObject(Object obj) throws TemplateModelException {
+    protected TemplateModel wrapGenericObject(Object obj) throws ObjectWrappingException {
         return new BeanAndStringModel(obj, this);
     }
 
@@ -498,7 +498,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
     /**
      */
     @Override
-    public TemplateHashModel wrapAsAPI(Object obj) throws TemplateModelException {
+    public TemplateHashModel wrapAsAPI(Object obj) throws ObjectWrappingException {
         return new APIModel(obj, this);
     }
 
@@ -513,10 +513,10 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      * {@link TemplateSequenceModel} into a List, and arbitrary
      * {@link TemplateCollectionModel} into a Set. All other objects are
      * returned unchanged.
-     * @throws TemplateModelException if an attempted unwrapping fails.
+     * @throws TemplateException if an attempted unwrapping fails.
      */
     @Override
-    public Object unwrap(TemplateModel model) throws TemplateModelException {
+    public Object unwrap(TemplateModel model) throws TemplateException {
         return unwrap(model, Object.class);
     }
 
@@ -529,15 +529,15 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      * @param model the model to unwrap
      * @param targetClass the class of the unwrapped result; {@code Object.class} of we don't know what the expected type is.
      * @return the unwrapped result of the desired class
-     * @throws TemplateModelException if an attempted unwrapping fails.
+     * @throws TemplateException if an attempted unwrapping fails.
      *
      * @see #tryUnwrapTo(TemplateModel, Class)
      */
     public Object unwrap(TemplateModel model, Class<?> targetClass)
-            throws TemplateModelException {
+            throws TemplateException {
         final Object obj = tryUnwrapTo(model, targetClass);
         if (obj == ObjectWrapperAndUnwrapper.CANT_UNWRAP_TO_TARGET_CLASS) {
-            throw new TemplateModelException("Can not unwrap model of type " +
+            throw new TemplateException("Can not unwrap model of type " +
                     model.getClass().getName() + " to type " + targetClass.getName());
         }
         return obj;
@@ -546,7 +546,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
     /**
      */
     @Override
-    public Object tryUnwrapTo(TemplateModel model, Class<?> targetClass) throws TemplateModelException {
+    public Object tryUnwrapTo(TemplateModel model, Class<?> targetClass) throws TemplateException {
         return tryUnwrapTo(model, targetClass, 0);
     }
 
@@ -557,7 +557,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      *            non-overloaded methods.
      * @return {@link ObjectWrapperAndUnwrapper#CANT_UNWRAP_TO_TARGET_CLASS} or the unwrapped object.
      */
-    Object tryUnwrapTo(TemplateModel model, Class<?> targetClass, int typeFlags) throws TemplateModelException {
+    Object tryUnwrapTo(TemplateModel model, Class<?> targetClass, int typeFlags) throws TemplateException {
         Object res = tryUnwrapTo(model, targetClass, typeFlags, null);
         if ((typeFlags & TypeFlags.WIDENED_NUMERICAL_UNWRAPPING_HINT) != 0
                 && res instanceof Number) {
@@ -572,7 +572,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      */
     private Object tryUnwrapTo(final TemplateModel model, Class<?> targetClass, final int typeFlags,
                                final Map<Object, Object> recursionStops)
-            throws TemplateModelException {
+            throws TemplateException {
         if (model == null) {
             return null;
         }
@@ -791,11 +791,11 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      * @param tryOnly
      *            If {@code true}, if the conversion of an item to the component type isn't possible, the method returns
      *            {@link ObjectWrapperAndUnwrapper#CANT_UNWRAP_TO_TARGET_CLASS} instead of throwing a
-     *            {@link TemplateModelException}.
+     *            {@link TemplateException}.
      */
     Object unwrapSequenceToArray(
             TemplateSequenceModel seq, Class<?> arrayClass, boolean tryOnly, Map<Object, Object> recursionStops)
-            throws TemplateModelException {
+            throws TemplateException {
         if (recursionStops != null) {
             Object retval = recursionStops.get(seq);
             if (retval != null) {
@@ -816,7 +816,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
                     if (tryOnly) {
                         return ObjectWrapperAndUnwrapper.CANT_UNWRAP_TO_TARGET_CLASS;
                     } else {
-                        throw new _TemplateModelException(
+                        throw new TemplateException(
                                 "Failed to convert ",  new _DelayedTemplateLanguageTypeDescription(seq),
                                 " object to ", new _DelayedShortClassName(array.getClass()),
                                 ": Problematic sequence item at index ", Integer.valueOf(i) ," with value type: ",
@@ -833,7 +833,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
     }
 
     Object listToArray(List<?> list, Class<?> arrayClass, Map<Object, Object> recursionStops)
-            throws TemplateModelException {
+            throws TemplateException {
         if (list instanceof SequenceAdapter) {
             return unwrapSequenceToArray(
                     ((SequenceAdapter) list).getTemplateSequenceModel(),
@@ -888,7 +888,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
                 try {
                     Array.set(array, i, listItem);
                 } catch (IllegalArgumentException e) {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "Failed to convert " + _ClassUtils.getShortClassNameOfObject(list)
                                     + " object to " + _ClassUtils.getShortClassNameOfObject(array)
                                     + ": Problematic List item at index " + i + " with value type: "
@@ -905,7 +905,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
     /**
      * @param array Must be an array (of either a reference or primitive type)
      */
-    List<?> arrayToList(Object array) throws TemplateModelException {
+    List<?> arrayToList(Object array) throws TemplateException {
         if (array instanceof Object[]) {
             // Array of any non-primitive type.
             // Note that an array of non-primitive type is always instanceof Object[].
@@ -985,15 +985,13 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      * @throws InvocationTargetException if the invoked method threw an exception
      * @throws IllegalAccessException if the method can't be invoked due to an
      * access restriction.
-     * @throws TemplateModelException if the return value couldn't be wrapped
+     * @throws TemplateException if the return value couldn't be wrapped
      * (this can happen if the wrapper has an outer identity or is subclassed,
      * and the outer identity or the subclass throws an exception. Plain
-     * DefaultObjectWrapper never throws TemplateModelException).
+     * DefaultObjectWrapper never throws TemplateException).
      */
     TemplateModel invokeMethod(Object object, Method method, Object[] args)
-            throws InvocationTargetException,
-            IllegalAccessException,
-            TemplateModelException {
+            throws InvocationTargetException, IllegalAccessException, TemplateException {
         // [2.4]: Java's Method.invoke truncates numbers if the target type has not enough bits to hold the value.
         // There should at least be an option to check this.
         Object retval = method.invoke(object, args);
@@ -1049,12 +1047,11 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
      * @return The instance created; it's not wrapped into {@link TemplateModel}.
      */
     public Object newInstance(Class<?> clazz, TemplateModel[] args, CallPlace callPlace)
-            throws TemplateModelException {
+            throws TemplateException {
         try {
             Object ctors = classIntrospector.get(clazz).get(ClassIntrospector.CONSTRUCTORS_KEY);
             if (ctors == null) {
-                throw new TemplateModelException("Class " + clazz.getName() +
-                        " has no public constructors.");
+                throw new TemplateException("Class " + clazz.getName() + " has no public constructors.");
             }
             Constructor<?> ctor = null;
             Object[] pojoArgs;
@@ -1065,7 +1062,7 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
                 try {
                     return ctor.newInstance(pojoArgs);
                 } catch (Exception e) {
-                    throw _MethodUtils.newInvocationTemplateModelException(null, ctor, e);
+                    throw _MethodUtils.newInvocationTemplateException(null, ctor, e);
                 }
             } else if (ctors instanceof OverloadedMethods) {
                 // TODO [FM3] Utilize optional java type info in callPlace for overloaded method selection
@@ -1073,18 +1070,18 @@ public class DefaultObjectWrapper implements RichObjectWrapper {
                 try {
                     return mma.invokeConstructor(this);
                 } catch (Exception e) {
-                    if (e instanceof TemplateModelException) throw (TemplateModelException) e;
+                    if (e instanceof TemplateException) throw (TemplateException) e;
 
-                    throw _MethodUtils.newInvocationTemplateModelException(null, mma.getCallableMemberDescriptor(), e);
+                    throw _MethodUtils.newInvocationTemplateException(null, mma.getCallableMemberDescriptor(), e);
                 }
             } else {
                 // Cannot happen
                 throw new BugException();
             }
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw e;
         } catch (Exception e) {
-            throw new TemplateModelException(
+            throw new TemplateException(
                     "Error while creating new instance of class " + clazz.getName() + "; see cause exception", e);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultUnassignableIteratorAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultUnassignableIteratorAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultUnassignableIteratorAdapter.java
index c87c21f..c87f3f7 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultUnassignableIteratorAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultUnassignableIteratorAdapter.java
@@ -21,9 +21,9 @@ package org.apache.freemarker.core.model.impl;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 
 /**
@@ -43,16 +43,16 @@ class DefaultUnassignableIteratorAdapter implements TemplateModelIterator {
     }
 
     @Override
-    public TemplateModel next() throws TemplateModelException {
+    public TemplateModel next() throws TemplateException {
         try {
             return wrapper.wrap(it.next());
         } catch (NoSuchElementException e) {
-            throw new TemplateModelException("The collection has no more items.", e);
+            throw new TemplateException("The collection has no more items.", e);
         }
     }
 
     @Override
-    public boolean hasNext() throws TemplateModelException {
+    public boolean hasNext() throws TemplateException {
         return it.hasNext();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/HashAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/HashAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/HashAdapter.java
index add437a..d829f6b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/HashAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/HashAdapter.java
@@ -25,11 +25,11 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelAdapter;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.util.UndeclaredThrowableException;
 
@@ -55,7 +55,7 @@ class HashAdapter extends AbstractMap implements TemplateModelAdapter {
     public boolean isEmpty() {
         try {
             return model.isEmpty();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw new UndeclaredThrowableException(e);
         }
     }
@@ -64,7 +64,7 @@ class HashAdapter extends AbstractMap implements TemplateModelAdapter {
     public Object get(Object key) {
         try {
             return wrapper.unwrap(model.get(String.valueOf(key)));
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw new UndeclaredThrowableException(e);
         }
     }
@@ -89,7 +89,7 @@ class HashAdapter extends AbstractMap implements TemplateModelAdapter {
                 final TemplateModelIterator i;
                 try {
                      i = getModelEx().keys().iterator();
-                } catch (TemplateModelException e) {
+                } catch (TemplateException e) {
                     throw new UndeclaredThrowableException(e);
                 }
                 return new Iterator() {
@@ -97,7 +97,7 @@ class HashAdapter extends AbstractMap implements TemplateModelAdapter {
                     public boolean hasNext() {
                         try {
                             return i.hasNext();
-                        } catch (TemplateModelException e) {
+                        } catch (TemplateException e) {
                             throw new UndeclaredThrowableException(e);
                         }
                     }
@@ -107,7 +107,7 @@ class HashAdapter extends AbstractMap implements TemplateModelAdapter {
                         final Object key;
                         try {
                             key = wrapper.unwrap(i.next());
-                        } catch (TemplateModelException e) {
+                        } catch (TemplateException e) {
                             throw new UndeclaredThrowableException(e);
                         }
                         return new Map.Entry() {
@@ -162,7 +162,7 @@ class HashAdapter extends AbstractMap implements TemplateModelAdapter {
             public int size() {
                 try {
                     return getModelEx().size();
-                } catch (TemplateModelException e) {
+                } catch (TemplateException e) {
                     throw new UndeclaredThrowableException(e);
                 }
             }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/InvalidPropertyException.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/InvalidPropertyException.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/InvalidPropertyException.java
index ff73a05..b14c6b9 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/InvalidPropertyException.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/InvalidPropertyException.java
@@ -19,14 +19,14 @@
 
 package org.apache.freemarker.core.model.impl;
 
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.TemplateException;
 
 /**
  * An exception thrown when there is an attempt to access
  * an invalid bean property when we are in a "strict bean" mode
  */
 
-public class InvalidPropertyException extends TemplateModelException {
+public class InvalidPropertyException extends TemplateException {
 	
     public InvalidPropertyException(String description) {
         super(description);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java
index 00e6608..80b6aa5 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MapKeyValuePairIterator.java
@@ -22,12 +22,13 @@ import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateHashModelEx2.KeyValuePair;
 import org.apache.freemarker.core.model.TemplateHashModelEx2.KeyValuePairIterator;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  *  Implementation of {@link KeyValuePairIterator} for a {@link TemplateHashModelEx2} that wraps or otherwise uses a
@@ -56,19 +57,19 @@ public class MapKeyValuePairIterator implements KeyValuePairIterator {
         return new KeyValuePair() {
 
             @Override
-            public TemplateModel getKey() throws TemplateModelException {
+            public TemplateModel getKey() throws TemplateException {
                 return wrap(entry.getKey());
             }
 
             @Override
-            public TemplateModel getValue() throws TemplateModelException {
+            public TemplateModel getValue() throws TemplateException {
                 return wrap(entry.getValue());
             }
             
         };
     }
     
-    private TemplateModel wrap(Object obj) throws TemplateModelException {
+    private TemplateModel wrap(Object obj) throws ObjectWrappingException {
         return (obj instanceof TemplateModel) ? (TemplateModel) obj : objectWrapper.wrap(obj);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MemberAndArguments.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MemberAndArguments.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MemberAndArguments.java
index 3a37d9d..ac96d67 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MemberAndArguments.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/MemberAndArguments.java
@@ -21,8 +21,8 @@ package org.apache.freemarker.core.model.impl;
 
 import java.lang.reflect.InvocationTargetException;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  */
@@ -47,13 +47,13 @@ class MemberAndArguments extends MaybeEmptyMemberAndArguments {
     }
     
     TemplateModel invokeMethod(DefaultObjectWrapper ow, Object obj)
-            throws TemplateModelException, InvocationTargetException, IllegalAccessException {
+            throws TemplateException, InvocationTargetException, IllegalAccessException {
         return callableMemberDesc.invokeMethod(ow, obj, args);
     }
 
     Object invokeConstructor(DefaultObjectWrapper ow)
             throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException,
-            TemplateModelException {
+            TemplateException {
         return callableMemberDesc.invokeConstructor(ow, args);
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedFixArgsMethods.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedFixArgsMethods.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedFixArgsMethods.java
index 7f57c68..c0d53c2 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedFixArgsMethods.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedFixArgsMethods.java
@@ -18,10 +18,10 @@
  */
 package org.apache.freemarker.core.model.impl;
 
-import org.apache.freemarker.core.util.CallableUtils;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.util.CallableUtils;
 
 /**
  * Stores the non-varargs methods for a {@link OverloadedMethods} object.
@@ -44,7 +44,7 @@ class OverloadedFixArgsMethods extends OverloadedMethodsSubset {
 
     @Override
     MaybeEmptyMemberAndArguments getMemberAndArguments(TemplateModel[] tmArgs, DefaultObjectWrapper unwrapper)
-    throws TemplateModelException {
+    throws TemplateException {
         if (tmArgs == null) {
             // null is treated as empty args
             tmArgs = CallableUtils.EMPTY_TEMPLATE_MODEL_ARRAY;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedJavaMethodModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedJavaMethodModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedJavaMethodModel.java
index 17d82a8..a1451e8 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedJavaMethodModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedJavaMethodModel.java
@@ -26,7 +26,6 @@ import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * Wraps a set of same-name overloaded methods behind {@link TemplateFunctionModel} interface,
@@ -57,20 +56,20 @@ class OverloadedJavaMethodModel implements JavaMethodModel {
      * implementation. The actual method to call from several overloaded methods will be chosen based on the classes of
      * the arguments.
      *
-     * @throws TemplateModelException
+     * @throws TemplateException
      *         if the method cannot be chosen unambiguously.
      */
     @Override
     public TemplateModel execute(TemplateModel[] args, CallPlace callPlace, Environment envUnused)
-            throws TemplateModelException {
+            throws TemplateException {
         // TODO [FM3] Utilize optional java type info in callPlace for overloaded method selection
         MemberAndArguments maa = overloadedMethods.getMemberAndArguments(args, wrapper);
         try {
             return maa.invokeMethod(wrapper, object);
         } catch (Exception e) {
-            if (e instanceof TemplateModelException) throw (TemplateModelException) e;
+            if (e instanceof TemplateException) throw (TemplateException) e;
             
-            throw _MethodUtils.newInvocationTemplateModelException(
+            throw _MethodUtils.newInvocationTemplateException(
                     object,
                     maa.getCallableMemberDescriptor(),
                     e);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethods.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethods.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethods.java
index fc1c344..8fe7558 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethods.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethods.java
@@ -24,12 +24,11 @@ import java.lang.reflect.Method;
 import java.util.HashSet;
 import java.util.Iterator;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedConversionToString;
 import org.apache.freemarker.core._ErrorDescriptionBuilder;
-import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util.TemplateLanguageUtils;
 import org.apache.freemarker.core.util._ClassUtils;
 
@@ -87,7 +86,7 @@ final class OverloadedMethods {
     }
     
     MemberAndArguments getMemberAndArguments(TemplateModel[] tmArgs, DefaultObjectWrapper unwrapper)
-    throws TemplateModelException {
+    throws TemplateException {
         // Try to find a fixed args match:
         MaybeEmptyMemberAndArguments fixArgsRes = fixArgMethods.getMemberAndArguments(tmArgs, unwrapper);
         if (fixArgsRes instanceof MemberAndArguments) {
@@ -113,7 +112,7 @@ final class OverloadedMethods {
                 "\nThe matching overload was searched among these members:\n",
                 memberListToString());
         addMarkupBITipAfterNoNoMarchIfApplicable(edb, tmArgs);
-        throw new _TemplateModelException(edb);
+        throw new TemplateException(edb);
     }
 
     String getMethodName() {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsSubset.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsSubset.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsSubset.java
index b91f9a6..e7f5a81 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsSubset.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsSubset.java
@@ -27,8 +27,8 @@ import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util._ClassUtils;
 import org.apache.freemarker.core.util._NullArgumentException;
 
@@ -154,7 +154,7 @@ abstract class OverloadedMethodsSubset {
     abstract void afterWideningUnwrappingHints(Class<?>[] paramTypes, int[] paramNumericalTypes);
     
     abstract MaybeEmptyMemberAndArguments getMemberAndArguments(TemplateModel[] tmArgs,
-            DefaultObjectWrapper unwrapper) throws TemplateModelException;
+            DefaultObjectWrapper unwrapper) throws TemplateException;
 
     /**
      * Returns the most specific common class (or interface) of two parameter types for the purpose of unwrapping.

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedVarArgsMethods.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedVarArgsMethods.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedVarArgsMethods.java
index fd5c5ee..7e87909 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedVarArgsMethods.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedVarArgsMethods.java
@@ -20,11 +20,11 @@ package org.apache.freemarker.core.model.impl;
 
 import java.lang.reflect.Array;
 
-import org.apache.freemarker.core.util.CallableUtils;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util.BugException;
+import org.apache.freemarker.core.util.CallableUtils;
 
 /**
  * Stores the varargs methods for a {@link OverloadedMethods} object.
@@ -136,7 +136,7 @@ class OverloadedVarArgsMethods extends OverloadedMethodsSubset {
     
     @Override
     MaybeEmptyMemberAndArguments getMemberAndArguments(TemplateModel[] tmArgs, DefaultObjectWrapper unwrapper)
-    throws TemplateModelException {
+    throws TemplateException {
         if (tmArgs == null) {
             // null is treated as empty args
             tmArgs = CallableUtils.EMPTY_TEMPLATE_MODEL_ARRAY;
@@ -208,7 +208,7 @@ class OverloadedVarArgsMethods extends OverloadedMethodsSubset {
      */
     private Object replaceVarargsSectionWithArray(
             Object[] args, TemplateModel[] tmArgs, CallableMemberDescriptor memberDesc, DefaultObjectWrapper unwrapper)
-            throws TemplateModelException {
+            throws TemplateException {
         final Class<?>[] paramTypes = memberDesc.getParamTypes();
         final int paramCount = paramTypes.length;
         final Class<?> varArgsCompType = paramTypes[paramCount - 1].getComponentType();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ReflectionCallableMemberDescriptor.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ReflectionCallableMemberDescriptor.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ReflectionCallableMemberDescriptor.java
index afa1cb1..5ae537f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ReflectionCallableMemberDescriptor.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ReflectionCallableMemberDescriptor.java
@@ -25,8 +25,8 @@ import java.lang.reflect.Member;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * The most commonly used {@link CallableMemberDescriptor} implementation. 
@@ -52,7 +52,7 @@ final class ReflectionCallableMemberDescriptor extends CallableMemberDescriptor
 
     @Override
     TemplateModel invokeMethod(DefaultObjectWrapper ow, Object obj, Object[] args)
-            throws TemplateModelException, InvocationTargetException, IllegalAccessException {
+            throws TemplateException, InvocationTargetException, IllegalAccessException {
         return ow.invokeMethod(obj, (Method) member, args);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
index b5fb41c..aaf3702 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
@@ -30,13 +30,11 @@ import java.util.Set;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core._DelayedJQuote;
-import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.util.CallableUtils;
 
 /**
  * <p>A hash model that wraps a resource bundle. Makes it convenient to store
@@ -66,11 +64,11 @@ public class ResourceBundleModel extends BeanModel implements TemplateFunctionMo
      */
     @Override
     protected TemplateModel invokeGenericGet(Map keyMap, Class clazz, String key)
-    throws TemplateModelException {
+    throws TemplateException {
         try {
             return wrap(((ResourceBundle) object).getObject(key));
         } catch (MissingResourceException e) {
-            throw new _TemplateModelException(e,
+            throw new TemplateException(e,
                     "No ", new _DelayedJQuote(key), " key in the ResourceBundle. "
                     + "Note that conforming to the ResourceBundle Java API, this is an error and not just "
                     + "a missing sub-variable (a null).");
@@ -127,9 +125,10 @@ public class ResourceBundleModel extends BeanModel implements TemplateFunctionMo
             // Invoke format
             return new BeanAndStringModel(format(key, params), wrapper);
         } catch (MissingResourceException e) {
-            throw new TemplateModelException("No such key: " + key);
+            throw CallableUtils.newGenericExecuteException(this, "No such key: " + key,  e);
         } catch (Exception e) {
-            throw new TemplateModelException(e.getMessage());
+            throw CallableUtils.newGenericExecuteException(this,
+                    "Failed to get or format message; see cause exception",  e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapper.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapper.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapper.java
index c655b93..46347c4 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapper.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/RestrictedObjectWrapper.java
@@ -25,9 +25,9 @@ import java.util.Map;
 import java.util.WeakHashMap;
 
 import org.apache.freemarker.core.Version;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * A restricted version of {@link DefaultObjectWrapper} that doesn't expose arbitrary object, just those that directly
@@ -45,14 +45,15 @@ public class RestrictedObjectWrapper extends DefaultObjectWrapper {
      * In this implementation, this just throws an exception.
      */
     @Override
-    protected TemplateModel wrapGenericObject(Object obj) throws TemplateModelException {
-        throw new TemplateModelException("RestrictedObjectWrapper deliberately won't wrap this type: "
+    protected TemplateModel wrapGenericObject(Object obj) throws ObjectWrappingException {
+        throw new ObjectWrappingException("RestrictedObjectWrapper deliberately won't wrap this type: "
                 + obj.getClass().getName());
     }
 
     @Override
-    public TemplateHashModel wrapAsAPI(Object obj) throws TemplateModelException {
-        throw new TemplateModelException("RestrictedObjectWrapper deliberately doesn't allow ?api.");
+    public TemplateHashModel wrapAsAPI(Object obj) throws ObjectWrappingException {
+        throw new ObjectWrappingException(
+                RestrictedObjectWrapper.class.getName() + " doesn't allow ?api.");
     }
 
     protected static abstract class ExtendableBuilder<

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SequenceAdapter.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SequenceAdapter.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SequenceAdapter.java
index e9b6156..b7a9136 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SequenceAdapter.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SequenceAdapter.java
@@ -21,9 +21,9 @@ package org.apache.freemarker.core.model.impl;
 
 import java.util.AbstractList;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelAdapter;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.util.UndeclaredThrowableException;
 
@@ -47,7 +47,7 @@ class SequenceAdapter extends AbstractList implements TemplateModelAdapter {
     public int size() {
         try {
             return model.size();
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw new UndeclaredThrowableException(e);
         }
     }
@@ -56,7 +56,7 @@ class SequenceAdapter extends AbstractList implements TemplateModelAdapter {
     public Object get(int index) {
         try {
             return wrapper.unwrap(model.get(index));
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw new UndeclaredThrowableException(e);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java
index cf399ab..012beb6 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleCollection.java
@@ -23,10 +23,10 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.Iterator;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
 
@@ -70,7 +70,7 @@ implements TemplateCollectionModel, Serializable {
      * <p>When you wrap an <tt>Iterator</tt> and you get <tt>TemplateModelIterator</tt> for multiple times,
      * only one of the returned <tt>TemplateModelIterator</tt> instances can be really used. When you have called a
      * method of a <tt>TemplateModelIterator</tt> instance, all other instance will throw a
-     * <tt>TemplateModelException</tt> when you try to call their methods, since the wrapped <tt>Iterator</tt>
+     * {@link TemplateException} when you try to call their methods, since the wrapped <tt>Iterator</tt>
      * can't return the first element anymore.
      */
     @Override
@@ -97,7 +97,7 @@ implements TemplateCollectionModel, Serializable {
         }
 
         @Override
-        public TemplateModel next() throws TemplateModelException {
+        public TemplateModel next() throws TemplateException {
             if (!iteratorOwnedByMe) { 
                 synchronized (SimpleCollection.this) {
                     checkIteratorNotOwned();
@@ -107,7 +107,7 @@ implements TemplateCollectionModel, Serializable {
             }
             
             if (!iterator.hasNext()) {
-                throw new TemplateModelException("The collection has no more items.");
+                throw new TemplateException("The collection has no more items.");
             }
             
             Object value  = iterator.next();
@@ -115,7 +115,7 @@ implements TemplateCollectionModel, Serializable {
         }
 
         @Override
-        public boolean hasNext() throws TemplateModelException {
+        public boolean hasNext() throws TemplateException {
             // Calling hasNext may looks safe, but I have met sync. problems.
             if (!iteratorOwnedByMe) {
                 synchronized (SimpleCollection.this) {
@@ -126,9 +126,9 @@ implements TemplateCollectionModel, Serializable {
             return iterator.hasNext();
         }
         
-        private void checkIteratorNotOwned() throws TemplateModelException {
+        private void checkIteratorNotOwned() throws TemplateException {
             if (iteratorOwned) {
-                throw new TemplateModelException(
+                throw new TemplateException(
                         "This collection value wraps a java.util.Iterator, thus it can be listed only once.");
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java
index ba61df4..df2f6ae 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleHash.java
@@ -26,15 +26,14 @@ import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedJQuote;
-import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
 
 /**
@@ -165,16 +164,16 @@ public class SimpleHash extends WrappingTemplateModel implements TemplateHashMod
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         Object result;
         try {
             result = map.get(key);
         } catch (ClassCastException e) {
-            throw new _TemplateModelException(e,
+            throw new TemplateException(e,
                     "ClassCastException while getting Map entry with String key ",
                     new _DelayedJQuote(key));
         } catch (NullPointerException e) {
-            throw new _TemplateModelException(e,
+            throw new TemplateException(e,
                     "NullPointerException while getting Map entry with String key ",
                     new _DelayedJQuote(key));
         }
@@ -195,11 +194,11 @@ public class SimpleHash extends WrappingTemplateModel implements TemplateHashMod
                         putKey = charKey;
                     }
                 } catch (ClassCastException e) {
-                    throw new _TemplateModelException(e,
+                    throw new TemplateException(e,
                             "ClassCastException while getting Map entry with Character key ",
                             new _DelayedJQuote(key));
                 } catch (NullPointerException e) {
-                    throw new _TemplateModelException(e,
+                    throw new TemplateException(e,
                             "NullPointerException while getting Map entry with Character key ",
                             new _DelayedJQuote(key));
                 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleJavaMethodModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleJavaMethodModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleJavaMethodModel.java
index 727c9e3..1862ba5 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleJavaMethodModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleJavaMethodModel.java
@@ -29,7 +29,6 @@ import org.apache.freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * Wraps a {@link Method} into the {@link TemplateFunctionModel} interface. It is used by {@link BeanModel} to wrap
@@ -69,10 +68,10 @@ public final class SimpleJavaMethodModel extends SimpleMethod implements JavaMet
             TemplateException {
         try {
             return wrapper.invokeMethod(object, (Method) getMember(), unwrapArguments(args, wrapper));
-        } catch (TemplateModelException e) {
+        } catch (TemplateException e) {
             throw e;
         } catch (Exception e) {
-            throw _MethodUtils.newInvocationTemplateModelException(object, getMember(), e);
+            throw _MethodUtils.newInvocationTemplateException(object, getMember(), e);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleMethod.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleMethod.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleMethod.java
index 78c624c..afe19c0 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleMethod.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleMethod.java
@@ -21,15 +21,14 @@ package org.apache.freemarker.core.model.impl;
 import java.lang.reflect.Array;
 import java.lang.reflect.Member;
 
-import org.apache.freemarker.core.util.CallableUtils;
-import org.apache.freemarker.core._DelayedTemplateLanguageTypeDescription;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedOrdinal;
+import org.apache.freemarker.core._DelayedTemplateLanguageTypeDescription;
 import org.apache.freemarker.core._ErrorDescriptionBuilder;
-import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
+import org.apache.freemarker.core.util.CallableUtils;
 import org.apache.freemarker.core.util._ClassUtils;
 
 /**
@@ -50,7 +49,7 @@ class SimpleMethod {
         this.argTypes = argTypes;
     }
     
-    Object[] unwrapArguments(TemplateModel[] args, DefaultObjectWrapper wrapper) throws TemplateModelException {
+    Object[] unwrapArguments(TemplateModel[] args, DefaultObjectWrapper wrapper) throws TemplateException {
         if (args == null) {
             args = CallableUtils.EMPTY_TEMPLATE_MODEL_ARRAY;
         }
@@ -58,14 +57,14 @@ class SimpleMethod {
         int typesLen = argTypes.length;
         if (isVarArg) {
             if (typesLen - 1 > args.length) {
-                throw new _TemplateModelException(
+                throw new TemplateException(
                         _MethodUtils.invocationErrorMessageStart(member),
                         " takes at least ", typesLen - 1,
                         typesLen - 1 == 1 ? " argument" : " arguments", ", but ",
                         args.length, " was given.");
             }
         } else if (typesLen != args.length) {
-            throw new _TemplateModelException(
+            throw new TemplateException(
                     _MethodUtils.invocationErrorMessageStart(member),
                     " takes ", typesLen, typesLen == 1 ? " argument" : " arguments", ", but ",
                     args.length, " was given.");
@@ -76,7 +75,7 @@ class SimpleMethod {
 
     private Object[] unwrapArguments(TemplateModel[] args, Class<?>[] argTypes, boolean isVarargs,
             DefaultObjectWrapper w)
-    throws TemplateModelException {
+    throws TemplateException {
         if (args == null) return null;
         
         int typesLen = argTypes.length;
@@ -145,7 +144,7 @@ class SimpleMethod {
         return unwrappedArgs;
     }
 
-    private TemplateModelException createArgumentTypeMismatchException(
+    private TemplateException createArgumentTypeMismatchException(
             int argIdx, TemplateModel argVal, Class<?> targetType) {
         _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
                 _MethodUtils.invocationErrorMessageStart(member), " couldn't be called: Can't convert the ",
@@ -155,11 +154,11 @@ class SimpleMethod {
         if (argVal instanceof TemplateMarkupOutputModel && (targetType.isAssignableFrom(String.class))) {
             desc.tip(MARKUP_OUTPUT_TO_STRING_TIP);
         }
-        return new _TemplateModelException(desc);
+        return new TemplateException(desc);
     }
 
-    private TemplateModelException createNullToPrimitiveArgumentException(int argIdx, Class<?> targetType) {
-        return new _TemplateModelException(
+    private TemplateException createNullToPrimitiveArgumentException(int argIdx, Class<?> targetType) {
+        return new TemplateException(
                 _MethodUtils.invocationErrorMessageStart(member), " couldn't be called: The value of the ",
                 new _DelayedOrdinal(argIdx + 1),
                 " argument was null, but the target Java parameter type (", _ClassUtils.getShortClassName(targetType),

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleSequence.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleSequence.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleSequence.java
index be48318..e0e0397 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleSequence.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/SimpleSequence.java
@@ -23,9 +23,9 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
 
@@ -132,7 +132,7 @@ public class SimpleSequence extends WrappingTemplateModel implements TemplateSeq
      * it to one now, and writes it back into the backing list.
      */
     @Override
-    public TemplateModel get(int index) throws TemplateModelException {
+    public TemplateModel get(int index) throws TemplateException {
         try {
             Object value = list.get(index);
             if (value instanceof TemplateModel) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
index fc32348..12ecbc3 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
@@ -26,11 +26,11 @@ import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,7 +48,7 @@ final class StaticModel implements TemplateHashModelEx {
     private final DefaultObjectWrapper wrapper;
     private final Map map = new HashMap();
 
-    StaticModel(Class clazz, DefaultObjectWrapper wrapper) throws TemplateModelException {
+    StaticModel(Class clazz, DefaultObjectWrapper wrapper) throws TemplateException {
         this.clazz = clazz;
         this.wrapper = wrapper;
         populate();
@@ -59,7 +59,7 @@ final class StaticModel implements TemplateHashModelEx {
      * parameter.
      */
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         Object model = map.get(key);
         // Simple method, overloaded method or final field -- these have cached 
         // template models
@@ -70,12 +70,12 @@ final class StaticModel implements TemplateHashModelEx {
             try {
                 return wrapper.getOuterIdentity().wrap(((Field) model).get(null));
             } catch (IllegalAccessException e) {
-                throw new TemplateModelException(
+                throw new TemplateException(
                     "Illegal access for field " + key + " of class " + clazz.getName());
             }
         }
 
-        throw new TemplateModelException(
+        throw new TemplateException(
             "No such key: " + key + " in class " + clazz.getName());
     }
 
@@ -94,18 +94,18 @@ final class StaticModel implements TemplateHashModelEx {
     }
     
     @Override
-    public TemplateCollectionModel keys() throws TemplateModelException {
+    public TemplateCollectionModel keys() throws TemplateException {
         return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.keySet());
     }
     
     @Override
-    public TemplateCollectionModel values() throws TemplateModelException {
+    public TemplateCollectionModel values() throws TemplateException {
         return (TemplateCollectionModel) wrapper.getOuterIdentity().wrap(map.values());
     }
 
-    private void populate() throws TemplateModelException {
+    private void populate() throws TemplateException {
         if (!Modifier.isPublic(clazz.getModifiers())) {
-            throw new TemplateModelException(
+            throw new TemplateException(
                 "Can't wrap the non-public class " + clazz.getName());
         }
         



[5/7] incubator-freemarker git commit: `TemplateModelException` was removed, replaced with `TemplateException` on all places, except for `ObjectWrapper.wrap(Object)` and `wrapAsAPI(Object)`, which now throws `ObjectWrappingException` instead (that extend

Posted by dd...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNodes.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNodes.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNodes.java
index 5174c3e..178c0e2 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNodes.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNodes.java
@@ -19,12 +19,11 @@
 
 package org.apache.freemarker.core;
 
-import static org.apache.freemarker.core.util.CallableUtils.getStringArgument;
+import static org.apache.freemarker.core.util.CallableUtils.*;
 
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNodeModel;
 import org.apache.freemarker.core.model.TemplateNodeModelEx;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -37,7 +36,7 @@ class BuiltInsForNodes {
     
     static class ancestorsBI extends BuiltInForNode {
        @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException {
+    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException {
            AncestorSequence result = new AncestorSequence(env);
            TemplateNodeModel parent = nodeModel.getParentNode();
            while (parent != null) {
@@ -109,14 +108,14 @@ class BuiltInsForNodes {
     
     static class childrenBI extends BuiltInForNode {
        @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException {
+    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException {
             return nodeModel.getChildNodes();
        }
     }
     
     static class node_nameBI extends BuiltInForNode {
        @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException {
+    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException {
             return new SimpleScalar(nodeModel.getNodeName());
        }
     }
@@ -124,7 +123,7 @@ class BuiltInsForNodes {
     
     static class node_namespaceBI extends BuiltInForNode {
         @Override
-        TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException {
             String nsURI = nodeModel.getNodeNamespace();
             return nsURI == null ? null : new SimpleScalar(nsURI);
         }
@@ -132,21 +131,21 @@ class BuiltInsForNodes {
     
     static class node_typeBI extends BuiltInForNode {
        @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException {
+    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException {
             return new SimpleScalar(nodeModel.getNodeType());
         }
     }
 
     static class parentBI extends BuiltInForNode {
        @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException {
+    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException {
             return nodeModel.getParentNode();
        }
     }
     
     static class rootBI extends BuiltInForNode {
        @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateModelException {
+    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment env) throws TemplateException {
             TemplateNodeModel result = nodeModel;
             TemplateNodeModel parent = nodeModel.getParentNode();
             while (parent != null) {
@@ -159,14 +158,14 @@ class BuiltInsForNodes {
 
     static class previousSiblingBI extends BuiltInForNodeEx {
         @Override
-        TemplateModel calculateResult(TemplateNodeModelEx nodeModel, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(TemplateNodeModelEx nodeModel, Environment env) throws TemplateException {
             return nodeModel.getPreviousSibling();
         }
     }
 
     static class nextSiblingBI extends  BuiltInForNodeEx {
         @Override
-        TemplateModel calculateResult(TemplateNodeModelEx nodeModel, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(TemplateNodeModelEx nodeModel, Environment env) throws TemplateException {
             return nodeModel.getNextSibling();
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNumbers.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNumbers.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNumbers.java
index c197756..447a644 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNumbers.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForNumbers.java
@@ -26,7 +26,6 @@ import java.util.Date;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.impl.SimpleDate;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
@@ -42,17 +41,17 @@ class BuiltInsForNumbers {
     private static abstract class abcBI extends BuiltInForNumber {
 
         @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateModelException {
+        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateException {
             final int n;
             try {
                 n = _NumberUtils.toIntExact(num);
             } catch (ArithmeticException e) {
-                throw new _TemplateModelException(target,
+                throw new TemplateException(target,
                         "The left side operand value isn't compatible with ?", key, ": ", e.getMessage());
          
             }
             if (n <= 0) {
-                throw new _TemplateModelException(target,
+                throw new TemplateException(target,
                         "The left side operand of to ?", key, " must be at least 1, but was ", Integer.valueOf(n), ".");
             }
             return new SimpleScalar(toABC(n));
@@ -82,7 +81,7 @@ class BuiltInsForNumbers {
     
     static class absBI extends BuiltInForNumber {
         @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateModelException {
+        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateException {
             if (num instanceof Integer) {
                 int n = num.intValue();
                 if (n < 0) {
@@ -140,7 +139,7 @@ class BuiltInsForNumbers {
                     return model;
                 }
             } else {
-                throw new _TemplateModelException("Unsupported number class: ", num.getClass());
+                throw new TemplateException("Unsupported number class: ", num.getClass());
             }            
         }
     }
@@ -201,7 +200,7 @@ class BuiltInsForNumbers {
 
     static class is_infiniteBI extends BuiltInForNumber {
         @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateModelException {
+        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateException {
             return _NumberUtils.isInfinite(num) ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
         }
     }
@@ -209,7 +208,7 @@ class BuiltInsForNumbers {
 
     static class is_nanBI extends BuiltInForNumber {
         @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateModelException {
+        TemplateModel calculateResult(Number num, TemplateModel model) throws TemplateException {
             return _NumberUtils.isNaN(num) ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
         }
     }
@@ -244,7 +243,7 @@ class BuiltInsForNumbers {
         
         @Override
         TemplateModel calculateResult(Number num, TemplateModel model)
-        throws TemplateModelException {
+        throws TemplateException {
             return new SimpleDate(new Date(safeToLong(num)), dateType);
         }
     }
@@ -267,11 +266,11 @@ class BuiltInsForNumbers {
         }
     }
 
-    private static long safeToLong(Number num) throws TemplateModelException {
+    private static long safeToLong(Number num) throws TemplateException {
         if (num instanceof Double) {
             double d = Math.round(num.doubleValue());
             if (d > Long.MAX_VALUE || d < Long.MIN_VALUE) {
-                throw new _TemplateModelException(
+                throw new TemplateException(
                         "Number doesn't fit into a 64 bit signed integer (long): ", Double.valueOf(d));
             } else {
                 return (long) d;
@@ -279,7 +278,7 @@ class BuiltInsForNumbers {
         } else if (num instanceof Float) {
             float f = Math.round(num.floatValue());
             if (f > Long.MAX_VALUE || f < Long.MIN_VALUE) {
-                throw new _TemplateModelException(
+                throw new TemplateException(
                         "Number doesn't fit into a 64 bit signed integer (long): ", Float.valueOf(f));
             } else {
                 return (long) f;
@@ -287,22 +286,22 @@ class BuiltInsForNumbers {
         } else if (num instanceof BigDecimal) {
             BigDecimal bd = ((BigDecimal) num).setScale(0, BigDecimal.ROUND_HALF_UP);
             if (bd.compareTo(BIG_DECIMAL_LONG_MAX) > 0 || bd.compareTo(BIG_DECIMAL_LONG_MIN) < 0) {
-                throw new _TemplateModelException("Number doesn't fit into a 64 bit signed integer (long): ", bd);
+                throw new TemplateException("Number doesn't fit into a 64 bit signed integer (long): ", bd);
             } else {
                 return bd.longValue();
             }
         } else if (num instanceof BigInteger) {
             BigInteger bi = (BigInteger) num;
             if (bi.compareTo(BIG_INTEGER_LONG_MAX) > 0 || bi.compareTo(BIG_INTEGER_LONG_MIN) < 0) {
-                throw new _TemplateModelException("Number doesn't fit into a 64 bit signed integer (long): ", bi);
+                throw new TemplateException("Number doesn't fit into a 64 bit signed integer (long): ", bi);
             } else {
                 return bi.longValue();
             }
         } else if (num instanceof Long || num instanceof Integer || num instanceof Byte || num instanceof Short) {
             return num.longValue();
         } else {
-            // Should add Atomic* types in 2.4...
-            throw new _TemplateModelException("Unsupported number type: ", num.getClass());
+            // TODO [FM3] Should add Atomic* types in 2.4...
+            throw new TemplateException("Unsupported number type: ", num.getClass());
         }
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForOutputFormatRelated.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForOutputFormatRelated.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForOutputFormatRelated.java
index 5ab518c..e1e7b5f 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForOutputFormatRelated.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForOutputFormatRelated.java
@@ -64,7 +64,7 @@ class BuiltInsForOutputFormatRelated {
                     // ATTENTION: Keep this logic in sync. with ${...}'s logic!
                     String lhoPlainTtext = lhoOF.getSourcePlainText(lhoMO);
                     if (lhoPlainTtext == null) {
-                        throw new _TemplateModelException(target,
+                        throw new TemplateException(target,
                                 "The left side operand of ?", key, " is in ", new _DelayedToString(lhoOF),
                                 " format, which differs from the current output format, ",
                                 new _DelayedToString(contextOF), ". Conversion wasn't possible.");

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForSequences.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForSequences.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForSequences.java
index 857e7e3..d0fa358 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForSequences.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForSequences.java
@@ -36,7 +36,6 @@ import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -101,7 +100,7 @@ class BuiltInsForSequences {
 
             @Override
             public TemplateModel get(final int chunkIndex)
-                    throws TemplateModelException {
+                    throws TemplateException {
                 if (chunkIndex >= numberOfChunks) {
                     return null;
                 }
@@ -112,7 +111,7 @@ class BuiltInsForSequences {
 
                     @Override
                     public TemplateModel get(int relIndex)
-                            throws TemplateModelException {
+                            throws TemplateException {
                         int absIndex = baseIndex + relIndex;
                         if (absIndex < wrappedTsm.size()) {
                             return wrappedTsm.get(absIndex);
@@ -124,7 +123,7 @@ class BuiltInsForSequences {
                     }
 
                     @Override
-                    public int size() throws TemplateModelException {
+                    public int size() throws TemplateException {
                         return fillerItem != null || chunkIndex + 1 < numberOfChunks
                                 ? chunkSize
                                 : wrappedTsm.size() - baseIndex;
@@ -134,14 +133,14 @@ class BuiltInsForSequences {
             }
 
             @Override
-            public int size() throws TemplateModelException {
+            public int size() throws TemplateException {
                 return numberOfChunks;
             }
             
         }
         
         @Override
-        TemplateModel calculateResult(TemplateSequenceModel tsm) throws TemplateModelException {
+        TemplateModel calculateResult(TemplateSequenceModel tsm) throws TemplateException {
             return new BIMethod(tsm);
         }
         
@@ -169,7 +168,7 @@ class BuiltInsForSequences {
         }        
         
         private TemplateModel calculateResultForSequence(TemplateSequenceModel seq)
-        throws TemplateModelException {
+        throws TemplateException {
             if (seq.size() == 0) {
                 return null;
             }
@@ -177,7 +176,7 @@ class BuiltInsForSequences {
         }
         
         private TemplateModel calculateResultForColletion(TemplateCollectionModel coll)
-        throws TemplateModelException {
+        throws TemplateException {
             TemplateModelIterator iter = coll.iterator();
             if (!iter.hasNext()) {
                 return null;
@@ -272,7 +271,7 @@ class BuiltInsForSequences {
     static class lastBI extends BuiltInForSequence {
         @Override
         TemplateModel calculateResult(TemplateSequenceModel tsm)
-        throws TemplateModelException {
+        throws TemplateException {
             if (tsm.size() == 0) {
                 return null;
             }
@@ -289,12 +288,12 @@ class BuiltInsForSequences {
             }
 
             @Override
-            public TemplateModel get(int index) throws TemplateModelException {
+            public TemplateModel get(int index) throws TemplateException {
                 return seq.get(seq.size() - 1 - index);
             }
 
             @Override
-            public int size() throws TemplateModelException {
+            public int size() throws TemplateException {
                 return seq.size();
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
index 119a1b8..1eaeb2d 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
@@ -30,7 +30,6 @@ import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -304,7 +303,7 @@ class BuiltInsForStringsBasic {
         }
         
         @Override
-        TemplateModel calculateResult(String s, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(String s, Environment env) throws TemplateException {
             return new KeepAfterMethod(s);
         }
         
@@ -362,7 +361,7 @@ class BuiltInsForStringsBasic {
         }
         
         @Override
-        TemplateModel calculateResult(String s, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(String s, Environment env) throws TemplateException {
             return new KeepAfterMethod(s);
         }
         
@@ -411,7 +410,7 @@ class BuiltInsForStringsBasic {
         }
         
         @Override
-        TemplateModel calculateResult(String s, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(String s, Environment env) throws TemplateException {
             return new KeepUntilMethod(s);
         }
         
@@ -467,7 +466,7 @@ class BuiltInsForStringsBasic {
         }
         
         @Override
-        TemplateModel calculateResult(String s, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(String s, Environment env) throws TemplateException {
             return new KeepUntilMethod(s);
         }
         
@@ -635,7 +634,7 @@ class BuiltInsForStringsBasic {
         }
         
         @Override
-        TemplateModel calculateResult(String s, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(String s, Environment env) throws TemplateException {
             return new SplitMethod(s);
         }
         
@@ -722,7 +721,7 @@ class BuiltInsForStringsBasic {
             }
 
             private TemplateException newIndexGreaterThanLengthException(
-                    int argIdx, int idx, final int len) throws TemplateModelException {
+                    int argIdx, int idx, final int len) throws TemplateException {
                 return newArgumentValueException(
                         argIdx,
                         "mustn't be greater than the length of the string, " + len + ", but it was " + idx + ".",
@@ -730,7 +729,7 @@ class BuiltInsForStringsBasic {
             }
 
             private TemplateException newIndexLessThan0Exception(
-                    int argIdx, int idx) throws TemplateModelException {
+                    int argIdx, int idx) throws TemplateException {
                 return newArgumentValueException(
                         argIdx, "must be at least 0, but was " + idx + ".", this);
             }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
index 8c6a6df..e36572c 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
@@ -19,7 +19,7 @@
 
 package org.apache.freemarker.core;
 
-import static org.apache.freemarker.core.util.CallableUtils.getStringArgument;
+import static org.apache.freemarker.core.util.CallableUtils.*;
 
 import java.io.UnsupportedEncodingException;
 import java.nio.charset.Charset;
@@ -28,7 +28,6 @@ import java.nio.charset.UnsupportedCharsetException;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.apache.freemarker.core.util._StringUtils;
@@ -173,25 +172,24 @@ class BuiltInsForStringsEncoding {
         }
 
         @Override
-        public String getAsString() throws TemplateModelException {
+        public String getAsString() throws TemplateException {
             if (cachedResult == null) {
                 Charset charset = env.getEffectiveURLEscapingCharset();
                 if (charset == null) {
-                    throw new TemplateModelException(
-                            "To do URL encoding, the framework that encloses "
-                            + "FreeMarker must specify the output encoding "
-                            + "or the URL encoding charset, so ask the "
-                            + "programmers to fix it. Or, as a last chance, "
-                            + "you can set the url_encoding_charset setting in "
-                            + "the template, e.g. "
-                            + "<#setting urlEscapingCharset='ISO-8859-1'>, or "
-                            + "give the charset explicitly to the buit-in, e.g. "
+                    throw new TemplateException(
+                            "To do URL encoding, the framework that encloses FreeMarker must specify the \"",
+                            Configuration.Builder.OUTPUT_ENCODING_KEY, "\" setting or the \"",
+                            Configuration.Builder.URL_ESCAPING_CHARSET_KEY,
+                            "\" setting, so ask the programmers to set them. Or, as a last chance, you can set the "
+                            + "url_encoding_charset setting in the template, e.g. <#setting ",
+                            Configuration.Builder.URL_ESCAPING_CHARSET_KEY,
+                            "='ISO-8859-1'>, or give the charset explicitly to the built-in, e.g. "
                             + "foo?url('ISO-8859-1').");
                 }
                 try {
                     cachedResult = encodeWithCharset(charset);
                 } catch (UnsupportedEncodingException e) {
-                    throw new _TemplateModelException(e, "Failed to execute URL encoding.");
+                    throw new TemplateException(e, "Failed to execute URL encoding.");
                 }
             }
             return cachedResult;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
index d2e5f48..6280c68 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
@@ -29,7 +29,6 @@ import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.BeanModel;
@@ -208,7 +207,7 @@ class BuiltInsForStringsMisc {
                         env.setFastInvalidReferenceExceptions(lastFIRE);
                     }
                 } catch (Exception e) {
-                    throw new _TemplateModelException(e,
+                    throw new TemplateException(e,
                             "Template created with \"?", key, "\" has stopped with this error:\n\n",
                             MessageUtils.EMBEDDED_MESSAGE_BEGIN,
                             new _DelayedGetMessage(e),
@@ -276,14 +275,14 @@ class BuiltInsForStringsMisc {
 
             @Override
             public TemplateModel execute(TemplateModel[] args, CallPlace callPlace, Environment env)
-                    throws TemplateModelException {
+                    throws TemplateException {
                 ObjectWrapper ow = env.getObjectWrapper();
                 if (ow instanceof DefaultObjectWrapper) {
                     return ow.wrap(((DefaultObjectWrapper) ow).newInstance(cl, args, callPlace));
                 }
 
                 if (args.length != 0) {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "className?new(args) only supports 0 arguments in the current configuration, because "
                             + " the objectWrapper setting value is not a "
                             + DefaultObjectWrapper.class.getName() +
@@ -292,7 +291,7 @@ class BuiltInsForStringsMisc {
                 try {
                     return ow.wrap(cl.newInstance());
                 } catch (Exception e) {
-                    throw new TemplateModelException("Failed to instantiate "
+                    throw new TemplateException("Failed to instantiate "
                             + cl.getName() + " with its parameterless constructor; see cause exception", e);
                 }
             }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
index 15ea886..d885845 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
@@ -30,7 +30,6 @@ import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
@@ -69,7 +68,7 @@ class BuiltInsForStringsRegexp {
             
             String matchString;
             
-            MatcherBuilder(String matchString) throws TemplateModelException {
+            MatcherBuilder(String matchString) throws TemplateException {
                 this.matchString = matchString;
             }
 
@@ -97,7 +96,7 @@ class BuiltInsForStringsRegexp {
         }
         
         @Override
-        TemplateModel calculateResult(String s, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(String s, Environment env) throws TemplateException {
             return new MatcherBuilder(s);
         }
         
@@ -145,7 +144,7 @@ class BuiltInsForStringsRegexp {
         }
         
         @Override
-        TemplateModel calculateResult(String s, Environment env) throws TemplateModelException {
+        TemplateModel calculateResult(String s, Environment env) throws TemplateException {
             return new ReplaceMethod(s);
         }
         
@@ -189,7 +188,7 @@ class BuiltInsForStringsRegexp {
         }
         
         @Override
-        public TemplateModel get(int i) throws TemplateModelException {
+        public TemplateModel get(int i) throws TemplateException {
             ArrayList matchingInputParts = this.matchingInputParts;
             if (matchingInputParts == null) {
                 matchingInputParts = getMatchingInputPartsAndStoreResults();
@@ -216,7 +215,7 @@ class BuiltInsForStringsRegexp {
                 entireInputMatchGroups = new TemplateSequenceModel() {
                     
                     @Override
-                    public TemplateModel get(int i) throws TemplateModelException {
+                    public TemplateModel get(int i) throws TemplateException {
                         try {
                             // Avoid IndexOutOfBoundsException:
                             if (i > firedEntireInputMatcher.groupCount()) {
@@ -225,16 +224,16 @@ class BuiltInsForStringsRegexp {
 
                             return new SimpleScalar(firedEntireInputMatcher.group(i));
                         } catch (Exception e) {
-                            throw new TemplateModelException("Failed to read match group", e);
+                            throw new TemplateException("Failed to read regular expression match group", e);
                         }
                     }
                     
                     @Override
-                    public int size() throws TemplateModelException {
+                    public int size() throws TemplateException {
                         try {
                             return firedEntireInputMatcher.groupCount() + 1;
                         } catch (Exception e) {
-                            throw new TemplateModelException("Failed to get match group count", e);
+                            throw new TemplateException("Failed to get regular expression match group count", e);
                         }
                     }
                     
@@ -244,7 +243,7 @@ class BuiltInsForStringsRegexp {
             return entireInputMatchGroups;
         }
         
-        private ArrayList getMatchingInputPartsAndStoreResults() throws TemplateModelException {
+        private ArrayList getMatchingInputPartsAndStoreResults() throws TemplateException {
             ArrayList matchingInputParts = new ArrayList();
             
             Matcher matcher = pattern.matcher(input);
@@ -285,10 +284,12 @@ class BuiltInsForStringsRegexp {
                     }
                     
                     @Override
-                    public TemplateModel next() throws TemplateModelException {
+                    public TemplateModel next() throws TemplateException {
                         final ArrayList matchingInputParts = RegexMatchModel.this.matchingInputParts;
                         if (matchingInputParts == null) {
-                            if (!hasFindInfo) throw new TemplateModelException("There were no more matches");
+                            if (!hasFindInfo) {
+                                throw new TemplateException("There were no more regular expression matches");
+                            }
                             MatchWithGroups result = new MatchWithGroups(input, matcher);
                             nextIdx++;
                             hasFindInfo = matcher.find();
@@ -297,7 +298,7 @@ class BuiltInsForStringsRegexp {
                             try {
                                 return (TemplateModel) matchingInputParts.get(nextIdx++);
                             } catch (IndexOutOfBoundsException e) {
-                                throw new TemplateModelException("There were no more matches", e);
+                                throw new TemplateException("There were no more regular expression matches", e);
                             }
                         }
                     }
@@ -314,11 +315,11 @@ class BuiltInsForStringsRegexp {
                     }
                     
                     @Override
-                    public TemplateModel next() throws TemplateModelException {
+                    public TemplateModel next() throws TemplateException {
                         try {
                             return (TemplateModel) matchingInputParts.get(nextIdx++);
                         } catch (IndexOutOfBoundsException e) {
-                            throw new TemplateModelException("There were no more matches", e);
+                            throw new TemplateException("There were no more regular expression matches", e);
                         }
                     }
                 };
@@ -326,7 +327,7 @@ class BuiltInsForStringsRegexp {
         }
         
         @Override
-        public int size() throws TemplateModelException {
+        public int size() throws TemplateException {
             ArrayList matchingInputParts = this.matchingInputParts;
             if (matchingInputParts == null) {
                 matchingInputParts = getMatchingInputPartsAndStoreResults();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
index e817c1c..9f4d04b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Configuration.java
@@ -47,9 +47,9 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.freemarker.core.arithmetic.ArithmeticEngine;
 import org.apache.freemarker.core.arithmetic.impl.BigDecimalArithmeticEngine;
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.RestrictedObjectWrapper;
 import org.apache.freemarker.core.outputformat.MarkupOutputFormat;
@@ -348,7 +348,7 @@ public final class Configuration implements TopLevelConfiguration, CustomStateSc
             for (Entry<String, Object> ent : sharedVariables.entrySet()) {
                 try {
                     wrappedSharedVariables.put(ent.getKey(), objectWrapper.wrap(ent.getValue()));
-                } catch (TemplateModelException e) {
+                } catch (ObjectWrappingException e) {
                     throw new InvalidSettingValueException(
                             ExtendableBuilder.SHARED_VARIABLES_KEY, null, false,
                             "Failed to wrap shared variable " + _StringUtils.jQuote(ent.getKey()),

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/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 7e7703d..e899ab2 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
@@ -55,7 +55,6 @@ import org.apache.freemarker.core.model.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.TemplateModelWithOriginName;
 import org.apache.freemarker.core.model.TemplateNodeModel;
@@ -443,13 +442,13 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
         } else {
             pushLocalContext(new LocalContext() {
                 @Override
-                public TemplateModel getLocalVariable(String name) throws TemplateModelException {
+                public TemplateModel getLocalVariable(String name) throws TemplateException {
                     int index = nestedContentParamNames.get(name);
                     return index != -1 ? nestedContentParamValues[index] : null;
                 }
 
                 @Override
-                public Collection<String> getLocalVariableNames() throws TemplateModelException {
+                public Collection<String> getLocalVariableNames() throws TemplateException {
                     return nestedContentParamNames.getKeys();
                 }
             });
@@ -624,7 +623,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
 
     private Object[] noNodeHandlerDefinedDescription(
             TemplateNodeModel node, String ns, String nodeType)
-                    throws TemplateModelException {
+                    throws TemplateException {
         String nsPrefix;
         if (ns != null) {
             if (ns.length() > 0) {
@@ -666,8 +665,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
         if (node == null) {
             node = getCurrentVisitorNode();
             if (node == null) {
-                throw new TemplateModelException(
-                        "The target node of recursion is missing or null.");
+                throw new TemplateException("The target node of recursion is missing or null.");
             }
         }
         TemplateSequenceModel children = node.getChildNodes();
@@ -1092,9 +1090,9 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * @param exp
      *            The blamed expression if an error occurs; it's only needed for better error messages
      */
-    String formatNumberToPlainText(TemplateNumberModel number, ASTExpression exp, boolean useTempModelExc)
+    String formatNumberToPlainText(TemplateNumberModel number, ASTExpression exp)
             throws TemplateException {
-        return formatNumberToPlainText(number, getTemplateNumberFormat(exp, useTempModelExc), exp, useTempModelExc);
+        return formatNumberToPlainText(number, getTemplateNumberFormat(exp), exp);
     }
 
     /**
@@ -1104,13 +1102,12 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      *            The blamed expression if an error occurs; it's only needed for better error messages
      */
     String formatNumberToPlainText(
-            TemplateNumberModel number, TemplateNumberFormat format, ASTExpression exp,
-            boolean useTempModelExc)
+            TemplateNumberModel number, TemplateNumberFormat format, ASTExpression exp)
             throws TemplateException {
         try {
             return _EvalUtils.assertFormatResultNotNull(format.formatToPlainText(number));
         } catch (TemplateValueFormatException e) {
-            throw MessageUtils.newCantFormatNumberException(format, exp, e, useTempModelExc);
+            throw MessageUtils.newCantFormatNumberException(format, exp, e);
         }
     }
 
@@ -1174,7 +1171,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
     /**
      * Convenience wrapper around {@link #getTemplateNumberFormat()} to be called during expression evaluation.
      */
-    TemplateNumberFormat getTemplateNumberFormat(ASTExpression exp, boolean useTempModelExc) throws TemplateException {
+    TemplateNumberFormat getTemplateNumberFormat(ASTExpression exp) throws TemplateException {
         TemplateNumberFormat format;
         try {
             format = getTemplateNumberFormat();
@@ -1183,8 +1180,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
                     "Failed to get number format object for the current number format string, ",
                     new _DelayedJQuote(getNumberFormat()), ": ", e.getMessage())
                     .blame(exp); 
-            throw useTempModelExc
-                    ? new _TemplateModelException(e, this, desc) : new TemplateException(e, this, desc);
+            throw new TemplateException(e, this, desc);
         }
         return format;
     }
@@ -1195,7 +1191,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * @param exp
      *            The blamed expression if an error occurs; it's only needed for better error messages
      */
-    TemplateNumberFormat getTemplateNumberFormat(String formatString, ASTExpression exp, boolean useTempModelExc)
+    TemplateNumberFormat getTemplateNumberFormat(String formatString, ASTExpression exp)
             throws TemplateException {
         TemplateNumberFormat format;
         try {
@@ -1205,8 +1201,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
                     "Failed to get number format object for the ", new _DelayedJQuote(formatString),
                     " number format string: ", e.getMessage())
                     .blame(exp);
-            throw useTempModelExc
-                    ? new _TemplateModelException(e, this, desc) : new TemplateException(e, this, desc);
+            throw new TemplateException(e, this, desc);
         }
         return format;
     }
@@ -1379,14 +1374,13 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * @param tdmSourceExpr
      *            The blamed expression if an error occurs; only used for error messages.
      */
-    String formatDateToPlainText(TemplateDateModel tdm, ASTExpression tdmSourceExpr,
-            boolean useTempModelExc) throws TemplateException {
-        TemplateDateFormat format = getTemplateDateFormat(tdm, tdmSourceExpr, useTempModelExc);
+    String formatDateToPlainText(TemplateDateModel tdm, ASTExpression tdmSourceExpr) throws TemplateException {
+        TemplateDateFormat format = getTemplateDateFormat(tdm, tdmSourceExpr);
         
         try {
             return _EvalUtils.assertFormatResultNotNull(format.formatToPlainText(tdm));
         } catch (TemplateValueFormatException e) {
-            throw MessageUtils.newCantFormatDateException(format, tdmSourceExpr, e, useTempModelExc);
+            throw MessageUtils.newCantFormatDateException(format, tdmSourceExpr, e);
         }
     }
 
@@ -1397,19 +1391,17 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      *            The blamed expression if an error occurs; only used for error messages.
      */
     String formatDateToPlainText(TemplateDateModel tdm, String formatString,
-            ASTExpression blamedDateSourceExp, ASTExpression blamedFormatterExp,
-            boolean useTempModelExc) throws TemplateException {
+            ASTExpression blamedDateSourceExp, ASTExpression blamedFormatterExp) throws TemplateException {
         Date date = _EvalUtils.modelToDate(tdm, blamedDateSourceExp);
         
         TemplateDateFormat format = getTemplateDateFormat(
                 formatString, tdm.getDateType(), date.getClass(),
-                blamedDateSourceExp, blamedFormatterExp,
-                useTempModelExc);
+                blamedDateSourceExp, blamedFormatterExp);
         
         try {
             return _EvalUtils.assertFormatResultNotNull(format.formatToPlainText(tdm));
         } catch (TemplateValueFormatException e) {
-            throw MessageUtils.newCantFormatDateException(format, blamedDateSourceExp, e, useTempModelExc);
+            throw MessageUtils.newCantFormatDateException(format, blamedDateSourceExp, e);
         }
     }
 
@@ -1569,20 +1561,19 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
         return getTemplateDateFormatWithoutCache(formatString, dateType, locale, timeZone, zonelessInput);
     }
     
-    TemplateDateFormat getTemplateDateFormat(TemplateDateModel tdm, ASTExpression tdmSourceExpr, boolean useTempModelExc)
+    TemplateDateFormat getTemplateDateFormat(TemplateDateModel tdm, ASTExpression tdmSourceExpr)
             throws TemplateException {
         Date date = _EvalUtils.modelToDate(tdm, tdmSourceExpr);
         
         return getTemplateDateFormat(
-                tdm.getDateType(), date.getClass(), tdmSourceExpr,
-                useTempModelExc);
+                tdm.getDateType(), date.getClass(), tdmSourceExpr);
     }
 
     /**
      * Same as {@link #getTemplateDateFormat(int, Class)}, but translates the exceptions to {@link TemplateException}-s.
      */
     TemplateDateFormat getTemplateDateFormat(
-            int dateType, Class<? extends Date> dateClass, ASTExpression blamedDateSourceExp, boolean useTempModelExc)
+            int dateType, Class<? extends Date> dateClass, ASTExpression blamedDateSourceExp)
                     throws TemplateException {
         try {
             return getTemplateDateFormat(dateType, dateClass);
@@ -1614,7 +1605,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
                     "\" 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 TemplateException(e, desc);
+            throw new TemplateException(e, desc);
         }
     }
 
@@ -1624,8 +1615,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      */
     TemplateDateFormat getTemplateDateFormat(
             String formatString, int dateType, Class<? extends Date> dateClass,
-            ASTExpression blamedDateSourceExp, ASTExpression blamedFormatterExp,
-            boolean useTempModelExc)
+            ASTExpression blamedDateSourceExp, ASTExpression blamedFormatterExp)
                     throws TemplateException {
         try {
             return getTemplateDateFormat(formatString, dateType, dateClass);
@@ -1637,7 +1627,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
                     new _DelayedJQuote(formatString), ". Reason given: ",
                     e.getMessage())
                     .blame(blamedFormatterExp);
-            throw useTempModelExc ? new _TemplateModelException(e, desc) : new TemplateException(e, desc);
+            throw new TemplateException(e, desc);
         }
     }
 
@@ -1854,7 +1844,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * according to our terminology.)
      */
     // TODO [FM3] Don't return nested content params anymore (see JavaDoc)
-    public TemplateModel getLocalVariable(String name) throws TemplateModelException {
+    public TemplateModel getLocalVariable(String name) throws TemplateException {
         if (localContextStack != null) {
             for (int i = localContextStack.size() - 1; i >= 0; i--) {
                 LocalContext lc = localContextStack.get(i);
@@ -1884,7 +1874,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * </li>
      * </ol>
      */
-    public TemplateModel getVariable(String name) throws TemplateModelException {
+    public TemplateModel getVariable(String name) throws TemplateException {
         TemplateModel result = getLocalVariable(name);
         if (result == null) {
             result = currentNamespace.get(name);
@@ -1900,7 +1890,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * <code>.globals.<i>name</i></code>. This will first look at variables that were assigned globally via: &lt;#global
      * ...&gt; and then at the data model exposed to the template.
      */
-    public TemplateModel getGlobalVariable(String name) throws TemplateModelException {
+    public TemplateModel getGlobalVariable(String name) throws TemplateException {
         TemplateModel result = globalNamespace.get(name);
         if (result == null) {
             result = rootDataModel.get(name);
@@ -1956,7 +1946,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
      * object on each call that is completely disconnected from the Environment. That is, modifying the set will have no
      * effect on the Environment object.
      */
-    public Set getKnownVariableNames() throws TemplateModelException {
+    public Set getKnownVariableNames() throws TemplateException {
         // shared vars.
         Set set = configuration.getSharedVariables().keySet();
 
@@ -2210,7 +2200,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
             }
 
             @Override
-            public TemplateModel get(String key) throws TemplateModelException {
+            public TemplateModel get(String key) throws TemplateException {
                 TemplateModel value = rootDataModel.get(key);
                 if (value == null) {
                     value = configuration.getWrappedSharedVariable(key);
@@ -2223,12 +2213,12 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
             return new TemplateHashModelEx() {
 
                 @Override
-                public boolean isEmpty() throws TemplateModelException {
+                public boolean isEmpty() throws TemplateException {
                     return result.isEmpty();
                 }
 
                 @Override
-                public TemplateModel get(String key) throws TemplateModelException {
+                public TemplateModel get(String key) throws TemplateException {
                     return result.get(key);
                 }
 
@@ -2236,17 +2226,17 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
                 // configuration shared variables even though
                 // the hash will return them, if only for BWC reasons
                 @Override
-                public TemplateCollectionModel values() throws TemplateModelException {
+                public TemplateCollectionModel values() throws TemplateException {
                     return ((TemplateHashModelEx) rootDataModel).values();
                 }
 
                 @Override
-                public TemplateCollectionModel keys() throws TemplateModelException {
+                public TemplateCollectionModel keys() throws TemplateException {
                     return ((TemplateHashModelEx) rootDataModel).keys();
                 }
 
                 @Override
-                public int size() throws TemplateModelException {
+                public int size() throws TemplateException {
                     return ((TemplateHashModelEx) rootDataModel).size();
                 }
             };
@@ -2268,7 +2258,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
             }
 
             @Override
-            public TemplateModel get(String key) throws TemplateModelException {
+            public TemplateModel get(String key) throws TemplateException {
                 TemplateModel result = globalNamespace.get(key);
                 if (result == null) {
                     result = rootDataModel.get(key);
@@ -2760,10 +2750,10 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
             customLookupCondition = getIncludedTemplateCustomLookupCondition();
         }
 
-        private void ensureInitializedTME() throws TemplateModelException {
+        private void ensureInitializedTME() throws TemplateException {
             if (status != InitializationStatus.INITIALIZED && status != InitializationStatus.INITIALIZING) {
                 if (status == InitializationStatus.FAILED) {
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "Lazy initialization of the imported namespace for "
                             + _StringUtils.jQuote(templateName)
                             + " has already failed earlier; won't retry it.");
@@ -2774,7 +2764,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
                     status = InitializationStatus.INITIALIZED;
                 } catch (Exception e) {
                     // [FM3] Rethrow TemplateException-s as is
-                    throw new TemplateModelException(
+                    throw new TemplateException(
                             "Lazy initialization of the imported namespace for "
                             + _StringUtils.jQuote(templateName)
                             + " has failed; see cause exception", e);
@@ -2789,7 +2779,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
         private void ensureInitializedRTE() {
             try {
                 ensureInitializedTME();
-            } catch (TemplateModelException e) {
+            } catch (TemplateException e) {
                 throw new RuntimeException(e.getMessage(), e.getCause());
             }
         }
@@ -2830,7 +2820,7 @@ public final class Environment extends MutableProcessingConfiguration<Environmen
         }
 
         @Override
-        public TemplateModel get(String key) throws TemplateModelException {
+        public TemplateModel get(String key) throws TemplateException {
             ensureInitializedTME();
             return super.get(key);
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/ListableRightUnboundedRangeModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/ListableRightUnboundedRangeModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/ListableRightUnboundedRangeModel.java
index 935bce9..0b7e94e 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/ListableRightUnboundedRangeModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/ListableRightUnboundedRangeModel.java
@@ -23,7 +23,6 @@ import java.math.BigInteger;
 
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
 
@@ -37,12 +36,12 @@ final class ListableRightUnboundedRangeModel extends RightUnboundedRangeModel im
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return Integer.MAX_VALUE;
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return new TemplateModelIterator() {
             boolean needInc;
             int nextType = 1;
@@ -51,7 +50,7 @@ final class ListableRightUnboundedRangeModel extends RightUnboundedRangeModel im
             BigInteger nextBigInteger;
 
             @Override
-            public TemplateModel next() throws TemplateModelException {
+            public TemplateModel next() throws TemplateException {
                 if (needInc) {
                     switch (nextType) {
                     case 1:
@@ -84,7 +83,7 @@ final class ListableRightUnboundedRangeModel extends RightUnboundedRangeModel im
             }
 
             @Override
-            public boolean hasNext() throws TemplateModelException {
+            public boolean hasNext() throws TemplateException {
                 return true;
             }
             

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/LocalContext.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/LocalContext.java b/freemarker-core/src/main/java/org/apache/freemarker/core/LocalContext.java
index 59d867d..551ce25 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/LocalContext.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/LocalContext.java
@@ -22,7 +22,6 @@ package org.apache.freemarker.core;
 import java.util.Collection;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
   * An interface that represents a local context. This is used as the abstraction for  
@@ -30,6 +29,6 @@ import org.apache.freemarker.core.model.TemplateModelException;
   * a macro.
   */
 public interface LocalContext {
-    TemplateModel getLocalVariable(String name) throws TemplateModelException;
-    Collection<String> getLocalVariableNames() throws TemplateModelException;
+    TemplateModel getLocalVariable(String name) throws TemplateException;
+    Collection<String> getLocalVariableNames() throws TemplateException;
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtils.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtils.java b/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtils.java
index d1db6e6..21f7876 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtils.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/MessageUtils.java
@@ -24,7 +24,6 @@ import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateMarkupOutputModel;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateNumberModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
@@ -208,34 +207,30 @@ class MessageUtils {
                 "Instantiating ", className, " is not allowed in the template for security reasons.");
     }
     
-    static TemplateModelException newCantFormatUnknownTypeDateException(
+    static TemplateException newCantFormatUnknownTypeDateException(
             ASTExpression dateSourceExpr, UnknownDateTypeFormattingUnsupportedException cause) {
-        return new _TemplateModelException(cause, null, new _ErrorDescriptionBuilder(
+        return new TemplateException(cause, null, new _ErrorDescriptionBuilder(
                 UNKNOWN_DATE_TO_STRING_ERROR_MESSAGE)
                 .blame(dateSourceExpr)
                 .tips(UNKNOWN_DATE_TO_STRING_TIPS));
     }
 
     static TemplateException newCantFormatDateException(TemplateDateFormat format, ASTExpression dataSrcExp,
-                                                        TemplateValueFormatException e, boolean useTempModelExc) {
+                                                        TemplateValueFormatException e) {
         _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
                 "Failed to format date/time/dateTime with format ", new _DelayedJQuote(format.getDescription()), ": ",
                 e.getMessage())
                 .blame(dataSrcExp); 
-        return useTempModelExc
-                ? new _TemplateModelException(e, null, desc)
-                : new TemplateException(e, null, desc);
+        return new TemplateException(e, null, desc);
     }
     
     static TemplateException newCantFormatNumberException(TemplateNumberFormat format, ASTExpression dataSrcExp,
-                                                          TemplateValueFormatException e, boolean useTempModelExc) {
+                                                          TemplateValueFormatException e) {
         _ErrorDescriptionBuilder desc = new _ErrorDescriptionBuilder(
                 "Failed to format number with format ", new _DelayedJQuote(format.getDescription()), ": ",
                 e.getMessage())
                 .blame(dataSrcExp); 
-        return useTempModelExc
-                ? new _TemplateModelException(e, null, desc)
-                : new TemplateException(e, null, desc);
+        return new TemplateException(e, null, desc);
     }
     
     /**

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/NativeCollectionEx.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeCollectionEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeCollectionEx.java
index 5afa98a..119cae5 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeCollectionEx.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeCollectionEx.java
@@ -25,7 +25,6 @@ import java.util.Iterator;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateCollectionModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 
 /**
@@ -50,15 +49,15 @@ class NativeCollectionEx implements TemplateCollectionModelEx {
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return new TemplateModelIterator() {
 
             private final Iterator<TemplateModel> iterator = collection.iterator();
 
             @Override
-            public TemplateModel next() throws TemplateModelException {
+            public TemplateModel next() throws TemplateException {
                 if (!iterator.hasNext()) {
-                    throw new TemplateModelException("The collection has no more items.");
+                    throw new TemplateException("The collection has no more items.");
                 }
 
                 return iterator.next();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java
index 2850255..526bf6b 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeHashEx2.java
@@ -28,7 +28,6 @@ import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 
 /**
@@ -46,42 +45,42 @@ class NativeHashEx2 implements TemplateHashModelEx2, Serializable {
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return map.size();
     }
 
     @Override
-    public TemplateModel get(String key) throws TemplateModelException {
+    public TemplateModel get(String key) throws TemplateException {
         return map.get(key);
     }
 
     @Override
-    public boolean isEmpty() throws TemplateModelException {
+    public boolean isEmpty() throws TemplateException {
         return map.isEmpty();
     }
 
     @Override
-    public KeyValuePairIterator keyValuePairIterator() throws TemplateModelException {
+    public KeyValuePairIterator keyValuePairIterator() throws TemplateException {
         return new KeyValuePairIterator() {
             private final Iterator<Map.Entry<String, TemplateModel>> entrySetIterator = map.entrySet().iterator();
 
             @Override
-            public boolean hasNext() throws TemplateModelException {
+            public boolean hasNext() throws TemplateException {
                 return entrySetIterator.hasNext();
             }
 
             @Override
-            public KeyValuePair next() throws TemplateModelException {
+            public KeyValuePair next() throws TemplateException {
                 return new KeyValuePair() {
                     private final Map.Entry<String, TemplateModel> entry = entrySetIterator.next();
 
                     @Override
-                    public TemplateModel getKey() throws TemplateModelException {
+                    public TemplateModel getKey() throws TemplateException {
                         return new SimpleScalar(entry.getKey());
                     }
 
                     @Override
-                    public TemplateModel getValue() throws TemplateModelException {
+                    public TemplateModel getValue() throws TemplateException {
                         return entry.getValue();
                     }
                 };
@@ -90,12 +89,12 @@ class NativeHashEx2 implements TemplateHashModelEx2, Serializable {
     }
 
     @Override
-    public TemplateCollectionModel keys() throws TemplateModelException {
+    public TemplateCollectionModel keys() throws TemplateException {
         return new NativeStringCollectionCollectionEx(map.keySet());
     }
 
     @Override
-    public TemplateCollectionModel values() throws TemplateModelException {
+    public TemplateCollectionModel values() throws TemplateException {
         return new NativeCollectionEx(map.values());
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/NativeSequence.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeSequence.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeSequence.java
index d1b6886..5a43ef6 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeSequence.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeSequence.java
@@ -25,7 +25,6 @@ import java.util.Collection;
 
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 
 /**
@@ -63,12 +62,12 @@ class NativeSequence implements TemplateSequenceModel, Serializable {
     }
 
     @Override
-    public TemplateModel get(int index) throws TemplateModelException {
+    public TemplateModel get(int index) throws TemplateException {
         return items.get(index);
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return items.size();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringArraySequence.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringArraySequence.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringArraySequence.java
index 96e9899..fedaf66 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringArraySequence.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringArraySequence.java
@@ -21,7 +21,6 @@ package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.DefaultArrayAdapter;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -41,12 +40,12 @@ class NativeStringArraySequence implements TemplateSequenceModel {
     }
 
     @Override
-    public TemplateModel get(int index) throws TemplateModelException {
+    public TemplateModel get(int index) throws TemplateException {
         return index < items.length ? new SimpleScalar(items[index]) : null;
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return items.length;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringCollectionCollectionEx.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringCollectionCollectionEx.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringCollectionCollectionEx.java
index b2437e7..cef0e79 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringCollectionCollectionEx.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringCollectionCollectionEx.java
@@ -25,7 +25,6 @@ import java.util.Iterator;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateCollectionModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
 import org.apache.freemarker.core.model.impl.DefaultNonListCollectionAdapter;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -56,15 +55,15 @@ class NativeStringCollectionCollectionEx implements TemplateCollectionModelEx {
     }
 
     @Override
-    public TemplateModelIterator iterator() throws TemplateModelException {
+    public TemplateModelIterator iterator() throws TemplateException {
         return new TemplateModelIterator() {
 
             private final Iterator<String> iterator = collection.iterator();
 
             @Override
-            public TemplateModel next() throws TemplateModelException {
+            public TemplateModel next() throws TemplateException {
                 if (!iterator.hasNext()) {
-                    throw new TemplateModelException("The collection has no more items.");
+                    throw new TemplateException("The collection has no more items.");
                 }
 
                 return new SimpleScalar(iterator.next());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringListSequence.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringListSequence.java b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringListSequence.java
index 7846fd3..6adeade 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringListSequence.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/NativeStringListSequence.java
@@ -23,7 +23,6 @@ import java.util.List;
 
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.DefaultListAdapter;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
@@ -44,12 +43,12 @@ class NativeStringListSequence implements TemplateSequenceModel {
     }
 
     @Override
-    public TemplateModel get(int index) throws TemplateModelException {
+    public TemplateModel get(int index) throws TemplateException {
         return index < items.size() ? new SimpleScalar(items.get(index)) : null;
     }
 
     @Override
-    public int size() throws TemplateModelException {
+    public int size() throws TemplateException {
         return items.size();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/RangeModel.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/RangeModel.java b/freemarker-core/src/main/java/org/apache/freemarker/core/RangeModel.java
index 45f9345..512102a 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/RangeModel.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/RangeModel.java
@@ -20,7 +20,6 @@
 package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 import org.apache.freemarker.core.model.impl.SimpleNumber;
 
@@ -37,9 +36,9 @@ abstract class RangeModel implements TemplateSequenceModel, java.io.Serializable
     }
     
     @Override
-    final public TemplateModel get(int index) throws TemplateModelException {
+    final public TemplateModel get(int index) throws TemplateException {
         if (index < 0 || index >= size()) {
-            throw new _TemplateModelException("Range item index ", Integer.valueOf(index), " is out of bounds.");
+            throw new TemplateException("Range item index ", Integer.valueOf(index), " is out of bounds.");
         }
         long value = begin + getStep() * (long) index;
         return value <= Integer.MAX_VALUE ? new SimpleNumber((int) value) : new SimpleNumber(value);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/RegexpHelper.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/RegexpHelper.java b/freemarker-core/src/main/java/org/apache/freemarker/core/RegexpHelper.java
index 37b5fd5..17b58c3 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/RegexpHelper.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/RegexpHelper.java
@@ -22,7 +22,6 @@ package org.apache.freemarker.core;
 import java.util.regex.Pattern;
 import java.util.regex.PatternSyntaxException;
 
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.templateresolver.impl.MruCacheStorage;
 import org.apache.freemarker.core.util._StringUtils;
 import org.slf4j.Logger;
@@ -64,7 +63,7 @@ final class RegexpHelper {
     private RegexpHelper() { }
 
     static Pattern getPattern(String patternString, int flags)
-    throws TemplateModelException {
+    throws TemplateException {
         PatternCacheKey patternKey = new PatternCacheKey(patternString, flags);
         
         Pattern result;
@@ -79,8 +78,7 @@ final class RegexpHelper {
         try {
             result = Pattern.compile(patternString, flags);
         } catch (PatternSyntaxException e) {
-            throw new _TemplateModelException(e,
-                    "Malformed regular expression: ", new _DelayedGetMessage(e));
+            throw new TemplateException(e, "Malformed regular expression: ", new _DelayedGetMessage(e));
         }
         synchronized (patternCache) {
             patternCache.put(patternKey, result);
@@ -176,12 +174,12 @@ final class RegexpHelper {
         LOG.warn(message);
     }
 
-    static void checkNonRegexpFlags(String biName, long flags) throws _TemplateModelException {
+    static void checkNonRegexpFlags(String biName, long flags) throws TemplateException {
         checkOnlyHasNonRegexpFlags(biName, flags, false);
     }
     
     static void checkOnlyHasNonRegexpFlags(String biName, long flags, boolean strict)
-            throws _TemplateModelException {
+            throws TemplateException {
         if (!strict && !flagWarningsEnabled) return;
         
         String flag; 
@@ -198,7 +196,7 @@ final class RegexpHelper {
         final Object[] msg = { "?", biName ," doesn't support the \"", flag, "\" flag "
                 + "without the \"r\" flag." };
         if (strict) {
-            throw new _TemplateModelException(msg);
+            throw new TemplateException(msg);
         } else {
             // Suppress error for backward compatibility
             logFlagWarning(new _ErrorDescriptionBuilder(msg).toString());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java b/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
index 9384b9e..1354694 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Template.java
@@ -45,6 +45,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.freemarker.core.arithmetic.ArithmeticEngine;
 import org.apache.freemarker.core.debug._DebuggerService;
 import org.apache.freemarker.core.model.ObjectWrapper;
+import org.apache.freemarker.core.model.ObjectWrappingException;
 import org.apache.freemarker.core.model.TemplateHashModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateNodeModel;
@@ -411,9 +412,11 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
      *            {@link ProcessingConfiguration#getAutoFlush() autoFlush} to {@code false} to disable this,
      *            {@link Writer#flush()} will be called at the when the template processing was finished.
      *            {@link Writer#close()} is not called. Can't be {@code null}.
-     * 
+     *
      * @throws TemplateException
      *             if an exception occurs during template processing
+     * @throws ObjectWrappingException
+     *             if the {@code dataModel} couldn't be wrapped; note that this extends {@link TemplateException}
      * @throws IOException
      *             if an I/O exception occurs during writing to the writer.
      */
@@ -429,9 +432,6 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
      * typical example of recursive node processing.
      * 
      * @param rootNode The root node for recursive processing or {@code null}.
-     * 
-     * @throws TemplateException if an exception occurs during template processing
-     * @throws IOException if an I/O exception occurs during writing to the writer.
      */
     public void process(Object dataModel, Writer out, ObjectWrapper wrapper, TemplateNodeModel rootNode)
     throws TemplateException, IOException {
@@ -495,9 +495,13 @@ public class Template implements ProcessingConfiguration, CustomStateScope {
     *     
     * @return the {@link Environment} object created for processing. Call {@link Environment#process()} to process the
     *    template.
-    * 
-    * @throws TemplateException if an exception occurs while setting up the Environment object.
-    * @throws IOException if an exception occurs doing any auto-imports
+    *
+    * @throws TemplateException
+    *             if an exception occurs during template processing
+    * @throws ObjectWrappingException
+    *             if the {@code dataModel} couldn't be wrapped; note that this extends {@link TemplateException}
+    * @throws IOException
+    *             if an I/O exception occurs during writing to the writer.
     */
     public Environment createProcessingEnvironment(Object dataModel, Writer out, ObjectWrapper wrapper)
     throws TemplateException, IOException {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateException.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateException.java b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateException.java
index bcbb645..7e7dd09 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateException.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/TemplateException.java
@@ -101,7 +101,11 @@ public class TemplateException extends Exception {
     public TemplateException(Throwable cause, Environment env) {
         this(null, cause, env);
     }
-    
+
+    public TemplateException(String description, Throwable cause) {
+        this(description, cause, null);
+    }
+
     /**
      * Constructs a TemplateException with both a description of the error
      * that occurred and the underlying Exception that caused this exception
@@ -136,7 +140,7 @@ public class TemplateException extends Exception {
     // Permutation group:
 
     public TemplateException(String description) {
-        this(description, null);
+        this(description, (Throwable) null);
     }
 
     TemplateException(Environment env, String description) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/d73da6da/freemarker-core/src/main/java/org/apache/freemarker/core/_CoreAPI.java
----------------------------------------------------------------------
diff --git a/freemarker-core/src/main/java/org/apache/freemarker/core/_CoreAPI.java b/freemarker-core/src/main/java/org/apache/freemarker/core/_CoreAPI.java
index df7042b..9110a5d 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/_CoreAPI.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/_CoreAPI.java
@@ -20,7 +20,6 @@
 package org.apache.freemarker.core;
 
 import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.util._NullArgumentException;
 
 /**
@@ -47,20 +46,6 @@ public final class _CoreAPI {
         }
     }
 
-    /**
-     * The work around the problematic cases where we should throw a {@link TemplateException}, but we are inside
-     * a {@link TemplateModel} method and so we can only throw {@link TemplateModelException}-s.  
-     */
-    // [FM3] Get rid of this problem, then delete this method
-    public static TemplateModelException ensureIsTemplateModelException(String modelOpMsg, TemplateException e) {
-        if (e instanceof TemplateModelException) {
-            return (TemplateModelException) e;
-        } else {
-            return new _TemplateModelException(
-                    e.getBlamedExpression(), e.getCause(), e.getEnvironment(), modelOpMsg);
-        }
-    }
-
     public static boolean isMacro(Class<? extends TemplateModel> cl) {
         return Environment.TemplateLanguageDirective.class.isAssignableFrom(cl);
     }