http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/DateFormatTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/core/DateFormatTest.java 
b/src/test/java/org/apache/freemarker/core/DateFormatTest.java
index 4fdb1c7..049655f 100644
--- a/src/test/java/org/apache/freemarker/core/DateFormatTest.java
+++ b/src/test/java/org/apache/freemarker/core/DateFormatTest.java
@@ -44,7 +44,7 @@ import 
org.apache.freemarker.core.valueformat.TemplateDateFormatFactory;
 import org.apache.freemarker.core.valueformat.UndefinedCustomFormatException;
 import 
org.apache.freemarker.core.valueformat.impl.AliasTemplateDateFormatFactory;
 import org.apache.freemarker.test.TemplateTest;
-import org.junit.Before;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableMap;
@@ -55,20 +55,22 @@ public class DateFormatTest extends TemplateTest {
     private static long T = 1441540800000L;
     private static TemplateDateModel TM = new SimpleDate(new Date(T), 
TemplateDateModel.DATETIME);
     
-    @Before
-    public void setup() {
-        Configuration cfg = getConfiguration();
-        cfg.setIncompatibleImprovements(Configuration.VERSION_3_0_0);
-        cfg.setLocale(Locale.US);
-        cfg.setTimeZone(TimeZone.getTimeZone("GMT+01:00"));
-        cfg.setSQLDateAndTimeTimeZone(TimeZone.getTimeZone("UTC"));
-        
-        cfg.setCustomDateFormats(ImmutableMap.of(
-                "epoch", EpochMillisTemplateDateFormatFactory.INSTANCE,
-                "loc", LocAndTZSensitiveTemplateDateFormatFactory.INSTANCE,
-                "div", EpochMillisDivTemplateDateFormatFactory.INSTANCE,
-                "appMeta", AppMetaTemplateDateFormatFactory.INSTANCE,
-                "htmlIso", HTMLISOTemplateDateFormatFactory.INSTANCE));
+    private TestConfigurationBuilder createConfigurationBuilder() {
+        return new TestConfigurationBuilder()
+                .locale(Locale.US)
+                .timeZone(TimeZone.getTimeZone("GMT+01:00"))
+                .sqlDateAndTimeTimeZone(TimeZone.getTimeZone("UTC"))
+                .customDateFormats(ImmutableMap.of(
+                        "epoch", EpochMillisTemplateDateFormatFactory.INSTANCE,
+                        "loc", 
LocAndTZSensitiveTemplateDateFormatFactory.INSTANCE,
+                        "div", 
EpochMillisDivTemplateDateFormatFactory.INSTANCE,
+                        "appMeta", AppMetaTemplateDateFormatFactory.INSTANCE,
+                        "htmlIso", HTMLISOTemplateDateFormatFactory.INSTANCE));
+    }
+
+    @Override
+    protected Configuration createDefaultConfiguration() throws Exception {
+        return createConfigurationBuilder().build();
     }
 
     @Test
@@ -77,14 +79,14 @@ public class DateFormatTest extends TemplateTest {
         assertOutput(
                 "${d?string.@epoch} ${d?string.@epoch} <#setting 
locale='de_DE'>${d?string.@epoch}",
                 "123456789 123456789 123456789");
-        
-        getConfiguration().setDateTimeFormat("@epoch");
+
+        setConfigurationWithDateTimeFormat("@epoch");
         assertOutput(
                 "<#assign d = d?datetime>"
                 + "${d} ${d?string} <#setting locale='de_DE'>${d}",
                 "123456789 123456789 123456789");
-        
-        getConfiguration().setDateTimeFormat("@htmlIso");
+
+        setConfigurationWithDateTimeFormat("@htmlIso");
         assertOutput(
                 "<#assign d = d?datetime>"
                 + "${d} ${d?string} <#setting locale='de_DE'>${d}",
@@ -105,8 +107,8 @@ public class DateFormatTest extends TemplateTest {
                 "123456789@en_US:GMT+01:00 123456789@en_US:GMT+01:00 "
                 + "123456789@de_DE:GMT+01:00 123456789@de_DE:GMT+01:00 "
                 + "123456789@en_US:GMT+01:00 123456789@en_US:GMT+01:00");
-        
-        getConfiguration().setDateTimeFormat("@loc");
+
+        setConfigurationWithDateTimeFormat("@loc");
         assertOutput(
                 "<#assign d = d?datetime>"
                 + "${d} ${d?string} "
@@ -122,7 +124,7 @@ public class DateFormatTest extends TemplateTest {
     @Test
     public void testTimeZoneChange() throws Exception {
         addToDataModel("d", new Date(123456789));
-        getConfiguration().setDateTimeFormat("iso");
+        setConfigurationWithDateTimeFormat("iso");
         assertOutput(
                 "${d?string.@loc} ${d?string.@loc} ${d?datetime?isoLocal} "
                 + "<#setting timeZone='GMT+02:00'>"
@@ -132,8 +134,8 @@ public class DateFormatTest extends TemplateTest {
                 "123456789@en_US:GMT+01:00 123456789@en_US:GMT+01:00 
1970-01-02T11:17:36+01:00 "
                 + "123456789@en_US:GMT+02:00 123456789@en_US:GMT+02:00 
1970-01-02T12:17:36+02:00 "
                 + "123456789@en_US:GMT+01:00 123456789@en_US:GMT+01:00 
1970-01-02T11:17:36+01:00");
-        
-        getConfiguration().setDateTimeFormat("@loc");
+
+        setConfigurationWithDateTimeFormat("@loc");
         assertOutput(
                 "<#assign d = d?datetime>"
                 + "${d} ${d?string} "
@@ -148,31 +150,41 @@ public class DateFormatTest extends TemplateTest {
     
     @Test
     public void testWrongFormatStrings() throws Exception {
-        getConfiguration().setDateTimeFormat("x1");
+        setConfigurationWithDateTimeFormat("x1");
         assertErrorContains("${.now}", "\"x1\"", "'x'");
         assertErrorContains("${.now?string}", "\"x1\"", "'x'");
-        getConfiguration().setDateTimeFormat("short");
+        setConfigurationWithDateTimeFormat("short");
         assertErrorContains("${.now?string('x2')}", "\"x2\"", "'x'");
+        assertErrorContains("${.now?string('[wrong]')}", "format string", 
"[wrong]");
+
+        setConfiguration(createConfigurationBuilder()
+                .dateFormat("[wrong d]")
+                .dateTimeFormat("[wrong dt]")
+                .timeFormat("[wrong t]")
+                .build());
+        assertErrorContains("${.now?date}", "\"date_format\"", "[wrong d]");
+        assertErrorContains("${.now?datetime}", "\"datetime_format\"", "[wrong 
dt]");
+        assertErrorContains("${.now?time}", "\"time_format\"", "[wrong t]");
     }
 
     @Test
     public void testCustomParameterized() throws Exception {
         Configuration cfg = getConfiguration();
         addToDataModel("d", new SimpleDate(new Date(12345678L), 
TemplateDateModel.DATETIME));
-        cfg.setDateTimeFormat("@div 1000");
+        setConfigurationWithDateTimeFormat("@div 1000");
         assertOutput("${d}", "12345");
         assertOutput("${d?string}", "12345");
         assertOutput("${d?string.@div_100}", "123456");
         
         assertErrorContains("${d?string.@div_xyz}", "\"@div_xyz\"", "\"xyz\"");
-        cfg.setDateTimeFormat("@div");
+        setConfigurationWithDateTimeFormat("@div");
         assertErrorContains("${d}", "\"datetime_format\"", "\"@div\"", "format 
parameter is required");
     }
     
     @Test
     public void testUnknownCustomFormat() throws Exception {
         {
-            getConfiguration().setDateTimeFormat("@noSuchFormat");
+            setConfigurationWithDateTimeFormat("@noSuchFormat");
             Throwable exc = assertErrorContains(
                     "${.now}",
                     "\"@noSuchFormat\"", "\"noSuchFormat\"", 
"\"datetime_format\"");
@@ -180,26 +192,30 @@ public class DateFormatTest extends TemplateTest {
             
         }
         {
-            getConfiguration().setDateFormat("@noSuchFormatD");
+            
setConfiguration(createConfigurationBuilder().dateFormat("@noSuchFormatD").build());
             assertErrorContains(
                     "${.now?date}",
                     "\"@noSuchFormatD\"", "\"noSuchFormatD\"", 
"\"date_format\"");
         }
         {
-            getConfiguration().setTimeFormat("@noSuchFormatT");
+            
setConfiguration(createConfigurationBuilder().timeFormat("@noSuchFormatT").build());
             assertErrorContains(
                     "${.now?time}",
                     "\"@noSuchFormatT\"", "\"noSuchFormatT\"", 
"\"time_format\"");
         }
 
         {
-            getConfiguration().setDateTimeFormat("");
+            setConfigurationWithDateTimeFormat("");
             Throwable exc = 
assertErrorContains("${.now?string('@noSuchFormat2')}",
                     "\"@noSuchFormat2\"", "\"noSuchFormat2\"");
             assertThat(exc.getCause(), 
instanceOf(UndefinedCustomFormatException.class));
         }
     }
-    
+
+    private void setConfigurationWithDateTimeFormat(String formatString) {
+        
setConfiguration(createConfigurationBuilder().dateTimeFormat(formatString).build());
+    }
+
     @Test
     public void testNullInModel() throws Exception {
         addToDataModel("d", new MutableTemplateDateModel());
@@ -209,37 +225,40 @@ public class DateFormatTest extends TemplateTest {
     
     @Test
     public void testIcIAndEscaping() throws Exception {
-        Configuration cfg = getConfiguration();
         addToDataModel("d", new SimpleDate(new Date(12345678L), 
TemplateDateModel.DATETIME));
         
-        cfg.setDateTimeFormat("@epoch");
+        setConfigurationWithDateTimeFormat("@epoch");
         assertOutput("${d}", "12345678");
-        cfg.setDateTimeFormat("'@'yyyy");
+        setConfigurationWithDateTimeFormat("'@'yyyy");
         assertOutput("${d}", "@1970");
-        cfg.setDateTimeFormat("@@yyyy");
+        setConfigurationWithDateTimeFormat("@@yyyy");
         assertOutput("${d}", "@@1970");
-        
-        cfg.setCustomDateFormats(Collections.<String, 
TemplateDateFormatFactory>emptyMap());
-        
-        cfg.setDateTimeFormat("@epoch");
+
+        setConfiguration(createConfigurationBuilder()
+                .customDateFormats(Collections.<String, 
TemplateDateFormatFactory>emptyMap())
+                .dateTimeFormat("@epoch")
+                .build());
         assertErrorContains("${d}", "custom", "\"epoch\"");
     }
 
     @Test
     public void testEnvironmentGetters() throws Exception {
-        Template t = new Template(null, "", getConfiguration());
-        Environment env = t.createProcessingEnvironment(null, null);
-        
-        Configuration cfg = getConfiguration();
-        
         String dateFormatStr = "yyyy.MM.dd. (Z)";
         String timeFormatStr = "HH:mm";
         String dateTimeFormatStr = "yyyy.MM.dd. HH:mm";
-        cfg.setDateFormat(dateFormatStr);
-        cfg.setTimeFormat(timeFormatStr);
-        cfg.setDateTimeFormat(dateTimeFormatStr);
+
+        setConfiguration(createConfigurationBuilder()
+                .dateFormat(dateFormatStr)
+                .timeFormat(timeFormatStr)
+                .dateTimeFormat(dateTimeFormatStr)
+                .build());
+
+        Configuration cfg = getConfiguration();
+
+        Template t = new Template(null, "", cfg);
+        Environment env = t.createProcessingEnvironment(null, null);
         
-        // Test that values are coming from the cache if possible 
+        // Test that values are coming from the cache if possible
         for (Class dateClass : new Class[] { Date.class, Timestamp.class, 
java.sql.Date.class, Time.class } ) {
             for (int dateType
                     : new int[] { TemplateDateModel.DATE, 
TemplateDateModel.TIME, TemplateDateModel.DATETIME }) {
@@ -314,32 +333,25 @@ public class DateFormatTest extends TemplateTest {
             assertEquals("2015.09.06. 13:00 Sunday", 
format2.formatToPlainText(TM));
             assertSame(format1, format2);
         }
-        
-        addToDataModel("d", TM);
-        assertErrorContains("${d?string('[wrong]')}", "format string", 
"[wrong]");
-        cfg.setDateFormat("[wrong d]");
-        cfg.setDateTimeFormat("[wrong dt]");
-        cfg.setTimeFormat("[wrong t]");
-        assertErrorContains("${d?date}", "\"date_format\"", "[wrong d]");
-        assertErrorContains("${d?datetime}", "\"datetime_format\"", "[wrong 
dt]");
-        assertErrorContains("${d?time}", "\"time_format\"", "[wrong t]");
     }
-    
+
     @Test
-    public void testAlieses() throws Exception {
-        Configuration cfg = getConfiguration();
-        cfg.setCustomDateFormats(ImmutableMap.of(
-                "d", new AliasTemplateDateFormatFactory("yyyy-MMM-dd"),
-                "m", new AliasTemplateDateFormatFactory("yyyy-MMM"),
-                "epoch", EpochMillisTemplateDateFormatFactory.INSTANCE));
-        
-        TemplateConfiguration.Builder tcb = new 
TemplateConfiguration.Builder();
-        tcb.setCustomDateFormats(ImmutableMap.of(
-                "m", new AliasTemplateDateFormatFactory("yyyy-MMMM"),
-                "i", new AliasTemplateDateFormatFactory("@epoch")));
-        cfg.setTemplateConfigurations(new 
ConditionalTemplateConfigurationFactory(
-                new FileNameGlobMatcher("*2*"), tcb.build()));
-        
+    public void testAliases() throws Exception {
+        setConfiguration(createConfigurationBuilder()
+                .customDateFormats(ImmutableMap.of(
+                        "d", new AliasTemplateDateFormatFactory("yyyy-MMM-dd"),
+                        "m", new AliasTemplateDateFormatFactory("yyyy-MMM"),
+                        "epoch", 
EpochMillisTemplateDateFormatFactory.INSTANCE))
+                .templateConfigurations(
+                        new ConditionalTemplateConfigurationFactory(
+                                new FileNameGlobMatcher("*2*"),
+                                new TemplateConfiguration.Builder()
+                                        .customDateFormats(ImmutableMap.of(
+                                                "m", new 
AliasTemplateDateFormatFactory("yyyy-MMMM"),
+                                                "i", new 
AliasTemplateDateFormatFactory("@epoch")))
+                                        .build()))
+                .build());
+
         addToDataModel("d", TM);
         String commonFtl = "${d?string.@d} ${d?string.@m} "
                 + "<#setting locale='fr_FR'>${d?string.@m} "
@@ -353,15 +365,17 @@ public class DateFormatTest extends TemplateTest {
     }
     
     @Test
-    public void testAlieses2() throws Exception {
-        Configuration cfg = getConfiguration();
-        cfg.setCustomDateFormats(ImmutableMap.of(
-                "d", new AliasTemplateDateFormatFactory("yyyy-MMM",
-                        ImmutableMap.of(
-                                new Locale("en"), "yyyy-MMM'_en'",
-                                Locale.UK, "yyyy-MMM'_en_GB'",
-                                Locale.FRANCE, "yyyy-MMM'_fr_FR'"))));
-        cfg.setDateTimeFormat("@d");
+    public void testAliases2() throws Exception {
+        setConfiguration(
+                createConfigurationBuilder()
+                .customDateFormats(ImmutableMap.of(
+                        "d", new AliasTemplateDateFormatFactory("yyyy-MMM",
+                                ImmutableMap.of(
+                                        new Locale("en"), "yyyy-MMM'_en'",
+                                        Locale.UK, "yyyy-MMM'_en_GB'",
+                                        Locale.FRANCE, "yyyy-MMM'_fr_FR'"))))
+                .dateTimeFormat("@d")
+                .build());
         addToDataModel("d", TM);
         assertOutput(
                 "<#setting locale='en_US'>${d} "
@@ -377,11 +391,13 @@ public class DateFormatTest extends TemplateTest {
      */
     @Test
     public void testZeroArgDateBI() throws IOException, TemplateException {
-        Configuration cfg = getConfiguration();
-        cfg.setDateFormat("@epoch");
-        cfg.setDateTimeFormat("@epoch");
-        cfg.setTimeFormat("@epoch");
-        
+        setConfiguration(
+                createConfigurationBuilder()
+                .dateFormat("@epoch")
+                .dateTimeFormat("@epoch")
+                .timeFormat("@epoch")
+                .build());
+
         addToDataModel("t", String.valueOf(T));
         
         assertOutput(
@@ -397,11 +413,13 @@ public class DateFormatTest extends TemplateTest {
 
     @Test
     public void testAppMetaRoundtrip() throws IOException, TemplateException {
-        Configuration cfg = getConfiguration();
-        cfg.setDateFormat("@appMeta");
-        cfg.setDateTimeFormat("@appMeta");
-        cfg.setTimeFormat("@appMeta");
-        
+        setConfiguration(
+                createConfigurationBuilder()
+                .dateFormat("@appMeta")
+                .dateTimeFormat("@appMeta")
+                .timeFormat("@appMeta")
+                .build());
+
         addToDataModel("t", String.valueOf(T) + "/foo");
         
         assertOutput(

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java 
b/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
index 15f96dd..29220c4 100644
--- a/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
+++ b/src/test/java/org/apache/freemarker/core/DirectiveCallPlaceTest.java
@@ -36,12 +36,7 @@ import org.apache.freemarker.test.TemplateTest;
 import org.junit.Test;
 
 public class DirectiveCallPlaceTest extends TemplateTest {
-    
-    @Override
-    protected Configuration createConfiguration() {
-        return new Configuration(Configuration.VERSION_3_0_0);
-    }
-    
+
     @Test
     public void testCustomDataBasics() throws IOException, TemplateException {
         addTemplate(

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/EncodingOverrideTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/core/EncodingOverrideTest.java 
b/src/test/java/org/apache/freemarker/core/EncodingOverrideTest.java
index ece57c1..b1acead 100644
--- a/src/test/java/org/apache/freemarker/core/EncodingOverrideTest.java
+++ b/src/test/java/org/apache/freemarker/core/EncodingOverrideTest.java
@@ -27,6 +27,7 @@ import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 
+import org.apache.freemarker.core.templateresolver.impl.ClassTemplateLoader;
 import org.junit.Test;
 
 public class EncodingOverrideTest {
@@ -52,10 +53,10 @@ public class EncodingOverrideTest {
     }
     
     private Configuration createConfig(Charset charset) {
-       Configuration cfg = new Configuration(Configuration.VERSION_3_0_0);
-       cfg.setClassForTemplateLoading(EncodingOverrideTest.class, "");
-       cfg.setSourceEncoding(charset);
-       return cfg;
+       return new Configuration.Builder(Configuration.VERSION_3_0_0)
+               .templateLoader(new 
ClassTemplateLoader(EncodingOverrideTest.class, ""))
+               .sourceEncoding(charset)
+               .build();
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/EnvironmentGetTemplateVariantsTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/EnvironmentGetTemplateVariantsTest.java
 
b/src/test/java/org/apache/freemarker/core/EnvironmentGetTemplateVariantsTest.java
index a82b29c..b79559c 100644
--- 
a/src/test/java/org/apache/freemarker/core/EnvironmentGetTemplateVariantsTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/EnvironmentGetTemplateVariantsTest.java
@@ -32,6 +32,7 @@ import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
 import org.apache.freemarker.test.TemplateTest;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 public class EnvironmentGetTemplateVariantsTest extends TemplateTest {
@@ -187,10 +188,10 @@ public class EnvironmentGetTemplateVariantsTest extends 
TemplateTest {
     }
     
     private Configuration createConfiguration(Version iciVersion) {
-        Configuration cfg = new Configuration(iciVersion);
-        cfg.setTemplateLoader(TEMPLATES);
-        cfg.setWhitespaceStripping(false);
-        return cfg;
+        return new TestConfigurationBuilder(iciVersion)
+                .templateLoader(TEMPLATES)
+                .whitespaceStripping(false)
+                .build();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/ExceptionTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/core/ExceptionTest.java 
b/src/test/java/org/apache/freemarker/core/ExceptionTest.java
index e70869e..19c3b6e 100644
--- a/src/test/java/org/apache/freemarker/core/ExceptionTest.java
+++ b/src/test/java/org/apache/freemarker/core/ExceptionTest.java
@@ -34,6 +34,7 @@ import java.util.Locale;
 
 import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
 import org.apache.freemarker.core.util._NullWriter;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 
 import junit.framework.TestCase;
 public class ExceptionTest extends TestCase {
@@ -43,9 +44,8 @@ public class ExceptionTest extends TestCase {
     }
 
     public void testParseExceptionSerializable() throws IOException, 
ClassNotFoundException {
-        Configuration cfg = new Configuration();
         try {
-            new Template("<string>", new StringReader("<@>"), cfg);
+            new Template(null, new StringReader("<@>"), new 
TestConfigurationBuilder().build());
             fail();
         } catch (ParseException e) {
             ByteArrayOutputStream out = new ByteArrayOutputStream();
@@ -55,8 +55,8 @@ public class ExceptionTest extends TestCase {
     }
 
     public void testTemplateErrorSerializable() throws IOException, 
ClassNotFoundException {
-        Configuration cfg = new Configuration();
-        Template tmp = new Template("<string>", new 
StringReader("${noSuchVar}"), cfg);
+        Template tmp = new Template(null, new StringReader("${noSuchVar}"),
+                new TestConfigurationBuilder().build());
         try {
             tmp.process(Collections.EMPTY_MAP, new StringWriter());
             fail();
@@ -69,13 +69,11 @@ public class ExceptionTest extends TestCase {
     
     @SuppressWarnings("boxing")
     public void testTemplateExceptionLocationInformation() throws IOException {
-        Configuration cfg = new Configuration();
-        
         StringTemplateLoader tl = new StringTemplateLoader();
         tl.putTemplate("foo_en.ftl", "\n\nxxx${noSuchVariable}");
-        cfg.setTemplateLoader(tl);
-        
-        Template t = cfg.getTemplate("foo.ftl", Locale.US);
+
+        Template t = new TestConfigurationBuilder().templateLoader(tl).build()
+                .getTemplate("foo.ftl", Locale.US);
         try {
             t.process(null, _NullWriter.INSTANCE);
             fail();
@@ -94,14 +92,12 @@ public class ExceptionTest extends TestCase {
 
     @SuppressWarnings("cast")
     public void testParseExceptionLocationInformation() throws IOException {
-        Configuration cfg = new Configuration(Configuration.VERSION_3_0_0);
-        
         StringTemplateLoader tl = new StringTemplateLoader();
         tl.putTemplate("foo_en.ftl", "\n\nxxx<#noSuchDirective>");
-        cfg.setTemplateLoader(tl);
-        
+
         try {
-            cfg.getTemplate("foo.ftl", Locale.US);
+            new TestConfigurationBuilder().templateLoader(tl).build()
+                    .getTemplate("foo.ftl", Locale.US);
             fail();
         } catch (ParseException e) {
             System.out.println(e.getMessage());

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/GetSourceTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/core/GetSourceTest.java 
b/src/test/java/org/apache/freemarker/core/GetSourceTest.java
index 81feec6..1462bfc 100644
--- a/src/test/java/org/apache/freemarker/core/GetSourceTest.java
+++ b/src/test/java/org/apache/freemarker/core/GetSourceTest.java
@@ -20,30 +20,30 @@ package org.apache.freemarker.core;
 
 import static org.junit.Assert.*;
 
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 public class GetSourceTest {
 
     @Test
     public void testGetSource() throws Exception {
-        Configuration cfg = new Configuration(Configuration.VERSION_3_0_0);
-        
         {
             // Note: Default tab size is 8.
-            Template t = new Template(null, "a\n\tb\nc", cfg);
+            Template t = new Template(null, "a\n\tb\nc",
+                    new TestConfigurationBuilder().build());
             // A historical quirk we keep for B.C.: it repaces tabs with 
spaces.
             assertEquals("a\n        b\nc", t.getSource(1, 1, 1, 3));
         }
         
         {
-            cfg.setTabSize(4);
-            Template t = new Template(null, "a\n\tb\nc", cfg);
+            Template t = new Template(null, "a\n\tb\nc",
+                    new TestConfigurationBuilder().tabSize(4).build());
             assertEquals("a\n    b\nc", t.getSource(1, 1, 1, 3));
         }
         
         {
-            cfg.setTabSize(1);
-            Template t = new Template(null, "a\n\tb\nc", cfg);
+            Template t = new Template(null, "a\n\tb\nc",
+                    new TestConfigurationBuilder().tabSize(1).build());
             // If tab size is 1, it behaves as it always should have: it keeps 
the tab.
             assertEquals("a\n\tb\nc", t.getSource(1, 1, 1, 3));
         }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/HeaderParsingTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/core/HeaderParsingTest.java 
b/src/test/java/org/apache/freemarker/core/HeaderParsingTest.java
index 87bae62..6f8851d 100644
--- a/src/test/java/org/apache/freemarker/core/HeaderParsingTest.java
+++ b/src/test/java/org/apache/freemarker/core/HeaderParsingTest.java
@@ -22,16 +22,14 @@ package org.apache.freemarker.core;
 import java.io.IOException;
 
 import org.apache.freemarker.test.TemplateTest;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 public class HeaderParsingTest extends TemplateTest {
 
-    private final Configuration cfgStripWS = new 
Configuration(Configuration.VERSION_3_0_0);
-    private final Configuration cfgNoStripWS = new 
Configuration(Configuration.VERSION_3_0_0);
-    {
-        cfgNoStripWS.setWhitespaceStripping(false);
-    }
-    
+    private final Configuration cfgStripWS = new 
TestConfigurationBuilder().build();
+    private final Configuration cfgNoStripWS = new 
TestConfigurationBuilder().whitespaceStripping(false).build();
+
     @Test
     public void test() throws IOException, TemplateException {
         assertOutput("<#ftl>text", "text", "text");

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/IncludeAndImportConfigurableLayersTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/IncludeAndImportConfigurableLayersTest.java
 
b/src/test/java/org/apache/freemarker/core/IncludeAndImportConfigurableLayersTest.java
index 7d37d95..738b4de 100644
--- 
a/src/test/java/org/apache/freemarker/core/IncludeAndImportConfigurableLayersTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/IncludeAndImportConfigurableLayersTest.java
@@ -24,20 +24,26 @@ import java.io.StringWriter;
 
 import 
org.apache.freemarker.core.templateresolver.ConditionalTemplateConfigurationFactory;
 import org.apache.freemarker.core.templateresolver.FileNameGlobMatcher;
-import org.apache.freemarker.test.TemplateTest;
+import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
-public class IncludeAndImportConfigurableLayersTest extends TemplateTest {
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
+public class IncludeAndImportConfigurableLayersTest {
 
     @Test
     public void test3LayerImportNoClashes() throws Exception {
-        Configuration cfg = getConfiguration();
-        cfg.addAutoImport("t1", "t1.ftl");
-
-        TemplateConfiguration.Builder tcb = new 
TemplateConfiguration.Builder();
-        tcb.addAutoImport("t2", "t2.ftl");
-        cfg.setTemplateConfigurations(
-                new ConditionalTemplateConfigurationFactory(new 
FileNameGlobMatcher("main.ftl"), tcb.build()));
+        TestConfigurationBuilder cfgB = createConfigurationBuilder()
+                .autoImports(ImmutableMap.of("t1", "t1.ftl"))
+                .templateConfigurations(
+                        new ConditionalTemplateConfigurationFactory(
+                                new FileNameGlobMatcher("main.ftl"),
+                                new TemplateConfiguration.Builder()
+                                        .autoImports(ImmutableMap.of("t2", 
"t2.ftl"))
+                                        .build()));
+        Configuration cfg = cfgB.build();
 
         {
             Template t = cfg.getTemplate("main.ftl");
@@ -68,8 +74,9 @@ public class IncludeAndImportConfigurableLayersTest extends 
TemplateTest {
             assertEquals("In main2: t1;t3;", sw.toString());
         }
         
-        cfg.removeAutoImport("t1");
-        
+        cfgB.removeAutoImport("t1");
+        cfg = cfgB.build();
+
         {
             Template t = cfg.getTemplate("main.ftl");
             StringWriter sw = new StringWriter();
@@ -83,15 +90,18 @@ public class IncludeAndImportConfigurableLayersTest extends 
TemplateTest {
     
     @Test
     public void test3LayerImportClashes() throws Exception {
-        Configuration cfg = getConfiguration();
-        cfg.addAutoImport("t1", "t1.ftl");
-        cfg.addAutoImport("t2", "t2.ftl");
-        cfg.addAutoImport("t3", "t3.ftl");
-
-        TemplateConfiguration.Builder tcb = new 
TemplateConfiguration.Builder();
-        tcb.addAutoImport("t2", "t2b.ftl");
-        cfg.setTemplateConfigurations(
-                new ConditionalTemplateConfigurationFactory(new 
FileNameGlobMatcher("main.ftl"), tcb.build()));
+        Configuration cfg = createConfigurationBuilder()
+                .autoImports(ImmutableMap.of(
+                        "t1", "t1.ftl",
+                        "t2", "t2.ftl",
+                        "t3", "t3.ftl"))
+                .templateConfigurations(
+                        new ConditionalTemplateConfigurationFactory(
+                                new FileNameGlobMatcher("main.ftl"),
+                                new TemplateConfiguration.Builder()
+                                        .autoImports(ImmutableMap.of("t2", 
"t2b.ftl"))
+                                        .build()))
+                .build();
 
         {
             Template t = cfg.getTemplate("main.ftl");
@@ -125,13 +135,16 @@ public class IncludeAndImportConfigurableLayersTest 
extends TemplateTest {
 
     @Test
     public void test3LayerIncludesNoClashes() throws Exception {
-        Configuration cfg = getConfiguration();
-        cfg.addAutoInclude("t1.ftl");
+        TestConfigurationBuilder cfgB = createConfigurationBuilder()
+                .autoIncludes(ImmutableList.of("t1.ftl"))
+                .templateConfigurations(
+                        new ConditionalTemplateConfigurationFactory(
+                                new FileNameGlobMatcher("main.ftl"),
+                                new TemplateConfiguration.Builder()
+                                        
.autoIncludes(ImmutableList.of("t2.ftl"))
+                                        .build()));
 
-        TemplateConfiguration.Builder tcb = new 
TemplateConfiguration.Builder();
-        tcb.addAutoInclude("t2.ftl");
-        cfg.setTemplateConfigurations(
-                new ConditionalTemplateConfigurationFactory(new 
FileNameGlobMatcher("main.ftl"), tcb.build()));
+        Configuration cfg = cfgB.build();
 
         {
             Template t = cfg.getTemplate("main.ftl");
@@ -162,8 +175,9 @@ public class IncludeAndImportConfigurableLayersTest extends 
TemplateTest {
             assertEquals("T1;T3;In main2: t1;t3;", sw.toString());
         }
         
-        cfg.removeAutoInclude("t1.ftl");
-        
+        cfgB.removeAutoInclude("t1.ftl");
+        cfg = cfgB.build();
+
         {
             Template t = cfg.getTemplate("main.ftl");
             StringWriter sw = new StringWriter();
@@ -177,15 +191,17 @@ public class IncludeAndImportConfigurableLayersTest 
extends TemplateTest {
 
     @Test
     public void test3LayerIncludeClashes() throws Exception {
-        Configuration cfg = getConfiguration();
-        cfg.addAutoInclude("t1.ftl");
-        cfg.addAutoInclude("t2.ftl");
-        cfg.addAutoInclude("t3.ftl");
-
-        TemplateConfiguration.Builder tcb = new 
TemplateConfiguration.Builder();
-        tcb.addAutoInclude("t2.ftl");
-        cfg.setTemplateConfigurations(
-                new ConditionalTemplateConfigurationFactory(new 
FileNameGlobMatcher("main.ftl"), tcb.build()));
+        Configuration cfg = createConfigurationBuilder()
+                .autoIncludes(ImmutableList.of(
+                        "t1.ftl",
+                        "t2.ftl",
+                        "t3.ftl"))
+                .templateConfigurations(new 
ConditionalTemplateConfigurationFactory(
+                        new FileNameGlobMatcher("main.ftl"),
+                        new TemplateConfiguration.Builder()
+                                .autoIncludes(ImmutableList.of("t2.ftl"))
+                                .build()))
+                .build();
 
         {
             Template t = cfg.getTemplate("main.ftl");
@@ -229,15 +245,15 @@ public class IncludeAndImportConfigurableLayersTest 
extends TemplateTest {
     
     @Test
     public void test3LayerIncludesClashes2() throws Exception {
-        Configuration cfg = getConfiguration();
-        cfg.addAutoInclude("t1.ftl");
-        cfg.addAutoInclude("t1.ftl");
-
-        TemplateConfiguration.Builder tcb = new 
TemplateConfiguration.Builder();
-        tcb.addAutoInclude("t2.ftl");
-        tcb.addAutoInclude("t2.ftl");
-        cfg.setTemplateConfigurations(
-                new ConditionalTemplateConfigurationFactory(new 
FileNameGlobMatcher("main.ftl"), tcb.build()));
+        Configuration cfg = createConfigurationBuilder()
+                .autoIncludes(ImmutableList.of("t1.ftl", "t1.ftl"))
+                .templateConfigurations(
+                        new ConditionalTemplateConfigurationFactory(
+                                new FileNameGlobMatcher("main.ftl"),
+                                new TemplateConfiguration.Builder()
+                                        
.autoIncludes(ImmutableList.of("t2.ftl", "t2.ftl"))
+                                        .build()))
+                .build();
 
         {
             Template t = cfg.getTemplate("main.ftl");
@@ -254,39 +270,45 @@ public class IncludeAndImportConfigurableLayersTest 
extends TemplateTest {
     }
     
     @Test
-    public void test3LayerLazyness() throws Exception {
+    public void test3LayerLaziness() throws Exception {
         for (Class<?> layer : new Class<?>[] { Configuration.class, 
Template.class, Environment.class }) {
-            test3LayerLazyness(layer, null, null, false, "t1;t2;");
-            test3LayerLazyness(layer, null, null, true, "t1;t2;");
-            test3LayerLazyness(layer, null, false, true, "t1;t2;");
-            test3LayerLazyness(layer, null, true, true, "t2;");
+            test3LayerLaziness(layer, null, null, false, "t1;t2;");
+            test3LayerLaziness(layer, null, null, true, "t1;t2;");
+            test3LayerLaziness(layer, null, false, true, "t1;t2;");
+            test3LayerLaziness(layer, null, true, true, "t2;");
             
-            test3LayerLazyness(layer, false, null, false, "t1;t2;");
-            test3LayerLazyness(layer, false, null, true, "t1;t2;");
-            test3LayerLazyness(layer, false, false, true, "t1;t2;");
-            test3LayerLazyness(layer, false, true, true, "t2;");
+            test3LayerLaziness(layer, false, null, false, "t1;t2;");
+            test3LayerLaziness(layer, false, null, true, "t1;t2;");
+            test3LayerLaziness(layer, false, false, true, "t1;t2;");
+            test3LayerLaziness(layer, false, true, true, "t2;");
 
-            test3LayerLazyness(layer, true, null, false, "");
-            test3LayerLazyness(layer, true, null, true, "");
-            test3LayerLazyness(layer, true, false, true, "t1;");
-            test3LayerLazyness(layer, true, true, true, "");
+            test3LayerLaziness(layer, true, null, false, "");
+            test3LayerLaziness(layer, true, null, true, "");
+            test3LayerLaziness(layer, true, false, true, "t1;");
+            test3LayerLaziness(layer, true, true, true, "");
         }
     }
     
-    private void test3LayerLazyness(
+    private void test3LayerLaziness(
             Class<?> layer,
             Boolean lazyImports,
             Boolean lazyAutoImports, boolean setLazyAutoImports,
             String expectedOutput)
             throws Exception {
-        dropConfiguration();
-        Configuration cfg = getConfiguration();
-        cfg.addAutoImport("t1", "t1.ftl");
+        Configuration cfg;
+        {
+            TestConfigurationBuilder cfgB = createConfigurationBuilder()
+                    .autoImports(ImmutableMap.of("t1", "t1.ftl"));
+            if (layer == Configuration.class) {
+                setLazinessOfConfigurable(cfgB, lazyImports, lazyAutoImports, 
setLazyAutoImports);
+            }
+            cfg = cfgB.build();
+        }
 
         TemplateConfiguration tc;
         if (layer == Template.class) {
             TemplateConfiguration.Builder tcb = new 
TemplateConfiguration.Builder();
-            setLazynessOfConfigurable(tcb, lazyImports, lazyAutoImports, 
setLazyAutoImports);
+            setLazinessOfConfigurable(tcb, lazyImports, lazyAutoImports, 
setLazyAutoImports);
             tc = tcb.build();
         } else {
             tc = null;
@@ -294,21 +316,17 @@ public class IncludeAndImportConfigurableLayersTest 
extends TemplateTest {
 
         Template t = new Template(null, "<#import 't2.ftl' as t2>${loaded!}", 
cfg, tc);
         StringWriter sw = new StringWriter();
-        Environment env = t.createProcessingEnvironment(null, sw);
 
-        if (layer == Configuration.class) {
-            setLazynessOfConfigurable(cfg, lazyImports, lazyAutoImports, 
setLazyAutoImports);
-        } else if (layer == Environment.class) {
-            setLazynessOfConfigurable(env, lazyImports, lazyAutoImports, 
setLazyAutoImports);
-        } else if (layer != Template.class) {
-            throw new IllegalArgumentException();
+        Environment env = t.createProcessingEnvironment(null, sw);
+        if (layer == Environment.class) {
+            setLazinessOfConfigurable(env, lazyImports, lazyAutoImports, 
setLazyAutoImports);
         }
 
         env.process();
         assertEquals(expectedOutput, sw.toString());
     }
 
-    private void setLazynessOfConfigurable(
+    private void setLazinessOfConfigurable(
             MutableProcessingConfiguration<?> cfg,
             Boolean lazyImports, Boolean lazyAutoImports, boolean 
setLazyAutoImports) {
         if (lazyImports != null) {
@@ -319,21 +337,18 @@ public class IncludeAndImportConfigurableLayersTest 
extends TemplateTest {
         }
     }
     
-    @Override
-    protected Configuration createConfiguration() throws Exception {
-        return new Configuration(Configuration.VERSION_3_0_0);
-    }
+    private TestConfigurationBuilder createConfigurationBuilder() {
+        StringTemplateLoader loader = new StringTemplateLoader();
+        loader.putTemplate("main.ftl", "In main: ${loaded}");
+        loader.putTemplate("main2.ftl", "In main2: ${loaded}");
+        loader.putTemplate("t1.ftl", "<#global loaded = (loaded!) + 
't1;'>T1;");
+        loader.putTemplate("t2.ftl", "<#global loaded = (loaded!) + 
't2;'>T2;");
+        loader.putTemplate("t3.ftl", "<#global loaded = (loaded!) + 
't3;'>T3;");
+        loader.putTemplate("t1b.ftl", "<#global loaded = (loaded!) + 
't1b;'>T1b;");
+        loader.putTemplate("t2b.ftl", "<#global loaded = (loaded!) + 
't2b;'>T2b;");
+        loader.putTemplate("t3b.ftl", "<#global loaded = (loaded!) + 
't3b;'>T3b;");
 
-    @Override
-    protected void addCommonTemplates() {
-        addTemplate("main.ftl", "In main: ${loaded}");
-        addTemplate("main2.ftl", "In main2: ${loaded}");
-        addTemplate("t1.ftl", "<#global loaded = (loaded!) + 't1;'>T1;");
-        addTemplate("t2.ftl", "<#global loaded = (loaded!) + 't2;'>T2;");
-        addTemplate("t3.ftl", "<#global loaded = (loaded!) + 't3;'>T3;");
-        addTemplate("t1b.ftl", "<#global loaded = (loaded!) + 't1b;'>T1b;");
-        addTemplate("t2b.ftl", "<#global loaded = (loaded!) + 't2b;'>T2b;");
-        addTemplate("t3b.ftl", "<#global loaded = (loaded!) + 't3b;'>T3b;");
+        return new TestConfigurationBuilder().templateLoader(loader);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/IncludeAndImportTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/freemarker/core/IncludeAndImportTest.java 
b/src/test/java/org/apache/freemarker/core/IncludeAndImportTest.java
index d35003d..fa767ff 100644
--- a/src/test/java/org/apache/freemarker/core/IncludeAndImportTest.java
+++ b/src/test/java/org/apache/freemarker/core/IncludeAndImportTest.java
@@ -29,14 +29,17 @@ import 
org.apache.freemarker.core.Environment.LazilyInitializedNamespace;
 import org.apache.freemarker.core.Environment.Namespace;
 import org.apache.freemarker.core.model.WrappingTemplateModel;
 import org.apache.freemarker.test.TemplateTest;
-import org.junit.Before;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+
 @SuppressWarnings("boxing")
 public class IncludeAndImportTest extends TemplateTest {
 
-    @Before
-    public void setup() {
+    @Override
+    protected void addCommonTemplates() {
         addTemplate("inc1.ftl", "[inc1]<#global inc1Cnt = (inc1Cnt!0) + 
1><#global history = (history!) + 'I'>");
         addTemplate("inc2.ftl", "[inc2]");
         addTemplate("inc3.ftl", "[inc3]");
@@ -90,10 +93,15 @@ public class IncludeAndImportTest extends TemplateTest {
      */
     @Test
     public void autoIncludeAndAutoImport() throws IOException, 
TemplateException {
-        getConfiguration().addAutoInclude("inc1.ftl");
-        getConfiguration().addAutoInclude("inc2.ftl");
-        getConfiguration().addAutoImport("lib1", "lib1.ftl");
-        getConfiguration().addAutoImport("lib2", "lib2CallsLib1.ftl");
+        setConfiguration(new TestConfigurationBuilder()
+                .autoImports(ImmutableMap.of(
+                        "lib1", "lib1.ftl",
+                        "lib2", "lib2CallsLib1.ftl"
+                ))
+                .autoIncludes(ImmutableList.of(
+                        "inc1.ftl",
+                        "inc2.ftl"))
+                .build());
         assertOutput(
                 "<#include 'inc3.ftl'>[main] ${inc1Cnt}, ${history}, 
<@lib1.m/>, <@lib2.m/>",
                 "[inc1][inc2][inc3][main] 1, L1L2I, In lib1, In lib2 (In 
lib1)");
@@ -130,7 +138,7 @@ public class IncludeAndImportTest extends TemplateTest {
         
         assertOutput(ftl, "In lib2, In lib1; L1L2L3");
         
-        getConfiguration().setLazyImports(true);
+        setConfiguration(new 
TestConfigurationBuilder().lazyImports(true).build());
         assertOutput(ftl, "In lib2, In lib1; L2L1");
         
         assertOutput(ftlImports + "<@l3.m/>, " + ftlCalls, "In lib3 (In lib1), 
In lib2, In lib1; L3L1L2");
@@ -138,7 +146,7 @@ public class IncludeAndImportTest extends TemplateTest {
 
     @Test
     public void lazyImportAndLocale() throws IOException, TemplateException {
-        getConfiguration().setLazyImports(true);
+        setConfiguration(new 
TestConfigurationBuilder().lazyImports(true).build());
         assertOutput("<#setting locale = 'de_DE'><#import 'lib.ftl' as lib>"
                 + "[${history!}] "
                 + "<#setting locale = 'en'>"
@@ -148,47 +156,59 @@ public class IncludeAndImportTest extends TemplateTest {
 
     @Test
     public void lazyAutoImportSettings() throws IOException, TemplateException 
{
-        Configuration cfg = getConfiguration();
-        cfg.addAutoImport("l1", "lib1.ftl");
-        cfg.addAutoImport("l2", "lib2.ftl");
-        cfg.addAutoImport("l3", "lib3.ftl");
-        
+        TestConfigurationBuilder cfgB = new TestConfigurationBuilder()
+                .autoImports(ImmutableMap.of(
+                        "l1", "lib1.ftl",
+                        "l2", "lib2.ftl",
+                        "l3", "lib3.ftl"
+                ));
+
         String ftl = "<@l2.m/>, <@l1.m/>; ${history}";
         String expectedEagerOutput = "In lib2, In lib1; L1L2L3";
         String expecedLazyOutput = "In lib2, In lib1; L2L1";
-        
+
+        setConfiguration(cfgB.build());
         assertOutput(ftl, expectedEagerOutput);
-        cfg.setLazyImports(true);
+        cfgB.setLazyImports(true);
+        setConfiguration(cfgB.build());
         assertOutput(ftl, expecedLazyOutput);
-        cfg.setLazyImports(false);
+        cfgB.setLazyImports(false);
+        setConfiguration(cfgB.build());
         assertOutput(ftl, expectedEagerOutput);
-        cfg.setLazyAutoImports(true);
+        cfgB.setLazyAutoImports(true);
+        setConfiguration(cfgB.build());
         assertOutput(ftl, expecedLazyOutput);
-        cfg.setLazyAutoImports(null);
+        cfgB.setLazyAutoImports(null);
+        setConfiguration(cfgB.build());
         assertOutput(ftl, expectedEagerOutput);
-        cfg.setLazyImports(true);
-        cfg.setLazyAutoImports(false);
+        cfgB.setLazyImports(true);
+        cfgB.setLazyAutoImports(false);
+        setConfiguration(cfgB.build());
         assertOutput(ftl, expectedEagerOutput);
     }
     
     @Test
     public void lazyAutoImportMixedWithManualImport() throws IOException, 
TemplateException {
-        Configuration cfg = getConfiguration();
-        cfg.addAutoImport("l1", "lib1.ftl");
-        cfg.addAutoImport("l2", "/./lib2.ftl");
-        cfg.addAutoImport("l3", "lib3.ftl");
-        cfg.setLazyAutoImports(true);
+        TestConfigurationBuilder cfgB = new TestConfigurationBuilder()
+                .autoImports(ImmutableMap.of(
+                        "l1", "lib1.ftl",
+                        "l2", "/./lib2.ftl",
+                        "l3", "lib3.ftl"))
+                .lazyAutoImports(true);
 
         String ftl = "<@l2.m/>, <@l1.m/>; ${history}";
         String expectOutputWithoutHistory = "In lib2, In lib1; ";
         String expecedOutput = expectOutputWithoutHistory + "L2L1";
-        
+
+        setConfiguration(cfgB.build());
         assertOutput(ftl, expecedOutput);
         assertOutput("<#import 'lib1.ftl' as l1>" + ftl, 
expectOutputWithoutHistory + "L1L2");
         assertOutput("<#import './x/../lib1.ftl' as l1>" + ftl, 
expectOutputWithoutHistory + "L1L2");
         assertOutput("<#import 'lib2.ftl' as l2>" + ftl, expecedOutput);
         assertOutput("<#import 'lib3.ftl' as l3>" + ftl, 
expectOutputWithoutHistory + "L3L2L1");
-        cfg.setLazyImports(true);
+
+        cfgB.setLazyImports(true);
+        setConfiguration(cfgB.build());
         assertOutput("<#import 'lib1.ftl' as l1>" + ftl, expecedOutput);
         assertOutput("<#import './x/../lib1.ftl' as l1>" + ftl, expecedOutput);
         assertOutput("<#import 'lib2.ftl' as l2>" + ftl, expecedOutput);
@@ -197,12 +217,14 @@ public class IncludeAndImportTest extends TemplateTest {
 
     @Test
     public void lazyImportErrors() throws IOException, TemplateException {
-        Configuration cfg = getConfiguration();
-        cfg.setLazyImports(true);
-        
+        TestConfigurationBuilder cfgB = new TestConfigurationBuilder();
+        cfgB.setLazyImports(true);
+
+        setConfiguration(cfgB.build());
         assertOutput("<#import 'noSuchTemplate.ftl' as wrong>x", "x");
         
-        cfg.addAutoImport("wrong", "noSuchTemplate.ftl");
+        cfgB.addAutoImport("wrong", "noSuchTemplate.ftl");
+        setConfiguration(cfgB.build());
         assertOutput("x", "x");
 
         try {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/IncudeFromNamelessTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/IncudeFromNamelessTest.java 
b/src/test/java/org/apache/freemarker/core/IncudeFromNamelessTest.java
index b9848a5..f4908b8 100644
--- a/src/test/java/org/apache/freemarker/core/IncudeFromNamelessTest.java
+++ b/src/test/java/org/apache/freemarker/core/IncudeFromNamelessTest.java
@@ -24,6 +24,7 @@ import java.io.StringReader;
 import java.io.StringWriter;
 
 import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 
 import junit.framework.TestCase;
 
@@ -34,13 +35,13 @@ public class IncudeFromNamelessTest extends TestCase {
     }
     
     public void test() throws IOException, TemplateException {
-        Configuration cfg = new Configuration();
-        StringTemplateLoader tl = new StringTemplateLoader();
-        tl.putTemplate("i.ftl", "[i]");
-        tl.putTemplate("sub/i.ftl", "[sub/i]");
-        tl.putTemplate("import.ftl", "<#assign x = 1>");
-        cfg.setTemplateLoader(tl);
-        
+        StringTemplateLoader loader = new StringTemplateLoader();
+        loader.putTemplate("i.ftl", "[i]");
+        loader.putTemplate("sub/i.ftl", "[sub/i]");
+        loader.putTemplate("import.ftl", "<#assign x = 1>");
+
+        Configuration cfg = new 
TestConfigurationBuilder().templateLoader(loader).build();
+
         Template t = new Template(null, new StringReader(
                     "<#include 'i.ftl'>\n"
                     + "<#include '/i.ftl'>\n"

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/InterpretAndEvalTemplateNameTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/InterpretAndEvalTemplateNameTest.java
 
b/src/test/java/org/apache/freemarker/core/InterpretAndEvalTemplateNameTest.java
index 0d5e20b..ff5897f 100644
--- 
a/src/test/java/org/apache/freemarker/core/InterpretAndEvalTemplateNameTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/InterpretAndEvalTemplateNameTest.java
@@ -22,6 +22,7 @@ import java.io.IOException;
 
 import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
 import org.apache.freemarker.test.TemplateTest;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 /**
@@ -48,8 +49,8 @@ public class InterpretAndEvalTemplateNameTest extends 
TemplateTest {
                     + "i{<@[r'" + getTemplateNames + " {<#include 
\"a.ftl\">','named_interpreted']?interpret />}}");
             tl.putTemplate("sub/a.ftl", "In sub/a.ftl, " + getTemplateNames);
             tl.putTemplate("a.ftl", "In a.ftl");
-            
-            getConfiguration().setTemplateLoader(tl);
+
+            setConfiguration(new 
TestConfigurationBuilder().templateLoader(tl).build());
             
             assertOutputForNamed("main.ftl",
                     "c=main.ftl, m=main.ftl "

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java 
b/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
index cd0a912..2d061d7 100644
--- 
a/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/InterpretSettingInheritanceTest.java
@@ -21,6 +21,7 @@ package org.apache.freemarker.core;
 import java.io.IOException;
 
 import org.apache.freemarker.test.TemplateTest;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 /**
@@ -40,21 +41,25 @@ public class InterpretSettingInheritanceTest  extends 
TemplateTest {
 
     @Test
     public void tagSyntaxTest() throws IOException, TemplateException {
-        Configuration cfg = getConfiguration();
-        
-        cfg.setTagSyntax(Configuration.ANGLE_BRACKET_TAG_SYNTAX);
+        setConfiguration(new TestConfigurationBuilder()
+                .tagSyntax(ParsingConfiguration.ANGLE_BRACKET_TAG_SYNTAX)
+                .build());
         assertOutput(FTL_S_A_S, OUT_A_S_WHEN_SYNTAX_IS_A);
         assertOutput(FTL_S_S_A, OUT_S_A_WHEN_SYNTAX_IS_A);
         assertOutput(FTL_A_A_S, OUT_A_S_WHEN_SYNTAX_IS_A);
         assertOutput(FTL_A_S_A, OUT_S_A_WHEN_SYNTAX_IS_A);
-        
-        cfg.setTagSyntax(Configuration.SQUARE_BRACKET_TAG_SYNTAX);
+
+        setConfiguration(new TestConfigurationBuilder()
+                .tagSyntax(ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX)
+                .build());
         assertOutput(FTL_S_A_S, OUT_A_S_WHEN_SYNTAX_IS_S);
         assertOutput(FTL_S_S_A, OUT_S_A_WHEN_SYNTAX_IS_S);
         assertOutput(FTL_A_A_S, OUT_A_S_WHEN_SYNTAX_IS_S);
         assertOutput(FTL_A_S_A, OUT_S_A_WHEN_SYNTAX_IS_S);
-        
-        cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX);
+
+        setConfiguration(new TestConfigurationBuilder()
+                .tagSyntax(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX)
+                .build());
         assertOutput(FTL_S_A_S, OUT_A_S_WHEN_SYNTAX_IS_A);
         assertOutput(FTL_S_S_A, OUT_S_A_WHEN_SYNTAX_IS_S);
         assertOutput(FTL_A_A_S, OUT_A_S_WHEN_SYNTAX_IS_A);
@@ -65,13 +70,17 @@ public class InterpretSettingInheritanceTest  extends 
TemplateTest {
     @Test
     public void whitespaceStrippingTest() throws IOException, 
TemplateException {
         Configuration cfg = getConfiguration();
-        
-        cfg.setWhitespaceStripping(true);
+
+        setConfiguration(new TestConfigurationBuilder()
+                .whitespaceStripping(true)
+                .build());
         assertOutput("<#assign x = 1>\nX<@'<#assign x = 1>\\nY'?interpret />", 
"XY");
         assertOutput("<#ftl stripWhitespace=false><#assign x = 
1>\nX<@'<#assign x = 1>\\nY'?interpret />", "\nXY");
         assertOutput("<#assign x = 1>\nX<@'<#ftl 
stripWhitespace=false><#assign x = 1>\\nY'?interpret />", "X\nY");
-        
-        cfg.setWhitespaceStripping(false);
+
+        setConfiguration(new TestConfigurationBuilder()
+                .whitespaceStripping(false)
+                .build());
         assertOutput("<#assign x = 1>\nX<@'<#assign x = 1>\\nY'?interpret />", 
"\nX\nY");
         assertOutput("<#ftl stripWhitespace=true><#assign x = 1>\nX<@'<#assign 
x = 1>\\nY'?interpret />", "X\nY");
         assertOutput("<#assign x = 1>\nX<@'<#ftl stripWhitespace=true><#assign 
x = 1>\\nY'?interpret />", "\nXY");
@@ -79,13 +88,15 @@ public class InterpretSettingInheritanceTest  extends 
TemplateTest {
 
     @Test
     public void evalTest() throws IOException, TemplateException {
-        Configuration cfg = getConfiguration();
-        
-        cfg.setTagSyntax(Configuration.ANGLE_BRACKET_TAG_SYNTAX);
+        setConfiguration(new TestConfigurationBuilder()
+                .tagSyntax(ParsingConfiguration.ANGLE_BRACKET_TAG_SYNTAX)
+                .build());
         assertOutput("<@'\"[#if true]s[/#if]<#if 
true>a</#if>\"?interpret'?eval />", OUT_S_A_WHEN_SYNTAX_IS_A);
         assertOutput("[#ftl][@'\"[#if true]s[/#if]<#if 
true>a</#if>\"?interpret'?eval /]", OUT_S_A_WHEN_SYNTAX_IS_A);
-        
-        cfg.setTagSyntax(Configuration.SQUARE_BRACKET_TAG_SYNTAX);
+
+        setConfiguration(new TestConfigurationBuilder()
+                .tagSyntax(ParsingConfiguration.SQUARE_BRACKET_TAG_SYNTAX)
+                .build());
         assertOutput("[@'\"[#if true]s[/#if]<#if 
true>a</#if>\"?interpret'?eval /]", OUT_S_A_WHEN_SYNTAX_IS_S);
         assertOutput("<#ftl><@'\"[#if true]s[/#if]<#if 
true>a</#if>\"?interpret'?eval />", OUT_S_A_WHEN_SYNTAX_IS_S);
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/JavaCCExceptionAsEOFFixTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/JavaCCExceptionAsEOFFixTest.java 
b/src/test/java/org/apache/freemarker/core/JavaCCExceptionAsEOFFixTest.java
index 0a74f96..0fa3f79 100644
--- a/src/test/java/org/apache/freemarker/core/JavaCCExceptionAsEOFFixTest.java
+++ b/src/test/java/org/apache/freemarker/core/JavaCCExceptionAsEOFFixTest.java
@@ -23,6 +23,7 @@ import static org.junit.Assert.*;
 import java.io.IOException;
 import java.io.Reader;
 
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -89,7 +90,7 @@ public class JavaCCExceptionAsEOFFixTest {
     @Test
     public void testIOException() throws IOException {
         try {
-            new Template(null, new FailingReader(new IOException("test")), new 
Configuration());
+            new Template(null, new FailingReader(new IOException("test")), new 
TestConfigurationBuilder().build());
             fail();
         } catch (IOException e) {
             assertEquals("test", e.getMessage());
@@ -99,7 +100,7 @@ public class JavaCCExceptionAsEOFFixTest {
     @Test
     public void testRuntimeException() throws IOException {
         try {
-            new Template(null, new FailingReader(new 
NullPointerException("test")), new Configuration());
+            new Template(null, new FailingReader(new 
NullPointerException("test")), new TestConfigurationBuilder().build());
             fail();
         } catch (NullPointerException e) {
             assertEquals("test", e.getMessage());
@@ -109,7 +110,7 @@ public class JavaCCExceptionAsEOFFixTest {
     @Test
     public void testError() throws IOException {
         try {
-            new Template(null, new FailingReader(new 
OutOfMemoryError("test")), new Configuration());
+            new Template(null, new FailingReader(new 
OutOfMemoryError("test")), new TestConfigurationBuilder().build());
             fail();
         } catch (OutOfMemoryError e) {
             assertEquals("test", e.getMessage());
@@ -118,7 +119,7 @@ public class JavaCCExceptionAsEOFFixTest {
 
     @Test
     public void testNoException() throws IOException {
-        Template t = new Template(null, new FailingReader(null), new 
Configuration());
+        Template t = new Template(null, new FailingReader(null), new 
TestConfigurationBuilder().build());
         assertEquals("abc", t.toString());
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java 
b/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
index 438ee28..1903e05 100644
--- a/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
+++ b/src/test/java/org/apache/freemarker/core/MiscErrorMessagesTest.java
@@ -21,6 +21,7 @@ package org.apache.freemarker.core;
 
 import 
org.apache.freemarker.core.templateresolver.impl.DefaultTemplateNameFormat;
 import org.apache.freemarker.test.TemplateTest;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 public class MiscErrorMessagesTest extends TemplateTest {
@@ -32,8 +33,8 @@ public class MiscErrorMessagesTest extends TemplateTest {
     
     @Test
     public void wrongTemplateNameFormat() {
-        
getConfiguration().setTemplateNameFormat(DefaultTemplateNameFormat.INSTANCE);
-        
+        setConfiguration(new 
TestConfigurationBuilder().templateNameFormat(DefaultTemplateNameFormat.INSTANCE).build());
+
         assertErrorContains("<#include 'foo:/bar:baaz'>", "Malformed template 
name", "':'");
         assertErrorContains("<#include '../baaz'>", "Malformed template name", 
"root");
         assertErrorContains("<#include '\u0000'>", "Malformed template name", 
"\\u0000");

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/MistakenlyPublicImportAPIsTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/MistakenlyPublicImportAPIsTest.java 
b/src/test/java/org/apache/freemarker/core/MistakenlyPublicImportAPIsTest.java
index c5a025f..5fcee97 100644
--- 
a/src/test/java/org/apache/freemarker/core/MistakenlyPublicImportAPIsTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/MistakenlyPublicImportAPIsTest.java
@@ -30,6 +30,7 @@ import org.apache.freemarker.core.Environment.Namespace;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.templateresolver.impl.StringTemplateLoader;
 import org.apache.freemarker.core.util._NullWriter;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 /**
@@ -39,11 +40,11 @@ public class MistakenlyPublicImportAPIsTest {
 
     @Test
     public void testImportCopying() throws IOException, TemplateException {
-        Configuration cfg = new Configuration(Configuration.VERSION_3_0_0);
         StringTemplateLoader tl = new StringTemplateLoader();
         tl.putTemplate("imp1", "<#macro m>1</#macro>");
         tl.putTemplate("imp2", "<#assign x = 2><#macro m>${x}</#macro>");
-        cfg.setTemplateLoader(tl);
+
+        Configuration cfg = new 
TestConfigurationBuilder().templateLoader(tl).build();
         
         Template t1 = new Template(null, "<#import 'imp1' as i1><#import 
'imp2' as i2>", cfg);
         List<ASTDirImport> imports = t1.getImports();

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/MistakenlyPublicMacroAPIsTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/MistakenlyPublicMacroAPIsTest.java 
b/src/test/java/org/apache/freemarker/core/MistakenlyPublicMacroAPIsTest.java
index f1eb7bd..9c87e61 100644
--- 
a/src/test/java/org/apache/freemarker/core/MistakenlyPublicMacroAPIsTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/MistakenlyPublicMacroAPIsTest.java
@@ -28,6 +28,7 @@ import java.util.Map;
 
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.util._NullWriter;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 import org.junit.Test;
 
 /**
@@ -35,7 +36,7 @@ import org.junit.Test;
  */
 public class MistakenlyPublicMacroAPIsTest {
 
-    private final Configuration cfg = new 
Configuration(Configuration.VERSION_3_0_0);
+    private final Configuration cfg = new TestConfigurationBuilder().build();
     
     /**
      * Getting the macros from one template, and adding them to another.

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
 
b/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
index 40dfe13..d865deb 100644
--- 
a/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/NewBiObjectWrapperRestrictionTest.java
@@ -22,16 +22,15 @@ package org.apache.freemarker.core;
 import java.io.IOException;
 
 import org.apache.freemarker.test.TemplateTest;
-import org.apache.freemarker.test.util.FullyCustomObjectWrapper;
+import org.apache.freemarker.test.TestConfigurationBuilder;
+import org.apache.freemarker.test.util.EntirelyCustomObjectWrapper;
 import org.junit.Test;
 
 public class NewBiObjectWrapperRestrictionTest extends TemplateTest {
 
     @Override
-    protected Configuration createConfiguration() throws Exception {
-        Configuration cfg = super.createConfiguration();
-        cfg.setObjectWrapper(new FullyCustomObjectWrapper());
-        return cfg;
+    protected Configuration createDefaultConfiguration() throws Exception {
+        return new TestConfigurationBuilder().objectWrapper(new 
EntirelyCustomObjectWrapper()).build();
     }
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java 
b/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
index 73e03f6..49534fa 100644
--- a/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
+++ b/src/test/java/org/apache/freemarker/core/ObjectBuilderSettingsTest.java
@@ -356,7 +356,7 @@ public class ObjectBuilderSettingsTest {
 
     @Test
     public void configurationPropertiesTest() throws Exception {
-        final Configuration cfg = new 
Configuration(Configuration.getVersion());
+        final Configuration.Builder cfgB = new 
Configuration.Builder(Configuration.getVersion());
         
         {
             Properties props = new Properties();
@@ -366,23 +366,23 @@ public class ObjectBuilderSettingsTest {
                     
"org.apache.freemarker.core.ObjectBuilderSettingsTest$DummyArithmeticEngine");
             
props.setProperty(MutableProcessingConfiguration.TEMPLATE_EXCEPTION_HANDLER_KEY,
                     
"org.apache.freemarker.core.ObjectBuilderSettingsTest$DummyTemplateExceptionHandler");
-            props.setProperty(Configuration.CACHE_STORAGE_KEY,
+            
props.setProperty(Configuration.ExtendableBuilder.CACHE_STORAGE_KEY,
                     
"org.apache.freemarker.core.ObjectBuilderSettingsTest$DummyCacheStorage()");
             
props.setProperty(MutableProcessingConfiguration.NEW_BUILTIN_CLASS_RESOLVER_KEY,
                     
"org.apache.freemarker.core.ObjectBuilderSettingsTest$DummyNewBuiltinClassResolver()");
-            props.setProperty(Configuration.SOURCE_ENCODING_KEY, "utf-8");
-            props.setProperty(Configuration.TEMPLATE_LOADER_KEY,
+            
props.setProperty(Configuration.ExtendableBuilder.SOURCE_ENCODING_KEY, "utf-8");
+            
props.setProperty(Configuration.ExtendableBuilder.TEMPLATE_LOADER_KEY,
                     
"org.apache.freemarker.core.ObjectBuilderSettingsTest$DummyTemplateLoader()");
-            cfg.setSettings(props);
-            assertEquals(DefaultObjectWrapper.class, 
cfg.getObjectWrapper().getClass());
+            cfgB.setSettings(props);
+            assertEquals(DefaultObjectWrapper.class, 
cfgB.getObjectWrapper().getClass());
             assertEquals(
-                    Configuration.VERSION_3_0_0, ((DefaultObjectWrapper) 
cfg.getObjectWrapper()).getIncompatibleImprovements());
-            assertEquals(DummyArithmeticEngine.class, 
cfg.getArithmeticEngine().getClass());
-            assertEquals(DummyTemplateExceptionHandler.class, 
cfg.getTemplateExceptionHandler().getClass());
-            assertEquals(DummyCacheStorage.class, 
cfg.getCacheStorage().getClass());
-            assertEquals(DummyNewBuiltinClassResolver.class, 
cfg.getNewBuiltinClassResolver().getClass());
-            assertEquals(DummyTemplateLoader.class, 
cfg.getTemplateLoader().getClass());
-            assertEquals(StandardCharsets.UTF_8, cfg.getSourceEncoding());
+                    Configuration.VERSION_3_0_0, ((DefaultObjectWrapper) 
cfgB.getObjectWrapper()).getIncompatibleImprovements());
+            assertEquals(DummyArithmeticEngine.class, 
cfgB.getArithmeticEngine().getClass());
+            assertEquals(DummyTemplateExceptionHandler.class, 
cfgB.getTemplateExceptionHandler().getClass());
+            assertEquals(DummyCacheStorage.class, 
cfgB.getCacheStorage().getClass());
+            assertEquals(DummyNewBuiltinClassResolver.class, 
cfgB.getNewBuiltinClassResolver().getClass());
+            assertEquals(DummyTemplateLoader.class, 
cfgB.getTemplateLoader().getClass());
+            assertEquals(StandardCharsets.UTF_8, cfgB.getSourceEncoding());
         }
         
         {
@@ -392,19 +392,19 @@ public class ObjectBuilderSettingsTest {
                     
"org.apache.freemarker.core.ObjectBuilderSettingsTest$DummyArithmeticEngine(x = 
1)");
             
props.setProperty(MutableProcessingConfiguration.TEMPLATE_EXCEPTION_HANDLER_KEY,
                     
"org.apache.freemarker.core.ObjectBuilderSettingsTest$DummyTemplateExceptionHandler(x
 = 1)");
-            props.setProperty(Configuration.CACHE_STORAGE_KEY,
+            
props.setProperty(Configuration.ExtendableBuilder.CACHE_STORAGE_KEY,
                     "soft: 500, strong: 100");
             
props.setProperty(MutableProcessingConfiguration.NEW_BUILTIN_CLASS_RESOLVER_KEY,
                     "allows_nothing");
-            cfg.setSettings(props);
-            assertEquals(DefaultObjectWrapper.class, 
cfg.getObjectWrapper().getClass());
-            assertEquals(1, ((DummyArithmeticEngine) 
cfg.getArithmeticEngine()).getX());
-            assertEquals(1, ((DummyTemplateExceptionHandler) 
cfg.getTemplateExceptionHandler()).getX());
+            cfgB.setSettings(props);
+            assertEquals(DefaultObjectWrapper.class, 
cfgB.getObjectWrapper().getClass());
+            assertEquals(1, ((DummyArithmeticEngine) 
cfgB.getArithmeticEngine()).getX());
+            assertEquals(1, ((DummyTemplateExceptionHandler) 
cfgB.getTemplateExceptionHandler()).getX());
             assertEquals(Configuration.VERSION_3_0_0,
-                    ((DefaultObjectWrapper) 
cfg.getObjectWrapper()).getIncompatibleImprovements());
-            assertEquals(500, ((MruCacheStorage) 
cfg.getCacheStorage()).getSoftSizeLimit());
-            assertEquals(TemplateClassResolver.ALLOWS_NOTHING_RESOLVER, 
cfg.getNewBuiltinClassResolver());
-            assertEquals(StandardCharsets.UTF_8, cfg.getSourceEncoding());
+                    ((DefaultObjectWrapper) 
cfgB.getObjectWrapper()).getIncompatibleImprovements());
+            assertEquals(500, ((MruCacheStorage) 
cfgB.getCacheStorage()).getSoftSizeLimit());
+            assertEquals(TemplateClassResolver.ALLOWS_NOTHING_RESOLVER, 
cfgB.getNewBuiltinClassResolver());
+            assertEquals(StandardCharsets.UTF_8, cfgB.getSourceEncoding());
         }
 
         {
@@ -412,22 +412,22 @@ public class ObjectBuilderSettingsTest {
             
props.setProperty(MutableProcessingConfiguration.OBJECT_WRAPPER_KEY, "Default");
             
props.setProperty(MutableProcessingConfiguration.ARITHMETIC_ENGINE_KEY, 
"bigdecimal");
             
props.setProperty(MutableProcessingConfiguration.TEMPLATE_EXCEPTION_HANDLER_KEY,
 "rethrow");
-            cfg.setSettings(props);
-            assertEquals(DefaultObjectWrapper.class, 
cfg.getObjectWrapper().getClass());
-            assertSame(BigDecimalArithmeticEngine.INSTANCE, 
cfg.getArithmeticEngine());
-            assertSame(TemplateExceptionHandler.RETHROW_HANDLER, 
cfg.getTemplateExceptionHandler());
+            cfgB.setSettings(props);
+            assertEquals(DefaultObjectWrapper.class, 
cfgB.getObjectWrapper().getClass());
+            assertSame(BigDecimalArithmeticEngine.INSTANCE, 
cfgB.getArithmeticEngine());
+            assertSame(TemplateExceptionHandler.RETHROW_HANDLER, 
cfgB.getTemplateExceptionHandler());
             assertEquals(Configuration.VERSION_3_0_0,
-                    ((DefaultObjectWrapper) 
cfg.getObjectWrapper()).getIncompatibleImprovements());
+                    ((DefaultObjectWrapper) 
cfgB.getObjectWrapper()).getIncompatibleImprovements());
         }
         
         {
             Properties props = new Properties();
             
props.setProperty(MutableProcessingConfiguration.OBJECT_WRAPPER_KEY, 
"DefaultObjectWrapper(3.0.0)");
-            cfg.setSettings(props);
-            assertEquals(DefaultObjectWrapper.class, 
cfg.getObjectWrapper().getClass());
+            cfgB.setSettings(props);
+            assertEquals(DefaultObjectWrapper.class, 
cfgB.getObjectWrapper().getClass());
             assertEquals(
                     Configuration.VERSION_3_0_0,
-                    ((DefaultObjectWrapper) 
cfg.getObjectWrapper()).getIncompatibleImprovements());
+                    ((DefaultObjectWrapper) 
cfgB.getObjectWrapper()).getIncompatibleImprovements());
         }
     }
     
@@ -911,7 +911,7 @@ public class ObjectBuilderSettingsTest {
         assertEqualsEvaled(123, 
"org.apache.freemarker.core.ObjectBuilderSettingsTest$TestStaticFields.CONST");
         
         // With shorthand class name:
-        assertEqualsEvaled(Configuration.AUTO_DETECT_TAG_SYNTAX, 
"Configuration.AUTO_DETECT_TAG_SYNTAX");
+        assertEqualsEvaled(ParsingConfiguration.AUTO_DETECT_TAG_SYNTAX, 
"Configuration.AUTO_DETECT_TAG_SYNTAX");
         
         try {
             _ObjectBuilderSettingEvaluator.eval(

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d61a45d/src/test/java/org/apache/freemarker/core/OptInTemplateClassResolverTest.java
----------------------------------------------------------------------
diff --git 
a/src/test/java/org/apache/freemarker/core/OptInTemplateClassResolverTest.java 
b/src/test/java/org/apache/freemarker/core/OptInTemplateClassResolverTest.java
index 569b4c0..06e863c 100644
--- 
a/src/test/java/org/apache/freemarker/core/OptInTemplateClassResolverTest.java
+++ 
b/src/test/java/org/apache/freemarker/core/OptInTemplateClassResolverTest.java
@@ -25,6 +25,7 @@ import java.util.List;
 import java.util.Set;
 
 import org.apache.freemarker.core.util.OptInTemplateClassResolver;
+import org.apache.freemarker.test.TestConfigurationBuilder;
 
 import junit.framework.AssertionFailedError;
 import junit.framework.TestCase;
@@ -51,10 +52,11 @@ public class OptInTemplateClassResolverTest extends 
TestCase {
     private OptInTemplateClassResolver resolver = new 
OptInTemplateClassResolver(
             ALLOWED_CLASSES, TRUSTED_TEMPLATES);
     
-    private Configuration dummyCfg = new Configuration();
-    private Template dummyTemp = Template.createPlainTextTemplate("foo.ftl", 
"", dummyCfg);
-    
+
     public void testOptIn() throws TemplateException {
+        Template dummyTemp = Template.createPlainTextTemplate("foo.ftl", "",
+                new TestConfigurationBuilder().build());
+
         assertEquals(String.class, resolver.resolve("java.lang.String", null, 
dummyTemp));
         assertEquals(Integer.class, resolver.resolve("java.lang.Integer", 
null, dummyTemp));
         try {
@@ -66,18 +68,20 @@ public class OptInTemplateClassResolverTest extends 
TestCase {
     }
 
     public void testTrusted() throws TemplateException {
+        Configuration cfg = new TestConfigurationBuilder().build();
+
         assertEquals(Long.class, resolver.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("lib/foo.ftl", "", 
dummyCfg)));
+                Template.createPlainTextTemplate("lib/foo.ftl", "", cfg)));
         assertEquals(String.class, resolver.resolve("java.lang.String", null,
-                Template.createPlainTextTemplate("lib/foo.ftl", "", 
dummyCfg)));
+                Template.createPlainTextTemplate("lib/foo.ftl", "", cfg)));
         assertEquals(Long.class, resolver.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("/lib/foo.ftl", "", 
dummyCfg)));
+                Template.createPlainTextTemplate("/lib/foo.ftl", "", cfg)));
         assertEquals(Long.class, resolver.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("include/foo.ftl", "", 
dummyCfg)));
+                Template.createPlainTextTemplate("include/foo.ftl", "", cfg)));
         assertEquals(Long.class, resolver.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("trusted.ftl", "", 
dummyCfg)));
+                Template.createPlainTextTemplate("trusted.ftl", "", cfg)));
         assertEquals(Long.class, resolver.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("/trusted.ftl", "", 
dummyCfg)));
+                Template.createPlainTextTemplate("/trusted.ftl", "", cfg)));
     }
 
     public void testCraftedTrusted() throws TemplateException {
@@ -112,7 +116,8 @@ public class OptInTemplateClassResolverTest extends 
TestCase {
     public void testTrusted_checkFails(String templateName) {
         try {
             resolver.resolve("java.lang.Long", null,
-                    Template.createPlainTextTemplate(templateName, "", 
dummyCfg));
+                    Template.createPlainTextTemplate(templateName, "",
+                            new TestConfigurationBuilder().build()));
             fail();
         } catch (TemplateException e) {
             // Expected
@@ -120,87 +125,106 @@ public class OptInTemplateClassResolverTest extends 
TestCase {
     }
     
     public void testSettingParser() throws Exception {
-        Configuration cfg = new Configuration(Configuration.VERSION_3_0_0);
-        
-        cfg.setSetting("new_builtin_class_resolver",
-                "trusted_templates: foo.ftl, \"lib/*\"");
-        TemplateClassResolver res = cfg.getNewBuiltinClassResolver();
-        assertEquals(String.class, res.resolve("java.lang.String", null,
-                Template.createPlainTextTemplate("foo.ftl", "", cfg)));
-        assertEquals(String.class, res.resolve("java.lang.String", null,
-                Template.createPlainTextTemplate("lib/bar.ftl", "", cfg)));
-        try {
-            res.resolve("java.lang.String", null,
-                    Template.createPlainTextTemplate("bar.ftl", "", cfg));
-            fail();
-        } catch (TemplateException e) {
-            // Expected
-        }
+        {
+            Configuration cfg = new TestConfigurationBuilder()
+                    .setting(
+                            "new_builtin_class_resolver",
+                            "trusted_templates: foo.ftl, \"lib/*\"")
+                    .build();
 
-        cfg.setSetting("new_builtin_class_resolver",
-                "allowed_classes: java.lang.String, java.lang.Integer");
-        res = cfg.getNewBuiltinClassResolver();
-        assertEquals(String.class, res.resolve("java.lang.String", null,
-                Template.createPlainTextTemplate("foo.ftl", "", cfg)));
-        assertEquals(Integer.class, res.resolve("java.lang.Integer", null,
-                Template.createPlainTextTemplate("foo.ftl", "", cfg)));
-        try {
-            res.resolve("java.lang.Long", null,
-                    Template.createPlainTextTemplate("foo.ftl", "", cfg));
-            fail();
-        } catch (TemplateException e) {
-            // good
+            TemplateClassResolver res = cfg.getNewBuiltinClassResolver();
+            assertEquals(String.class, res.resolve("java.lang.String", null,
+                    Template.createPlainTextTemplate("foo.ftl", "", cfg)));
+            assertEquals(String.class, res.resolve("java.lang.String", null,
+                    Template.createPlainTextTemplate("lib/bar.ftl", "", cfg)));
+            try {
+                res.resolve("java.lang.String", null,
+                        Template.createPlainTextTemplate("bar.ftl", "", cfg));
+                fail();
+            } catch (TemplateException e) {
+                // Expected
+            }
         }
 
-        cfg.setSetting("new_builtin_class_resolver",
-                "trusted_templates: foo.ftl, 'lib/*', " +
-                "allowed_classes: 'java.lang.String', java.lang.Integer");
-        res = cfg.getNewBuiltinClassResolver();
-        assertEquals(String.class, res.resolve("java.lang.String", null,
-                Template.createPlainTextTemplate("x.ftl", "", cfg)));
-        assertEquals(Integer.class, res.resolve("java.lang.Integer", null,
-                Template.createPlainTextTemplate("x.ftl", "", cfg)));
-        try {
-            res.resolve("java.lang.Long", null,
-                    Template.createPlainTextTemplate("x.ftl", "", cfg));
-            fail();
-        } catch (TemplateException e) {
-            // Expected
+        {
+            Configuration cfg = new TestConfigurationBuilder()
+                    .setting(
+                            "new_builtin_class_resolver",
+                            "allowed_classes: java.lang.String, 
java.lang.Integer")
+                    .build();
+
+            TemplateClassResolver res = cfg.getNewBuiltinClassResolver();
+            assertEquals(String.class, res.resolve("java.lang.String", null,
+                    Template.createPlainTextTemplate("foo.ftl", "", cfg)));
+            assertEquals(Integer.class, res.resolve("java.lang.Integer", null,
+                    Template.createPlainTextTemplate("foo.ftl", "", cfg)));
+            try {
+                res.resolve("java.lang.Long", null,
+                        Template.createPlainTextTemplate("foo.ftl", "", cfg));
+                fail();
+            } catch (TemplateException e) {
+                // good
+            }
         }
-        assertEquals(Long.class, res.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("foo.ftl", "", cfg)));
-        assertEquals(Long.class, res.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("lib/bar.ftl", "", cfg)));
-        try {
-            res.resolve("java.lang.Long", null,
-                    Template.createPlainTextTemplate("x.ftl", "", cfg));
-            fail();
-        } catch (TemplateException e) {
-            // Expected
+
+        {
+            Configuration cfg = new TestConfigurationBuilder()
+                    .setting(
+                            "new_builtin_class_resolver",
+                            "trusted_templates: foo.ftl, 'lib/*', 
allowed_classes: 'java.lang.String',"
+                            + " java.lang.Integer")
+                    .build();
+            TemplateClassResolver res = cfg.getNewBuiltinClassResolver();
+            assertEquals(String.class, res.resolve("java.lang.String", null,
+                    Template.createPlainTextTemplate("x.ftl", "", cfg)));
+            assertEquals(Integer.class, res.resolve("java.lang.Integer", null,
+                    Template.createPlainTextTemplate("x.ftl", "", cfg)));
+            try {
+                res.resolve("java.lang.Long", null,
+                        Template.createPlainTextTemplate("x.ftl", "", cfg));
+                fail();
+            } catch (TemplateException e) {
+                // Expected
+            }
+            assertEquals(Long.class, res.resolve("java.lang.Long", null,
+                    Template.createPlainTextTemplate("foo.ftl", "", cfg)));
+            assertEquals(Long.class, res.resolve("java.lang.Long", null,
+                    Template.createPlainTextTemplate("lib/bar.ftl", "", cfg)));
+            try {
+                res.resolve("java.lang.Long", null,
+                        Template.createPlainTextTemplate("x.ftl", "", cfg));
+                fail();
+            } catch (TemplateException e) {
+                // Expected
+            }
         }
         
         try {
-            cfg.setSetting("new_builtin_class_resolver", "wrong: foo");
+            new 
TestConfigurationBuilder().setSetting("new_builtin_class_resolver", "wrong: 
foo");
             fail();
         } catch (ConfigurationException e) {
             // Expected
         }
-        
-        cfg.setSetting("new_builtin_class_resolver",
-                "\"allowed_classes\"  :  java.lang.String  ,  " +
-                "'trusted_templates' :\"lib:*\"");
-        res = cfg.getNewBuiltinClassResolver();
-        assertEquals(String.class, res.resolve("java.lang.String", null,
-                Template.createPlainTextTemplate("x.ftl", "", cfg)));
-        try {
-            res.resolve("java.lang.Long", null,
-                    Template.createPlainTextTemplate("x.ftl", "", cfg));
-            fail();
-        } catch (TemplateException e) {
-            // Expected
+
+        {
+            Configuration cfg = new TestConfigurationBuilder()
+                    .setting(
+                            "new_builtin_class_resolver",
+                            "\"allowed_classes\"  :  java.lang.String  ,  
'trusted_templates' :\"lib:*\"")
+                    .build();
+            TemplateClassResolver res = cfg.getNewBuiltinClassResolver();
+            assertEquals(String.class, res.resolve("java.lang.String", null,
+                    Template.createPlainTextTemplate("x.ftl", "", cfg)));
+            try {
+                res.resolve("java.lang.Long", null,
+                        Template.createPlainTextTemplate("x.ftl", "", cfg));
+                fail();
+            } catch (TemplateException e) {
+                // Expected
+            }
+            assertEquals(Long.class, res.resolve("java.lang.Long", null,
+                    Template.createPlainTextTemplate("lib:bar.ftl", "", cfg)));
         }
-        assertEquals(Long.class, res.resolve("java.lang.Long", null,
-                Template.createPlainTextTemplate("lib:bar.ftl", "", cfg)));
     }
     
 }

Reply via email to